Skip to content

Commit

Permalink
Adapt the unit test action to not use a docker image.
Browse files Browse the repository at this point in the history
  • Loading branch information
drgrice1 committed Aug 28, 2022
1 parent 4bad6ca commit 587dd60
Show file tree
Hide file tree
Showing 19 changed files with 138 additions and 73 deletions.
74 changes: 60 additions & 14 deletions .github/workflows/unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,88 @@ name: Unit Tests and Coverage

on:
push:
branches: [ main ]
branches: [main]
pull_request:
branches: [ main ]
branches: [main]

jobs:
unit-tests:
runs-on: ubuntu-latest
# If we are going to use a prebuilt image like this we need a webwork repository on docker hub
container: drgrice1/webwork3
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Checkout webwork3 source code
uses: actions/checkout@v2

# Disabling these things speeds up the setup considerably, and they are not needed for the throw away machine.
- name: Disable man-db and initramfs updates
run: |
sudo sed -i 's/yes/no/g' /etc/initramfs-tools/update-initramfs.conf
sudo rm -f /var/lib/man-db/auto-update
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -qy --no-install-recommends --no-install-suggests \
cpanminus \
libarray-utils-perl \
libcanary-stability-perl \
libcapture-tiny-perl \
libclass-accessor-lite-perl \
libclone-perl \
libcpanel-json-xs-perl \
libcrypt-ssleay-perl \
libdata-dump-perl \
libdatetime-format-strptime-perl \
libdbd-sqlite3-perl \
libdbix-class-inflatecolumn-serializer-perl \
libdbix-class-perl \
libdbix-dbschema-perl \
libdevel-cover-perl \
libexception-class-perl \
libextutils-config-perl \
libextutils-helpers-perl \
libextutils-installpaths-perl \
libfurl-perl \
libhttp-parser-xs-perl \
libimporter-perl \
libio-socket-ssl-perl \
liblist-moreutils-perl \
libmodule-build-tiny-perl \
libnet-ssleay-perl \
libsql-translator-perl \
libtest-exception-perl \
libtest-harness-perl \
libtext-csv-perl \
libtry-tiny-perl \
libyaml-libyaml-perl
cpanm --sudo --notest \
DBIx::Class::DynamicSubclass \
Mojolicious \
Mojolicious::Plugin::Authentication \
Mojolicious::Plugin::DBIC \
Mojolicious::Plugin::NotYAMLConfig \
Devel::Cover::Report::Codecov
- name: Run perl unit tests
env:
HARNESS_PERL_SWITCHES: -MDevel::Cover
run: |
perl t/db/build_db.pl
prove -r t
# we probably don'te need to upload the codecov data
# - uses: actions/upload-artifact@v2
# with:
# name: coverage-report
# path: cover_db/

- name: Push coverage analysis
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
run: cover -report codecov

# Install node (for npm) and use it to install eslint and stylelint dependencies.
- name: Use Node.js
# Install node (for npm).
- name: Set up node
uses: actions/setup-node@v2
with:
node-version: '16'

- name: Install Dependencies
run: npm ci

- name: Run typescript (client-side) tests
run: npm run test
33 changes: 24 additions & 9 deletions docker/webwork3.dockerfile
Original file line number Diff line number Diff line change
@@ -1,46 +1,61 @@
FROM ubuntu:20.04

# the following are needed to make sure the timezone packages don't ask for your timezone.
# The following are needed to make sure the timezone packages don't ask for your timezone.
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NONINTERACTIVE_SEEN true
ENV HARNESS_PERL_SWITCHES -MDevel::Cover

RUN apt-get update && \
apt-get install -qy --no-install-recommends --no-install-suggests \
build-essential=12.8ubuntu1 \
ca-certificates=20210119~20.04.1 \
ca-certificates=20211016~20.04.1 \
cpanminus=1.7044-1 \
git=1:2.25.1-1ubuntu3.1 \
git=1:2.25.1-1ubuntu3.5 \
libarray-utils-perl=0.5-1 \
libcanary-stability-perl=2006-2 \
libcapture-tiny-perl=0.48-1 \
libclass-accessor-lite-perl=0.08-1 \
libclone-perl=0.43-2 \
libcommon-sense-perl=3.74-2build6 \
libcpanel-json-xs-perl=4.19-1build1 \
libcrypt-ssleay-perl=0.73.06-1build3 \
libdata-dump-perl=1.23-1 \
libdatetime-format-strptime-perl=1.7600-1 \
libdbd-mysql-perl=4.050-3 \
# libdbd-mysql-perl=4.050-3 \
libdbd-sqlite3-perl=1.64-1build1 \
libdbix-class-perl=0.082841-1 \
libdbix-class-inflatecolumn-serializer-perl=0.09-1 \
libdbix-class-perl=0.082841-1 \
libdbix-dbschema-perl=0.45-1 \
libdevel-cover-perl=1.33-1build1 \
libexception-class-perl=1.44-1 \
libextutils-config-perl=0.008-2 \
libextutils-helpers-perl=0.026-1 \
libextutils-installpaths-perl=0.012-1 \
libfurl-perl=3.13-2 \
libhttp-parser-xs-perl=0.17-1build5 \
libimporter-perl=0.025-1 \
libio-socket-ssl-perl=2.067-1 \
libjson-perl=4.02000-2 \
libjson-xs-perl=4.020-1build1 \
libmodule-build-tiny-perl=0.039-1 \
libnet-ssleay-perl=1.88-2ubuntu1 \
libsql-translator-perl=1.60-1 \
libssl-dev=1.1.1f-1ubuntu2.5 \
libssl-dev=1.1.1f-1ubuntu2.16 \
libtest-exception-perl=0.43-1 \
libtest-harness-perl=3.42-2 \
libtext-csv-perl=2.00-1 \
libtry-tiny-perl=0.30-1 \
libtypes-serialiser-perl=1.0-1 \
libyaml-libyaml-perl=0.81+repack-1 \
# mariadb-server=1:10.3.31-0ubuntu0.20.04.1 \ # if desired to use a full database
openssl=1.1.1f-1ubuntu2.5 && \
openssl=1.1.1f-1ubuntu2.16 && \
rm -rf /var/lib/apt/lists/* && \
cpanm --notest \
DBIx::Class::DynamicSubclass \
Mojolicious \
Mojolicious::Plugin::NotYAMLConfig \
Mojolicious::Plugin::DBIC \
Mojolicious::Plugin::Authentication \
Mojolicious::Plugin::DBIC \
Mojolicious::Plugin::NotYAMLConfig \
Devel::Cover::Report::Codecov

ENTRYPOINT ["/bin/bash"]
2 changes: 1 addition & 1 deletion lib/DB/Schema/Result/Attempt.pm
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Note: a problem should have only one of a library_id, problem_path or problem_po

__PACKAGE__->table('attempt');

__PACKAGE__->load_components('InflateColumn::Serializer', 'Core');
__PACKAGE__->load_components(qw/InflateColumn::Serializer Core/);

__PACKAGE__->add_columns(
attempt_id => {
Expand Down
2 changes: 1 addition & 1 deletion lib/DB/Schema/Result/CourseSettings.pm
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ C<email>: a JSON object that stores email settings

__PACKAGE__->table('course_settings');

__PACKAGE__->load_components('InflateColumn::Serializer', 'Core');
__PACKAGE__->load_components(qw/InflateColumn::Serializer Core/);

__PACKAGE__->add_columns(
course_settings_id => {
Expand Down
2 changes: 1 addition & 1 deletion lib/DB/Schema/Result/CourseUser.pm
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ C<showOldAnswers>: whether or not the user shows old answer (boolean)

__PACKAGE__->table('course_user');

__PACKAGE__->load_components('InflateColumn::Serializer', 'Core');
__PACKAGE__->load_components(qw/InflateColumn::Serializer Core/);

__PACKAGE__->add_columns(
course_user_id => {
Expand Down
2 changes: 1 addition & 1 deletion lib/DB/Schema/Result/PoolProblem.pm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Note: the C<params> can only have one of the two fields

__PACKAGE__->table('pool_problem');

__PACKAGE__->load_components('InflateColumn::Serializer', 'Core');
__PACKAGE__->load_components(qw/InflateColumn::Serializer Core/);

__PACKAGE__->add_columns(
pool_problem_id => {
Expand Down
4 changes: 1 addition & 3 deletions lib/DB/Schema/Result/ProblemSet.pm
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,9 @@ L<DB::Schema::Result::ProblemSet::ReviewSet> which gives properties common to re
=cut

__PACKAGE__->load_components(qw/DynamicSubclass Core/);

__PACKAGE__->table('problem_set');

__PACKAGE__->load_components(qw/DynamicSubclass Core/, qw/InflateColumn::Serializer Core/);
__PACKAGE__->load_components(qw/DynamicSubclass Core InflateColumn::Serializer InflateColumn::Boolean Core/);

__PACKAGE__->add_columns(
set_id => {
Expand Down
2 changes: 1 addition & 1 deletion lib/DB/Schema/Result/SetProblem.pm
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ Note: a problem should have only one of a library_id, problem_path or problem_po

__PACKAGE__->table('set_problem');

__PACKAGE__->load_components('InflateColumn::Serializer', 'Core');
__PACKAGE__->load_components(qw/InflateColumn::Serializer Core/);

__PACKAGE__->add_columns(
set_problem_id => {
Expand Down
2 changes: 1 addition & 1 deletion lib/DB/Schema/Result/UserProblem.pm
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use base qw/DBIx::Class::Core DB::Validation/;

__PACKAGE__->table('user_problem');

__PACKAGE__->load_components('InflateColumn::Serializer', 'Core');
__PACKAGE__->load_components(qw/InflateColumn::Serializer Core/);

__PACKAGE__->add_columns(
user_problem_id => {
Expand Down
2 changes: 1 addition & 1 deletion lib/DB/Schema/Result/UserSet.pm
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ types have different params fields.

__PACKAGE__->table('user_set');

__PACKAGE__->load_components('InflateColumn::Serializer', 'Core');
__PACKAGE__->load_components(qw/InflateColumn::Serializer InflateColumn::Boolean Core/);

__PACKAGE__->add_columns(
user_set_id => {
Expand Down
3 changes: 2 additions & 1 deletion t/db/001_courses.t
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use Test::More;
use Test::Exception;
use YAML::XS qw/LoadFile/;
use DateTime::Format::Strptime;
use Mojo::JSON qw/true false/;

use DB::Schema;

Expand Down Expand Up @@ -90,7 +91,7 @@ throws_ok {
# Add a course
my $new_course_params = {
course_name => 'Geometry',
visible => 1,
visible => true,
course_dates => {}
};

Expand Down
4 changes: 2 additions & 2 deletions t/db/004_course_users.t
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ my $user_rs = $schema->resultset('User');
# Get a list of users from the CSV file
my @students = loadCSV("$main::ww3_dir/t/db/sample_data/students.csv");
for my $student (@students) {
$student->{is_admin} = 0;
$student->{is_admin} = false;
$student->{course_user_params} = $student->{params};
delete $student->{params};
}
Expand Down Expand Up @@ -124,7 +124,7 @@ my $user_params = {
last_name => 'Quimby',
email => 'mayor_joe@springfield.gov',
student_id => '12345',
is_admin => 0
is_admin => false
};

my $course_user_params = {
Expand Down
10 changes: 8 additions & 2 deletions t/db/006_quizzes.t
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,13 @@ my $user_rs = $schema->resultset('User');

my @all_problem_sets;

my @quizzes = loadCSV("$main::ww3_dir/t/db/sample_data/quizzes.csv");
my @quizzes = loadCSV(
"$main::ww3_dir/t/db/sample_data/quizzes.csv",
{
boolean_fields => ['set_visible'],
param_boolean_fields => ['timed']
}
);
for my $quiz (@quizzes) {
$quiz->{set_type} = 'QUIZ';
}
Expand Down Expand Up @@ -248,7 +254,7 @@ my $updated_quiz = $problem_set_rs->updateProblemSet(
params => $updated_params
);

$new_quiz->{set_visible} = 0;
$new_quiz->{set_visible} = false;
$new_quiz->{set_params} = {};
removeIDs($updated_quiz);
is_deeply($new_quiz, $updated_quiz, 'updateQuiz: successfully update the quiz');
Expand Down
11 changes: 5 additions & 6 deletions t/mojolicious/001_login.t
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ use Mojo::Base -strict;
use Test::More;
use Test::Mojo;
use YAML::XS qw/LoadFile/;

use YAML::XS qw/LoadFile/;
use Mojo::JSON qw/true false/;

BEGIN {
use File::Basename qw/dirname/;
Expand Down Expand Up @@ -36,11 +35,11 @@ $t->post_ok('/webwork3/api/login')->status_is(500, 'error status')->content_type
$t->post_ok('/webwork3/api/login' => json => { username => 'lisa', password => 'lisa' })->status_is(200)
->content_type_is('application/json;charset=UTF-8')->json_is(
'' => {
logged_in => 1,
logged_in => true,
user => {
email => 'lisa@google.com',
first_name => 'Lisa',
is_admin => 0,
is_admin => false,
last_name => 'Simpson',
student_id => '23',
user_id => 3,
Expand All @@ -53,7 +52,7 @@ $t->post_ok('/webwork3/api/login' => json => { username => 'lisa', password => '
# Test logout
$t->post_ok('/webwork3/api/logout')->status_is(200)->content_type_is('application/json;charset=UTF-8')->json_is(
'' => {
logged_in => 0,
logged_in => false,
message => 'Successfully logged out.'
},
'logout'
Expand All @@ -63,7 +62,7 @@ $t->post_ok('/webwork3/api/logout')->status_is(200)->content_type_is('applicatio
$t->post_ok('/webwork3/api/login' => json => { username => 'lisa', password => 'wrong_password' })->status_is(200)
->content_type_is('application/json;charset=UTF-8')->json_is(
'' => {
logged_in => 0,
logged_in => false,
message => 'Incorrect username or password.'
},
'invalid credentials'
Expand Down
12 changes: 6 additions & 6 deletions t/mojolicious/002_courses.t
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ my $t = Test::Mojo->new(WeBWorK3 => $config);

# Authenticate with the admin user.
$t->post_ok('/webwork3/api/login' => json => { username => 'admin', password => 'admin' })->status_is(200)
->content_type_is('application/json;charset=UTF-8')->json_is('/logged_in' => 1)->json_is('/user/user_id' => 1)
->json_is('/user/is_admin' => 1);
->content_type_is('application/json;charset=UTF-8')->json_is('/logged_in' => true)->json_is('/user/user_id' => 1)
->json_is('/user/is_admin' => true);

$t->get_ok('/webwork3/api/courses')->content_type_is('application/json;charset=UTF-8')
->json_is('/0/course_name' => 'Precalculus')->json_is('/0/visible' => 1);
->json_is('/0/course_name' => 'Precalculus')->json_is('/0/visible' => true);

$t->get_ok('/webwork3/api/courses/1')->content_type_is('application/json;charset=UTF-8')
->json_is('/course_name' => 'Precalculus')->json_is('/visible' => 1);
->json_is('/course_name' => 'Precalculus')->json_is('/visible' => true);

# Add a new course
my $new_course = {
Expand Down Expand Up @@ -124,8 +124,8 @@ $t->get_ok('/webwork3/api/courses/4/settings')->status_is(200)->content_type_is(
$t->post_ok('/webwork3/api/courses' => json => $new_course)->status_is(403)->json_is('/has_permission' => 0);

$t->put_ok('/webwork3/api/courses/4' => json => { course_name => 'XXX' })->status_is(403)
->json_is('/has_permission' => false);
->json_is('/has_permission' => 0);

$t->delete_ok('/webwork3/api/courses/4')->status_is(403)->json_is('/has_permission' => false);
$t->delete_ok('/webwork3/api/courses/4')->status_is(403)->json_is('/has_permission' => 0);

done_testing;
Loading

0 comments on commit 587dd60

Please sign in to comment.