Skip to content
Snippets Groups Projects
Commit 76e4ee4a authored by iaibrys's avatar iaibrys
Browse files

Fix up verify and monitor; start “real” tests with minitest

Fixes #82
parent c250933e
No related branches found
No related tags found
No related merge requests found
Pipeline #300 passed
......@@ -21,3 +21,5 @@ gem 'selenium-webdriver'
gem 'pry'
gem 'colorize'
gem "minitest", "~> 5.11"
......@@ -69,6 +69,7 @@ DEPENDENCIES
colorize
dtu-auth2!
logger
minitest (~> 5.11)
pry
rake
selenium-webdriver
......
......@@ -17,15 +17,6 @@ do_enote_version = true
git_branch = `git symbolic-ref --short HEAD`.chomp
@container_prefix = "" # or dtuenote_
default_enabled_features = {
:redis => true,
:revproxy => true,
:sites => true,
:sharelatex => true,
:quiz => true,
:course_website => true,
:filemanager => true,
}
limits = {
:sharelatex => {
memory: "4g"
......@@ -34,15 +25,6 @@ limits = {
memory: "4g"
}
}
generate_cfg = File.join(config_root, 'enote.yaml')
if File.exist? generate_cfg
puts "loading config file #{generate_cfg}"
enabled_features = YAML::load_file(generate_cfg).symbolize_keys!
else
puts "writing config file #{generate_cfg}"
enabled_features = default_enabled_features
File.open(generate_cfg, 'w') {|f| f.write enabled_features.to_yaml }
end
def default_cert(prefix)
{
......@@ -106,7 +88,7 @@ end
ARGV.each do |arg|
m = /disable\:(.+)/.match arg
if m
enabled_features[m[1].to_sym] = false
@enabled_features[m[1].to_sym] = false
end
end
......@@ -126,15 +108,15 @@ courses.each do |course_name, v|
ssl_certificates["#{course_name + enote_domain_suffix}"] = default_cert(v[:id])
end
enabled_features[:getpdf] = enabled_features[:sharelatex]
if enabled_features[:sharelatex]
@enabled_features[:getpdf] = @enabled_features[:sharelatex]
if @enabled_features[:sharelatex]
ssl_certificates["sharelatex-enote#{enote_domain_suffix}".to_sym] = default_cert("sharelatex-enote")
ssl_certificates["sharelatex#{enote_domain_suffix}".to_sym] = default_cert("sharelatex")
enabled_features[:sharelatex_redis] = true
enabled_features[:sharelatexdb] = true
@enabled_features[:sharelatex_redis] = true
@enabled_features[:sharelatexdb] = true
end
if enabled_features[:filemanager]
if @enabled_features[:filemanager]
ssl_certificates["filemanager#{enote_domain_suffix}"] = default_cert("filemanager")
end
......@@ -154,7 +136,7 @@ if use_wildcard_ssl_cert
ssl_certificates = Hash[*keys.zip(vals).flatten]
end
puts "enabled_features = #{enabled_features.ai}"
puts "@enabled_features = #{@enabled_features.ai}"
puts "courses = #{courses.ai}"
puts "ssl_certificates = #{ssl_certificates.ai}"
......@@ -167,14 +149,14 @@ end
@courses = courses
expected_containers = generate_expected_containers(enabled_features)
expected_images = generate_expected_images(enabled_features)
expected_containers = generate_expected_containers(@enabled_features)
expected_images = generate_expected_images(@enabled_features)
puts "expected_images = #{expected_images.ai}"
enabled_features = @enabled_features
b = binding
#b.local_variable_set(:enabled_features, enabled_features)
#b.local_variable_set(:@enabled_features, @enabled_features)
# generate deployment info
deployment_info = YAML::load_file(File.join(@gen_root, 'deployment-info.yaml'))
......
......@@ -28,6 +28,17 @@ module EnoteConfig
attr_accessor :docker_machine
attr_accessor :timezone
default_enabled_features = {
:redis => true,
:revproxy => true,
:sites => true,
:sharelatex => true,
:quiz => true,
:course_website => true,
:filemanager => true,
}
def enote_env(logger = nil)
@logger = logger || Logger.new(STDOUT)
@logger.level = Logger::DEBUG
......@@ -87,6 +98,10 @@ module EnoteConfig
@public_server = false
@docker_machine = false
end
load_or_create_enote_config!
ap @enabled_features
end
def courses_and_users(logger = nil)
......@@ -116,4 +131,17 @@ module EnoteConfig
FileUtils.touch filename
end
end
def load_or_create_enote_config!()
generate_cfg = File.join(config_root, 'enote.yaml')
if File.exist? generate_cfg
puts "loading config file #{generate_cfg}"
@enabled_features = YAML::load_file(generate_cfg).symbolize_keys!
else
puts "writing config file #{generate_cfg}"
@enabled_features = default_enabled_features
File.open(generate_cfg, 'w') {|f| f.write @enabled_features.to_yaml }
end
end
end
......@@ -7,7 +7,7 @@ require 'capybara/dsl'
Capybara.register_driver :chrome do |app|
options = Selenium::WebDriver::Chrome::Options.new(
args: %w[disable-gpu no-sandbox]
args: %w[disable-gpu no-sandbox headless]
)
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
......@@ -49,6 +49,7 @@ module Monitoring
unless capybara_url_prefix.nil?
@root_url = "https://#{capybara_url_prefix}#{@enote_domain_suffix}"
logger.info "initializing capybara targetting #{@root_url}"
Capybara.configure do |config|
config.run_server = false
config.default_driver = :chrome
......
......@@ -16,7 +16,7 @@ module Monitoring
end
def check_functioning(course_id)
url = "https://" + course_id + '-enote' + enote_domain_suffix
url = "https://" + course_id + enote_domain_suffix
logger.debug "\tvisiting #{url}"
......@@ -25,7 +25,7 @@ module Monitoring
visit url
puts page.current_path
if !page.current_path.eql? "/Frontpage"
if !page.current_path.eql? '/Frontpage'
logger.error "failed to get redirected to home, instead went to #{page.current_path}"
return false
end
......
require 'pry'
require 'logger'
require 'capybara'
require 'capybara/dsl'
module Monitoring
class FileManager < MonitorWebFrontend
def check
Capybara.reset_sessions!
@container = 'filemanager'
check_container(@container) &&
# TODO: create a "check node app up"
# check_rails_app_up(@container) &&
check_functioning
end
def check_functioning
url = "https://filemanager" + enote_domain_suffix
logger.debug "\tvisiting #{url}"
login_cas url
if !page.current_path.eql? '/'
logger.error "failed to get redirected to root, instead went to #{page.current_path}"
return false
end
logger.debug 'successfully logged in and got root page'.green
true
end
end
end
......@@ -8,12 +8,12 @@ module Monitoring
include EnoteConfig
def initialize(logger, credentials, keys_folder)
def initialize(logger, credentials, course_id)
super(logger, credentials)
enote_env(logger)
@keys_folder = keys_folder
@course_id = course_id
end
def check
......@@ -21,31 +21,8 @@ module Monitoring
end
def check_functioning
get_pdf_cmd = ['ssh', '-i', '/home/dtuuser/.ssh/id_rsa', '-o', 'StrictHostKeyChecking=no', 'root@get-pdf', 'stat', '/get-pdf.sh']
out = %x{docker exec -ti get-pdf curl -X GET http://localhost:8080/api/getpdf/#{@course_id}/summary}
f = File.join(data_root, 'getpdf-keys', 'authorized_keys')
authorized_keys_stat = File.stat(f)
uid = File.stat(f).uid
gid = File.stat(f).gid
Rails.logger.info(" _authorized_keys_: #{authorized_keys_stat.ai}")
logger.warn "invalid permissions on authorized_keys" unless authorized_keys_stat.uid == 0 and
authorized_keys_stat.gid == 0 and
authorized_keys_stat.mode.to_s(8)[3..5] == "600"
docker_ps = DockerPsParser.new(`docker ps`)
websites = docker_ps.rows.map{ |r| r[:NAMES] }.select{ |r| r.start_with? "course-website-" }
unless websites.any?
logger.debug 'no Web site containers; cannot validate get-pdf'.yellow
return true
end
container_name = websites.first
logger.debug "#{get_pdf_cmd} running on container #{container_name}"
out = `docker exec #{container_name} #{get_pdf_cmd.join(" ")} `
unless ($? == 0)
logger.error "Script returned error condition".red
return false
......@@ -53,7 +30,11 @@ module Monitoring
logger.debug(out)
logger.debug 'successfully logged in to get-pdf container'.green
parsed_out = JSON.parse(out)
logger.debug(parsed_out.ai)
logger.info 'successfully logged in to get-pdf container'.green
true
end
......
......@@ -11,7 +11,7 @@ module Monitoring
end
def check_functioning
url = "http://enote" + enote_domain_suffix + "/status/info.html"
url = "http://quiz" + enote_domain_suffix + "/status/info.html"
logger.debug "\tvisiting #{url}"
......
......@@ -5,15 +5,15 @@ require 'capybara/dsl'
module Monitoring
class Sharelatex < MonitorWebFrontend
def check(course_id)
def check
check_container('sharelatex') &&
# TODO: what's sharelatex's logfile?
# check_app_up('sharelatex-'+course_id, '/data/log/') &&
check_functioning(course_id)
check_functioning
end
def check_functioning(course_id)
url = "https://sharelatex-" + course_id + '-enote' + enote_domain_suffix + "/"
def check_functioning
url = "https://sharelatex" + enote_domain_suffix + "/"
logger.debug "\tvisiting #{url}"
......@@ -27,13 +27,15 @@ module Monitoring
return false
end
=begin
welcome = "ShareLatex for "+course_id
if !page.has_text?(welcome)
logger.error "failed to have welcome text '#{welcome}'".red
return false
end
=end
logger.debug 'successfully logged in and got home page'.green
logger.debug 'successfully got home page'.green
true
end
......
require 'erb'
require 'yaml'
require 'uri'
require 'dtu_auth2'
require 'logger'
require 'yaml'
require 'set'
require 'awesome_print'
require 'colorize'
namespace :enote_test do
include EnoteConfig
include EnoteTaskHelper
task :enote_env do
enote_env
end
# https://ernie.io/2014/02/05/7-lines-every-gems-rakefile-should-have/
task :console do
require 'irb'
require 'irb/completion'
require 'my_gem' # You know what to do.
ARGV.clear
IRB.start
end
desc "courses_and_users"
task :courses_and_users => [:enote_env] do
courses_and_users logger
end
desc "upload test content to shared volumes"
task :upload_course_content, [:course_id] => [:enote_env] do |_t, args|
course_id = args[:course_id]
logger.info test_config["website_content"]
content_dir = test_config["website_content"][course_id]
content_map = [
{ :src => "#{content_dir}/website/enotes/#{course_id}",
:dst => File.join('/enote/vol', "website-enotes", course_id) },
{ :src => "#{content_dir}/website/uploads/#{course_id}",
:dst => File.join('/enote/vol', "website-uploads", course_id) },
{ :src => "#{content_dir}/website/raw/#{course_id}",
:dst => File.join('/enote/vol', "website-raw", course_id) },
]
content_map.each do |content|
if docker_machine
cmd = ["docker-machine", "ssh", "default", "sudo", "rm", "-rf", "default:"+content[:dst]+"/*"]
logger.info cmd.join(' ')
logger.info system(*cmd)
cmd = ["docker-machine", "scp", "-r", content[:src], "default:"+content[:dst]+"/.."]
logger.info cmd.join(' ')
logger.info system(*cmd)
else
FileUtils.rm_rf Dir.glob(content[:dst] + '/*')
FileUtils.cp Dir.glob(content[:src] + "/*"), content[:dst]
end
end
logger.info "done uploading content to Web site for #{course_id}".green
end
desc "upload content to Web site"
task :update_website_content, [:course_id] => [:enote_env] do |_t, args|
course_id = args[:course_id]
out = `docker exec -i -t course-website-#{course_id} bundle exec rake update:all`
logger.info out
fail "update Web site content".red unless $? == 0
logger.info "done updating Web site content for #{course_id}".green
end
desc "create sharelatex admin account"
task :create_sharelatex_admin, [:course_id] => [:enote_env] do |_t, args|
course_id = args[:course_id]
run_sharelatex_test args, :create_admin, "create admin user"
logger.info "done creating sharelatex admin account for #{course_id}".green
end
desc "upload sharelatex project"
task :upload_sharelatex_project, [:course_id, :project_zip] => [:enote_env] do |_t, args|
course_id = args[:course_id]
a = {
:course_id => course_id,
:project_zip => args[:project_zip] || "./test_content/sharelatex/#{course_id}/min-enotes2.zip"
}
run_sharelatex_test a, :populate_project, "populate project"
logger.info "done populating test sharelatex project for #{course_id}".green
end
desc "populate a course"
task :populate_course, [:course_id] => [:enote_env, :upload_course_content, :update_website_content] do |_t, args|
logger.info "done populating course Web site for #{args[:course_id]}".green
end
desc "populate a sharelatex"
task :populate_sharelatex, [:course_id] => [:enote_env, :create_sharelatex_admin, :upload_sharelatex_project] do |_t, args|
logger.info "done populating sharelatex for #{args[:course_id]}".green
end
desc "populate all courses"
task :populate_all_courses => [:enote_env, :courses_and_users] do
run_task_for_all_test_courses :"test:populate_course"
logger.info "done populating all courses...".green
end
desc "populate all sharelatexes"
task :populate_all_sharelatexes => [:enote_env, :courses_and_users] do
run_task_for_all_test_courses :"test:populate_sharelatex"
logger.info "done populating all sharelatexes...".green
end
desc "populate the quiz"
task :populate_quiz => [:enote_env] do
logger.info "resyncing quizzes"
out = `docker exec -i -t quiz bundle exec rake dtuquiz_maintenance:force_resync_quizzes`
unless $? == 0
logger.info out
fail "could not resync quizzes".red
end
logger.info "recreating quizzes"
out = `docker exec -i -t quiz bundle exec rake dtuquiz:recreate_quizzes`
unless $? == 0
logger.info out
fail "could not recreate quizzes".red
end
logger.info "done populating quiz...".green
end
desc "populate with test data"
task :populate => [:enote_env, :populate_quiz, :populate_all_courses, :populate_all_sharelatexes] do
logger.info "done populating...".green
end
def run_course_test(course_id, testname, message)
logger.info "Running course test #{testname}"
evaluate_capybara_test __method__, (Testing::Course.new(logger, admin_account).send(testname, course_id))
logger.info "done testing course #{course_id} #{message}...".green
end
def run_sharelatex_test(args, testname, message)
logger.info "Running sharelatex test #{testname}"
evaluate_capybara_test __method__, (Testing::Sharelatex.new(logger, admin_account, 'sharelatex').send(testname, args))
logger.info "done testing sharelatex #{args[:course_id]} #{message}...".green
end
desc "test the course home page"
task :test_course_home_page, [:course_id] => [:enote_env] do |_t, args|
run_course_test args[:course_id], :test, "home page"
end
desc "test the course admin page"
task :test_course_admin_page, [:course_id] => [:enote_env] do |_t, args|
logger.info "TESTST #{args[:course_id]}"
run_course_test args[:course_id], :test_admin, "admin page"
end
desc "test the sharelatex home page"
task :sharelatex, [:course_id] => [:enote_env] do |_t, args|
# TODO: test
end
desc "test a course"
task :test_course, [:course_id] => [:enote_env, :test_course_home_page, :test_course_admin_page] do |_t, args|
logger.info "done testing course Web site for #{args[:course_id]}".green
end
desc "test a sharelatex"
task :test_sharelatex, [:course_id] => [:enote_env] do |_t, args|
logger.info "done testing sharelatex for #{args[:course_id]}".green
end
desc "test all courses"
task :test_all_courses => [:enote_env, :courses_and_users] do
fail "failed during test of all courses".red unless run_task_for_all_test_courses :"test:test_course"
logger.info "done testing all courses...".green
end
desc "test all sharelatexes"
task :test_all_sharelatexes => [:enote_env, :courses_and_users] do
fail "failed during test of all courses".red unless run_task_for_all_test_courses :"test:test_sharelatex"
logger.info "done testing all sharelatex...".green
end
desc "test the quiz admin page"
task :test_quiz_admin_page, [:course_id] => [:enote_env] do |_t, args|
evaluate_capybara_test __method__, (Testing::Quiz.new(logger, admin_account).test_admin args[:course_id])
logger.info "done testing quiz admin page for course #{args[:course_id]}...".green
end
desc "test the quiz"
task :test_quiz => [:enote_env] do
fail "failed during test of all quizzes".red unless run_task_for_all_test_courses :"test:test_quiz_admin_page"
logger.info "done testing quiz...".green
end
desc "run through all tests"
task :test_all => [:enote_env, :test_quiz, :test_all_courses, :test_all_sharelatexes] do
logger.info "done testing...".green
end
desc "populate and run through all tests"
task :all => [:enote_env, :populate, :test_all] do
logger.info "done testing...".green
end
private
def admin_account
admin_accounts = test_config["accounts"].select{ |_acct, detail| detail["acl"].eql? "Administrator" }.map{ |username, detail| { 'username' => username, 'password' => detail["password"]} }
admin_accounts.first
end
def all_test_courses
DTUAuth2::CachedAuthorizationManager.instance.courses.values.select{ |c| test_config["test_courses"].include?(c._id) }
end
def run_task_for_all_test_courses(taskname)
all_test_courses.map{ |c| Rake::Task[taskname].invoke(c._id) }
true
end
def evaluate_capybara_test(test, status)
if status
logger.info "test #{test} succeeded.".green
else
logger.error "test #{test} failed.".red
end
Capybara.reset_sessions!
fail unless status
end
end
......@@ -45,55 +45,82 @@ namespace :monitor do
desc "validate revproxy service"
task :revproxy => [:enote_env] do
check Monitoring::RevProxy.new(logger, test_credentials), "revproxy"
check Monitoring::RevProxy.new(logger, test_credentials, 'enote'), "revproxy"
end
desc "validate quiz service"
task :quiz => [:enote_env] do
check Monitoring::Quiz.new(logger, test_credentials), "quiz"
check Monitoring::Quiz.new(logger, test_credentials, 'quiz'), "quiz"
end
desc "validate course service"
task :course_website, [:course_id] => :enote_env do |_t, args|
check Monitoring::CourseWebsite.new(logger, test_credentials), "course #{args[:course_id]}", args[:course_id]
course_id = args[:course_id]
check Monitoring::CourseWebsite.new(logger, test_credentials, course_id), "course #{course_id}", course_id
end
desc "validate sharelatex service"
task :sharelatex, [:course_id] => :enote_env do |_t, args|
check Monitoring::Sharelatex.new(logger, test_credentials), "sharelatex #{args[:course_id]}", args[:course_id]
unless @enabled_features[:sharelatex]
logger.warn "Sharelatex not enabled; skipping."
else
check Monitoring::Sharelatex.new(logger, test_credentials, 'sharelatex'), "sharelatex #{args[:course_id]}", args[:course_id]
end
end
desc "validate all courses"
task :courses, [:course_id] => :enote_env do |_t, args|
logger.debug("checking all courses")
task :courses, [:enote_env] do |_t, args|
logger.info("checking all courses")
pass = true
course_info = YAML::load_file(File.join(config_root, 'courses.yaml'))
course_info.each do |course_id, val|
pass = pass && Rake::Task["monitor:course_website"].invoke(course_id) if val["website_enabled"]
pass = pass && Rake::Task["monitor:sharelatex"].invoke(course_id) if val["sharelatex_enabled"]
logger.info "checking #{course_id}"
pass = pass && Rake::Task["monitor:course_website"].invoke(course_id)
pass = pass && Rake::Task["monitor:sharelatex"].invoke(course_id)
Rake::Task["monitor:course_website"].reenable
Rake::Task["monitor:sharelatex"].reenable
end
pass
end
desc "validate sharelatex-db service"
task :sharelatex, [:course_id] => :enote_env do |_t, args|
desc "validate all getpdf endpoints"
task :getpdfs, [:enote_env] do |_t, args|
logger.info("checking all getpdf endpoints")
pass = true
course_info = YAML::load_file(File.join(config_root, 'courses.yaml'))
if course_info.select{ |course_id, val| val["sharelatex_enabled"] }.any?
check Monitoring::SharelatexDb.new(logger, test_credentials), "sharelatex-db"
course_info.each do |course_id, val|
logger.info "checking #{course_id}"
pass = pass && Rake::Task["monitor:getpdf"].invoke(course_id)
Rake::Task["monitor:getpdf"].reenable
end
pass
end
desc "validate sharelatex-db service"
task :sharelatex, [:enote_env] do |_t, args|
unless @enabled_features[:sharelatex]
logger.warn "Sharelatex not enabled; skipping."
else
logger.info "sharelatex not used by any courses; not checking sharelatex-db"
check Monitoring::SharelatexDb.new(logger, test_credentials), "sharelatex-db"
end
end
desc "validate get-pdf service"
task :getpdf => [:enote_env] do
check Monitoring::GetPdf.new(logger, test_credentials, File.join(data_root, 'getpdf-keys/id_rsa')), "getpdf"
task :getpdf, [:course_id] => :enote_env do |_t, args|
unless @enabled_features[:sharelatex]
logger.warn "Sharelatex not enabled; skipping getpdf."
else
check Monitoring::GetPdf.new(logger, test_credentials, args[:course_id]), "getpdf"
end
end
desc "filemanager filemanager service"
task :filemanager => [:enote_env] do
check Monitoring::FileManager.new(logger, test_credentials), "filemanager"
end
desc "validate all services"
task :all => [:enote_env, :revproxy, :quiz, :courses, :getpdf] do
task :all => [:enote_env, :revproxy, :quiz, :courses, :getpdfs, :filemanager] do
logger.debug("validating all services")
end
......
require 'erb'
require 'yaml'
require 'uri'
require 'dtu_auth2'
require 'logger'
require 'yaml'
require 'set'
require 'awesome_print'
require 'colorize'
require "rake/testtask"
namespace :test do
include EnoteConfig
include EnoteTaskHelper
task :enote_env do
enote_env
end
# https://ernie.io/2014/02/05/7-lines-every-gems-rakefile-should-have/
task :console do
require 'irb'
require 'irb/completion'
require 'my_gem' # You know what to do.
ARGV.clear
IRB.start
end
desc "courses_and_users"
task :courses_and_users => [:enote_env] do
courses_and_users logger
end
desc "upload test content to shared volumes"
task :upload_course_content, [:course_id] => [:enote_env] do |_t, args|
course_id = args[:course_id]
logger.info test_config["website_content"]
content_dir = test_config["website_content"][course_id]
content_map = [
{ :src => "#{content_dir}/website/enotes/#{course_id}",
:dst => File.join('/enote/vol', "website-enotes", course_id) },
{ :src => "#{content_dir}/website/uploads/#{course_id}",
:dst => File.join('/enote/vol', "website-uploads", course_id) },
{ :src => "#{content_dir}/website/raw/#{course_id}",
:dst => File.join('/enote/vol', "website-raw", course_id) },
]
content_map.each do |content|
if docker_machine
cmd = ["docker-machine", "ssh", "default", "sudo", "rm", "-rf", "default:"+content[:dst]+"/*"]
logger.info cmd.join(' ')
logger.info system(*cmd)
cmd = ["docker-machine", "scp", "-r", content[:src], "default:"+content[:dst]+"/.."]
logger.info cmd.join(' ')
logger.info system(*cmd)
else
FileUtils.rm_rf Dir.glob(content[:dst] + '/*')
FileUtils.cp Dir.glob(content[:src] + "/*"), content[:dst]
end
end
logger.info "done uploading content to Web site for #{course_id}".green
end
desc "upload content to Web site"
task :update_website_content, [:course_id] => [:enote_env] do |_t, args|
course_id = args[:course_id]
out = `docker exec -i -t course-website-#{course_id} bundle exec rake update:all`
logger.info out
fail "update Web site content".red unless $? == 0
logger.info "done updating Web site content for #{course_id}".green
end
desc "create sharelatex admin account"
task :create_sharelatex_admin, [:course_id] => [:enote_env] do |_t, args|
course_id = args[:course_id]
run_sharelatex_test args, :create_admin, "create admin user"
logger.info "done creating sharelatex admin account for #{course_id}".green
end
desc "upload sharelatex project"
task :upload_sharelatex_project, [:course_id, :project_zip] => [:enote_env] do |_t, args|
course_id = args[:course_id]
a = {
:course_id => course_id,
:project_zip => args[:project_zip] || "./test_content/sharelatex/#{course_id}/min-enotes2.zip"
}
run_sharelatex_test a, :populate_project, "populate project"
logger.info "done populating test sharelatex project for #{course_id}".green
end
desc "populate a course"
task :populate_course, [:course_id] => [:enote_env, :upload_course_content, :update_website_content] do |_t, args|
logger.info "done populating course Web site for #{args[:course_id]}".green
end
desc "populate a sharelatex"
task :populate_sharelatex, [:course_id] => [:enote_env, :create_sharelatex_admin, :upload_sharelatex_project] do |_t, args|
logger.info "done populating sharelatex for #{args[:course_id]}".green
end
desc "populate all courses"
task :populate_all_courses => [:enote_env, :courses_and_users] do
run_task_for_all_test_courses :"test:populate_course"
logger.info "done populating all courses...".green
end
desc "populate all sharelatexes"
task :populate_all_sharelatexes => [:enote_env, :courses_and_users] do
run_task_for_all_test_courses :"test:populate_sharelatex"
logger.info "done populating all sharelatexes...".green
end
desc "populate the quiz"
task :populate_quiz => [:enote_env] do
logger.info "resyncing quizzes"
out = `docker exec -i -t quiz bundle exec rake dtuquiz_maintenance:force_resync_quizzes`
unless $? == 0
logger.info out
fail "could not resync quizzes".red
end
logger.info "recreating quizzes"
out = `docker exec -i -t quiz bundle exec rake dtuquiz:recreate_quizzes`
unless $? == 0
logger.info out
fail "could not recreate quizzes".red
end
logger.info "done populating quiz...".green
end
desc "populate with test data"
task :populate => [:enote_env, :populate_quiz, :populate_all_courses, :populate_all_sharelatexes] do
logger.info "done populating...".green
end
def run_course_test(course_id, testname, message)
logger.info "Running course test #{testname}"
evaluate_capybara_test __method__, (Testing::Course.new(logger, admin_account).send(testname, course_id))
logger.info "done testing course #{course_id} #{message}...".green
end
def run_sharelatex_test(args, testname, message)
logger.info "Running sharelatex test #{testname}"
evaluate_capybara_test __method__, (Testing::Sharelatex.new(logger, admin_account, 'sharelatex').send(testname, args))
logger.info "done testing sharelatex #{args[:course_id]} #{message}...".green
end
desc "test the course home page"
task :test_course_home_page, [:course_id] => [:enote_env] do |_t, args|
run_course_test args[:course_id], :test, "home page"
end
desc "test the course admin page"
task :test_course_admin_page, [:course_id] => [:enote_env] do |_t, args|
logger.info "TESTST #{args[:course_id]}"
run_course_test args[:course_id], :test_admin, "admin page"
end
desc "test the sharelatex home page"
task :sharelatex, [:course_id] => [:enote_env] do |_t, args|
# TODO: test
end
desc "test a course"
task :test_course, [:course_id] => [:enote_env, :test_course_home_page, :test_course_admin_page] do |_t, args|
logger.info "done testing course Web site for #{args[:course_id]}".green
end
desc "test a sharelatex"
task :test_sharelatex, [:course_id] => [:enote_env] do |_t, args|
logger.info "done testing sharelatex for #{args[:course_id]}".green
end
desc "test all courses"
task :test_all_courses => [:enote_env, :courses_and_users] do
fail "failed during test of all courses".red unless run_task_for_all_test_courses :"test:test_course"
logger.info "done testing all courses...".green
end
desc "test all sharelatexes"
task :test_all_sharelatexes => [:enote_env, :courses_and_users] do
fail "failed during test of all courses".red unless run_task_for_all_test_courses :"test:test_sharelatex"
logger.info "done testing all sharelatex...".green
end
desc "test the quiz admin page"
task :test_quiz_admin_page, [:course_id] => [:enote_env] do |_t, args|
evaluate_capybara_test __method__, (Testing::Quiz.new(logger, admin_account).test_admin args[:course_id])
logger.info "done testing quiz admin page for course #{args[:course_id]}...".green
end
desc "test the quiz"
task :test_quiz => [:enote_env] do
fail "failed during test of all quizzes".red unless run_task_for_all_test_courses :"test:test_quiz_admin_page"
logger.info "done testing quiz...".green
end
desc "run through all tests"
task :test_all => [:enote_env, :test_quiz, :test_all_courses, :test_all_sharelatexes] do
logger.info "done testing...".green
end
desc "populate and run through all tests"
task :all => [:enote_env, :populate, :test_all] do
logger.info "done testing...".green
end
private
def admin_account
admin_accounts = test_config["accounts"].select{ |_acct, detail| detail["acl"].eql? "Administrator" }.map{ |username, detail| { 'username' => username, 'password' => detail["password"]} }
admin_accounts.first
end
def all_test_courses
DTUAuth2::CachedAuthorizationManager.instance.courses.values.select{ |c| test_config["test_courses"].include?(c._id) }
end
def run_task_for_all_test_courses(taskname)
all_test_courses.map{ |c| Rake::Task[taskname].invoke(c._id) }
true
end
def evaluate_capybara_test(test, status)
if status
logger.info "test #{test} succeeded.".green
else
logger.error "test #{test} failed.".red
end
Capybara.reset_sessions!
fail unless status
end
Rake::TestTask.new do |t|
t.libs << "test"
t.test_files = FileList['test/test*.rb']
t.verbose = true
end
\ No newline at end of file
......@@ -94,9 +94,9 @@ EOT
logger.info "Web site config provided for courses which aren't enabled: #{extra_website_config_courses}" unless extra_website_config_courses.empty?
REQUIRED_ATTRS = %w(show_report_a_bug allow_feedback allow_chat files_repo course_external_url)
WEBSITE_REQUIRED_ATTRS = %w(show_report_a_bug allow_feedback)
website_config_courses.each do |course_id, course|
REQUIRED_ATTRS.each do |attr|
WEBSITE_REQUIRED_ATTRS.each do |attr|
fail "website.yaml, course #{course_id} is missing #{attr} attribute" unless course.has_key? attr
end
end
......@@ -124,14 +124,13 @@ EOT
extra_sharelatex_config = sharelatex_config.keys - enabled_courses
logger.info "Sharelatex config provided for courses which aren't enabled: #{extra_sharelatex_config}" unless extra_sharelatex_config.empty?
logger.warn "Sharelatex config provided for courses which aren't enabled: #{extra_sharelatex_config}" unless extra_sharelatex_config.empty?
REQUIRED_ATTRS = %w(enote_project_id username password host)
SHARELATEX_REQUIRED_ATTRS = %w(enote_project_id username password)
sharelatex_config.each do |course_id, sl_cfg|
REQUIRED_ATTRS.each do |attr|
SHARELATEX_REQUIRED_ATTRS.each do |attr|
fail "sharelatex.yaml for course #{course_id} has missing #{attr} attribute" unless sl_cfg.has_key? attr
end
fail "sharelatex.yaml for course #{course_id} has invalid host attributes" unless sl_cfg['host'].eql? "sharelatex-#{course_id}"
end
fail "sharelatex.yaml is broken" unless valid
......@@ -201,8 +200,6 @@ EOT
fail "quiz certificate doesn't exist " unless verify_certs_in_folder logger, File.join(certs_root, 'quiz'+enote_domain_suffix)
fail "stackedit certificate doesn't exist " unless verify_certs_in_folder logger, File.join(certs_root, 'stackedit'+enote_domain_suffix)
fail "enote certificate doesn't exist " unless verify_certs_in_folder logger, File.join(certs_root, 'enote'+enote_domain_suffix)
enabled_courses.each do |course|
......
require 'test_helper.rb'
class TestMeme < Minitest::Test
def setup
@meme = {}
end
def test_that_kitty_can_eat
assert_equal "OHAI!", @meme.i_can_has_cheezburger?
end
def test_that_it_will_not_blend
refute_match /^no/i, @meme.will_it_blend?
end
def test_that_will_be_skipped
skip "test this later"
end
end
\ No newline at end of file
describe 'FileManager' do
before do
end
it 'is redirects to CAS if not authed' do
skip 'TODO'
end
it 'is redirects fails if not admin' do
skip 'TODO'
end
end
\ No newline at end of file
require "minitest/autorun"
class Minitest::Test
include EnoteConfig
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment