diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index e01a46a6..e40d10e2 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -1,19 +1,15 @@ --- ########################### -########################### ## Linter GitHub Actions ## ########################### -########################### name: Lint Code Base defaults: run: shell: bash -# # Documentation: # https://help.github.com/en/articles/workflow-syntax-for-github-actions -# ############################# # Start the job on all push # @@ -29,7 +25,7 @@ on: # Set the Job # ############### jobs: - build: + lint: # Name the Job name: Lint Code Base # Set the agent to run on @@ -78,12 +74,21 @@ jobs: VALIDATE_JAVASCRIPT_STANDARD: false FILTER_REGEX_EXCLUDE: .*/we_b_wor_k3.yml - # This doesn't work and so is disabled. - # This either should be in a separate workflow or the workflow shoule be renamed. - ################## - # Run Perl tests # - ################## - #- name: Run Perl Tests - # uses: skx/github-action-tester@master - # with: - # script: .github/run-perl-tests.sh + perltidy: + name: Run perltidy on Perl Files + runs-on: ubuntu-latest + container: + image: perl:5.32 + steps: + - uses: actions/checkout@v2 + - name: perl -V + run: perl -V + - name: Install dependencies + run: cpanm -n Perl::Tidy + - name: perltidy --version + run: perltidy --version + - name: Run perltidy + shell: bash + run: | + shopt -s extglob globstar nullglob + perltidy --pro=./.perltidyrc -b -bext='/' ./**/*.p[lm] ./**/*.t && git diff --exit-code diff --git a/.perltidyrc b/.perltidyrc index c08a168f..699dc2bd 100644 --- a/.perltidyrc +++ b/.perltidyrc @@ -1,16 +1,10 @@ # PBP .perltidyrc file -# Uncomment #-st to fully emulate perltidy -pbp - --l=120 # Max line width is 120 cols +-l=120 # Max line width is 120 cols -et=4 # Use tabs instead of spaces. -i=4 # Indent level is 4 cols -ci=4 # Continuation indent is 4 cols - -#-st # Output to STDOUT -b # Write the file inline and create a .bak file --se # Errors to STDERR - --vt=2 # Maximal vertical tightness +-vt=0 # Minimal vertical tightness -cti=0 # No extra indentation for closing brackets -pt=2 # Maximum parenthesis tightness -bt=1 # Medium brace tightness @@ -22,3 +16,6 @@ -ce # Cuddled else -cb # Cuddled blocks -nbbc # Do not add blank lines before full length comments +-nbot # No line break on ternary +-nlop # No logical padding (this causes mixed tabs and spaces) +-wn # Weld nested containers diff --git a/bin/dev_scripts/PODtoHTML.pm b/bin/dev_scripts/PODtoHTML.pm index d114983e..ded0ed6d 100644 --- a/bin/dev_scripts/PODtoHTML.pm +++ b/bin/dev_scripts/PODtoHTML.pm @@ -192,7 +192,7 @@ sub write_index { sub do_pod2html { my ($self, %o) = @_; - my $psx = PODParser->new; + my $psx = PODParser->new; $psx->{source_root} = $self->{source_root}; $psx->{verbose} = $self->{verbose}; $psx->{base_url} = ($self->{dest_url} // "") . "/" . (($self->{source_root} // "") =~ s|^.*/||r); diff --git a/bin/import_ww2_db.pl b/bin/import_ww2_db.pl index b92b9c09..fe86d0d9 100755 --- a/bin/import_ww2_db.pl +++ b/bin/import_ww2_db.pl @@ -52,12 +52,11 @@ =head1 DESCRIPTION use Try::Tiny; use DBI; - BEGIN { - use File::Basename qw/dirname/; - use Cwd qw/abs_path/; - $main::bin_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname($main::bin_dir) . '/lib'; + use File::Basename qw/dirname/; + use Cwd qw/abs_path/; + $main::bin_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname($main::bin_dir) . '/lib'; } use lib "$main::lib_dir"; @@ -65,35 +64,33 @@ BEGIN use DB::Schema; use DB::Schema::Result::CourseUser; -my $verbose = 0; +my $verbose = 0; my $rebuild_db = 0; GetOptions( - 'r|rebuild+' => \$rebuild_db, - 'c|course=s' => \$course_name, - 'v|verbose+' => \$verbose + 'r|rebuild+' => \$rebuild_db, + 'c|course=s' => \$course_name, + 'v|verbose+' => \$verbose ) || pod2usage(); my $ww2_dsn = "DBI:mysql:database=webwork;host=localhost;port=3306"; -my $dbh = DBI->connect($ww2_dsn, "webworkWrite", "password", - { RaiseError => 1, AutoCommit => 0 }); +my $dbh = DBI->connect($ww2_dsn, "webworkWrite", "password", { RaiseError => 1, AutoCommit => 0 }); my $ww3_dsn = "DBI:mysql:database=webwork3;host=localhost;port=3306"; -my $schema = DB::Schema->connect($ww3_dsn, "webworkWrite", "password"); +my $schema = DB::Schema->connect($ww3_dsn, "webworkWrite", "password"); -my $course_rs = $schema->resultset('Course'); -my $user_rs = $schema->resultset('User'); +my $course_rs = $schema->resultset('Course'); +my $user_rs = $schema->resultset('User'); my $problem_set_rs = $schema->resultset('ProblemSet'); # test if the database tables are created. try { $course_rs->getCourses(); -} -catch { +} catch { $schema->deploy; }; my %PERMISSIONS = ( - 0 => "student", + 0 => "student", 10 => "instructor", 20 => "admin" ); @@ -103,45 +100,44 @@ BEGIN addUsers(); addProblemSets(); - my $db_tables = {}; sub rebuild { # find the course users - my @course_users = $user_rs->getUsers({course_name => $course_name}); + my @course_users = $user_rs->getUsers({ course_name => $course_name }); ## delete the users - for my $course_user (@course_users){ - my @user_courses = $course_rs->getUserCourses({user_id => $course_user->{user_id}}); - # if each user is only in one course, delete the global user + for my $course_user (@course_users) { + my @user_courses = $course_rs->getUserCourses({ user_id => $course_user->{user_id} }); + # if each user is only in one course, delete the global user if (scalar(@user_courses) == 1) { - $user_rs->deleteGlobalUser({user_id => $course_user->{user_id}}); + $user_rs->deleteGlobalUser({ user_id => $course_user->{user_id} }); say "deleting the global user with username: $course_user->{username}" if $verbose; } else { - $user_rs->deleteUser({course_name => $course_name, user_id => $course_user->{user_id}}); + $user_rs->deleteUser({ course_name => $course_name, user_id => $course_user->{user_id} }); say "From course $course_name, deleting user $course_user->{username}" if $verbose; } } ## delete the problem sets - my @problem_sets = $problem_set_rs->getProblemSets({course_name => $course_name}); + my @problem_sets = $problem_set_rs->getProblemSets({ course_name => $course_name }); for my $problem_set (@problem_sets) { - $problem_set_rs->deleteProblemSet({course_name => $course_name, set_id => $problem_set->{set_id}}); + $problem_set_rs->deleteProblemSet({ course_name => $course_name, set_id => $problem_set->{set_id} }); say "deleting problem set: $problem_set->{set_name}" if $verbose; } # delete the course - my $course = $course_rs->find({course_name => $course_name}); - $course->delete if $course; + my $course = $course_rs->find({ course_name => $course_name }); + $course->delete if $course; say "deleting the course $course_name" if $verbose; return; } sub buildTables { $db_tables = {}; - for my $name (qw/user key password past_answer/){ + for my $name (qw/user key password past_answer/) { $db_tables->{$name} = $course_name . "_" . $name; } return; @@ -149,7 +145,7 @@ sub buildTables { sub addCourse { say "adding course: $course_name" if $verbose; - $course_rs->addCourse({course_name => $course_name}); + $course_rs->addCourse({ course_name => $course_name }); return; } @@ -158,74 +154,72 @@ sub addUsers { my $perm_table = $course_name . "_permission"; my $sth = $dbh->prepare("SELECT * FROM `$user_table`"); - $sth->execute(); - my $ref = $sth->fetchall_arrayref({}); - my @keys = keys %{$ref->[0]}; + $sth->execute(); + my $ref = $sth->fetchall_arrayref({}); + my @keys = keys %{ $ref->[0] }; - my @user_fields = grep { - $_ ne "login_params" && $_ ne "user_id" && $_ ne "email" - } $user_rs->result_source->columns; + my @user_fields = + grep { $_ ne "login_params" && $_ ne "user_id" && $_ ne "email" } $user_rs->result_source->columns; my @course_user_param_fields = keys %$DB::Schema::Result::CourseUser::VALID_PARAMS; - my @course_user_fields = grep { - $_ !~ /\_id$/x && $_ ne "params" - } $schema->resultset("CourseUser")->result_source->columns; + my @course_user_fields = + grep { $_ !~ /\_id$/x && $_ ne "params" } $schema->resultset("CourseUser")->result_source->columns; for my $r (@$ref) { my $user_params = { username => $r->{user_id}, - email => $r->{email_address} + email => $r->{email_address} }; - foreach my $key (@user_fields){ + foreach my $key (@user_fields) { $user_params->{$key} = $r->{$key} if defined($r->{$key}); } # dd $user_params; - my $user = $user_rs->find({username => $user_params->{username}}); + my $user = $user_rs->find({ username => $user_params->{username} }); $user_rs->addGlobalUser($user_params) unless $user; - say "Adding user with username $r->{user_id}" if $verbose && ! defined($user); + say "Adding user with username $r->{user_id}" if $verbose && !defined($user); my $course_user = { username => $r->{user_id}, - params => {} + params => {} }; for my $key (@course_user_fields) { $course_user->{$key} = $r->{$key} if defined($r->{$key}); } - foreach my $key (@course_user_param_fields){ + foreach my $key (@course_user_param_fields) { $course_user->{params}->{$key} = $r->{$key} if defined($r->{$key}); } my $user_id = $r->{user_id}; - my $sth2 = $dbh->prepare("SELECT * FROM `$perm_table` WHERE user_id = '$user_id';"); + my $sth2 = $dbh->prepare("SELECT * FROM `$perm_table` WHERE user_id = '$user_id';"); $sth2->execute(); my $perm = $sth2->fetchrow_hashref(); - $course_user->{role} = $PERMISSIONS{$perm->{permission}}; - $user_rs->addUser({course_name => $course_name},$course_user); + $course_user->{role} = $PERMISSIONS{ $perm->{permission} }; + $user_rs->addUser({ course_name => $course_name }, $course_user); } return; } sub addProblemSets { my @hw_param_keys = keys %$DB::Schema::Result::ProblemSet::HWSet::VALID_PARAMS; - my $set_table = $course_name . "_set"; - my $sth = $dbh->prepare("SELECT * FROM `$set_table`"); + my $set_table = $course_name . "_set"; + my $sth = $dbh->prepare("SELECT * FROM `$set_table`"); $sth->execute(); - my $ref = $sth->fetchall_arrayref({}); - my @keys = keys %{$ref->[0]}; + my $ref = $sth->fetchall_arrayref({}); + my @keys = keys %{ $ref->[0] }; # dd @keys; for my $r (@$ref) { my $set_params = { set_name => $r->{set_id}, - dates => {}, - params => {}, + dates => {}, + params => {}, }; - if ($r->{assignment_type} eq 'default') { # it's a homework set + if ($r->{assignment_type} eq 'default') { # it's a homework set for my $key (@hw_param_keys) { $set_params->{params}->{$key} = $r->{$key} if defined($r->{$key}); } for my $key (@DB::Schema::Result::ProblemSet::HWSet::VALID_DATES) { - $set_params->{dates}->{$key} = $r->{$key .'_date'} if defined($r->{$key.'_date'}); + $set_params->{dates}->{$key} = $r->{ $key . '_date' } if defined($r->{ $key . '_date' }); } } - $problem_set_rs->addProblemSet({course_name => $course_name}, $set_params); + $problem_set_rs->addProblemSet({ course_name => $course_name }, $set_params); say "Adding set with name: $set_params->{set_name}" if $verbose; } return; diff --git a/lib/DB/Exception.pm b/lib/DB/Exception.pm index ae1f12a2..179774bf 100644 --- a/lib/DB/Exception.pm +++ b/lib/DB/Exception.pm @@ -4,63 +4,63 @@ use strict; use Exception::Class ( 'DB::Exception::UndefinedCourseField' => { - fields => ['message'], + fields => ['message'], description => 'There is an undefined course setting field' }, 'DB::Exception::InvalidCourseField' => { - fields => ['message'], + fields => ['message'], description => 'There is an invalid parameter' }, 'DB::Exception::InvalidCourseFieldType' => { - fields => ['message'], + fields => ['message'], description => 'There is an invalid field type' }, 'DB::Exception::UndefinedParameter' => { - fields => ['field_names'], + fields => ['field_names'], description => 'There is an undefined parameter' - }, - 'DB::Exception::InvalidParameter' => { - fields => ['field_names'], + }, + 'DB::Exception::InvalidParameter' => { + fields => ['field_names'], description => 'There is an invalid parameter' }, 'DB::Exception::CourseNotFound' => { - fields => ['course_name'], + fields => ['course_name'], description => 'The given course is not found.' }, 'DB::Exception::CourseExists' => { - fields => ['course_name'], + fields => ['course_name'], description => 'The course already exists.' }, 'DB::Exception::UserNotFound' => { - fields => ['username'], + fields => ['username'], description => 'The user was not found' }, 'DB::Exception::UserNotInCourse' => { - fields => ['username','course_name'], + fields => [ 'username', 'course_name' ], description => 'The user is not a member of the course' }, 'DB::Exception::UserAlreadyInCourse' => { - fields => ['username','course_name'], + fields => [ 'username', 'course_name' ], description => 'The user is already a member of the course' }, 'DB::Exception::UserExists' => { - fields => ['username'], + fields => ['username'], description => 'The user already exists' }, 'DB::Exception::SetNotInCourse' => { - fields => ['set_name','course_name'], + fields => [ 'set_name', 'course_name' ], description => 'The set is not in the course' }, 'DB::Exception::SetAlreadyExists' => { - fields => ['set_name', 'course_name'], + fields => [ 'set_name', 'course_name' ], description => 'The set already exists in the course' }, 'DB::Exception::UserSetExists' => { - fields => ['set_name', 'course_name',"username"], + fields => [ 'set_name', 'course_name', "username" ], description => 'The user set already exists in the course' }, 'DB::Exception::UserSetNotInCourse' => { - fields => ['set_name', 'course_name',"username"], + fields => [ 'set_name', 'course_name', "username" ], description => 'The user set does not exist in the course' }, 'DB::Exception::ParametersNeeded' => { @@ -70,31 +70,31 @@ use Exception::Class ( description => 'Too many parameters are passed in.' }, 'DB::Exception::InvalidDateField' => { - fields => ['field_names'], + fields => ['field_names'], description => 'The date fields are invalid', }, 'DB::Exception::InvalidDateFormat' => { - fields => ['date'], + fields => ['date'], description => 'The date format is invalid' }, 'DB::Exception::RequiredDateFields' => { - fields => ['field_names'], + fields => ['field_names'], description => 'Missing required date fields' }, 'DB::Exception::ImproperDateOrder' => { - fields => ['field_names'], + fields => ['field_names'], description => 'The dates are not in the proper order' }, 'DB::Exception::PoolNotInCourse' => { - fields => ['pool_name','course_name'], + fields => [ 'pool_name', 'course_name' ], description => 'The selected problem pool is not in the course' }, 'DB::Exception::PoolAlreadyInCourse' => { - fields => ['course_name', 'pool_name'], + fields => [ 'course_name', 'pool_name' ], description => 'The selected problem pool is already in the course' }, 'DB::Exception::PoolProblemNotInPool' => { - fields => ['info'], + fields => ['info'], description => 'The requested problem is not in the selected problem pool' } ); diff --git a/lib/DB/General.pm b/lib/DB/General.pm index 27277506..2d77fd37 100644 --- a/lib/DB/General.pm +++ b/lib/DB/General.pm @@ -30,7 +30,7 @@ use List::Util qw/first/; use Clone qw/clone/; use DB::Utils qw/getCourseInfo getUserInfo/; use DB::Exception; -use Exception::Class ( 'DB::Exception::CourseNotFound', 'DB::Exception::CourseExists' ); +use Exception::Class ('DB::Exception::CourseNotFound', 'DB::Exception::CourseExists'); use DB::TestUtils qw/removeIDs/; use WeBWorK3::Utils::Settings qw/getDefaultCourseSettings mergeCourseSettings diff --git a/lib/DB/Schema/Result/Course.pm b/lib/DB/Schema/Result/Course.pm index f8ada68f..083913a3 100644 --- a/lib/DB/Schema/Result/Course.pm +++ b/lib/DB/Schema/Result/Course.pm @@ -30,6 +30,7 @@ C: a boolean on whether the course is visible or not. =back =cut + our @VALID_DATES = qw/open end/; our @REQUIRED_DATES = qw//; our $VALID_PARAMS = { visible => q{[01]} }; @@ -52,11 +53,11 @@ __PACKAGE__->add_columns( is_nullable => 0, }, course_dates => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => "{}", - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => "{}", + serializer_class => 'JSON', serializer_options => { utf8 => 1 } }, visible => { @@ -69,16 +70,16 @@ __PACKAGE__->add_columns( __PACKAGE__->set_primary_key('course_id'); # set up the many-to-many relationship to users -__PACKAGE__->has_many( course_users => 'DB::Schema::Result::CourseUser', 'course_id' ); -__PACKAGE__->many_to_many( users => 'course_users', 'users' ); +__PACKAGE__->has_many(course_users => 'DB::Schema::Result::CourseUser', 'course_id'); +__PACKAGE__->many_to_many(users => 'course_users', 'users'); # set up the one-to-many relationship to problem_sets -__PACKAGE__->has_many( problem_sets => 'DB::Schema::Result::ProblemSet', 'course_id' ); +__PACKAGE__->has_many(problem_sets => 'DB::Schema::Result::ProblemSet', 'course_id'); # set up the one-to-many relationship to problem_pools -__PACKAGE__->has_many( problem_pools => 'DB::Schema::Result::ProblemPool', 'course_id' ); +__PACKAGE__->has_many(problem_pools => 'DB::Schema::Result::ProblemPool', 'course_id'); # set up the one-to-one relationship to course settings; -__PACKAGE__->has_one( course_settings => 'DB::Schema::Result::CourseSettings', 'course_id' ); +__PACKAGE__->has_one(course_settings => 'DB::Schema::Result::CourseSettings', 'course_id'); 1; diff --git a/lib/DB/Schema/Result/CourseSettings.pm b/lib/DB/Schema/Result/CourseSettings.pm index 5890f6c6..28ffe96e 100644 --- a/lib/DB/Schema/Result/CourseSettings.pm +++ b/lib/DB/Schema/Result/CourseSettings.pm @@ -2,6 +2,7 @@ package DB::Schema::Result::CourseSettings; use base qw/DBIx::Class::Core/; use strict; use warnings; + =head1 DESCRIPTION This is the database schema for a CourseSetting. @@ -71,57 +72,57 @@ __PACKAGE__->add_columns( is_nullable => 0, }, general => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => "{}", - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => "{}", + serializer_class => 'JSON', serializer_options => { utf8 => 1 } }, optional => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => "{}", - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => "{}", + serializer_class => 'JSON', serializer_options => { utf8 => 1 } }, problem_set => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => "{}", - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => "{}", + serializer_class => 'JSON', serializer_options => { utf8 => 1 } }, problem => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => "{}", - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => "{}", + serializer_class => 'JSON', serializer_options => { utf8 => 1 } }, permissions => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => "{}", - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => "{}", + serializer_class => 'JSON', serializer_options => { utf8 => 1 } }, email => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => "{}", - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => "{}", + serializer_class => 'JSON', serializer_options => { utf8 => 1 } } ); __PACKAGE__->set_primary_key('course_settings_id'); -__PACKAGE__->belongs_to( course => 'DB::Schema::Result::Course', 'course_id' ); +__PACKAGE__->belongs_to(course => 'DB::Schema::Result::Course', 'course_id'); 1; diff --git a/lib/DB/Schema/Result/CourseUser.pm b/lib/DB/Schema/Result/CourseUser.pm index eda8f71a..72ad814b 100644 --- a/lib/DB/Schema/Result/CourseUser.pm +++ b/lib/DB/Schema/Result/CourseUser.pm @@ -2,6 +2,7 @@ package DB::Schema::Result::CourseUser; use base qw/DBIx::Class::Core/; use strict; use warnings; + =head1 DESCRIPTION This is the database schema for a CourseUser. Note: this table has two purposes 1) a relationship table linking @@ -130,22 +131,22 @@ __PACKAGE__->add_columns( size => 16, is_nullable => 1, }, - params => { # store params as a JSON object - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', + params => { # store params as a JSON object + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', serializer_options => { utf8 => 1 } } ); __PACKAGE__->set_primary_key('course_user_id'); -__PACKAGE__->add_unique_constraint( [qw/course_id user_id/] ); +__PACKAGE__->add_unique_constraint([qw/course_id user_id/]); -__PACKAGE__->belongs_to( users => 'DB::Schema::Result::User', 'user_id' ); -__PACKAGE__->belongs_to( courses => 'DB::Schema::Result::Course', 'course_id' ); +__PACKAGE__->belongs_to(users => 'DB::Schema::Result::User', 'user_id'); +__PACKAGE__->belongs_to(courses => 'DB::Schema::Result::Course', 'course_id'); -__PACKAGE__->has_many( user_sets => 'DB::Schema::Result::UserSet', 'course_user_id' ); +__PACKAGE__->has_many(user_sets => 'DB::Schema::Result::UserSet', 'course_user_id'); 1; diff --git a/lib/DB/Schema/Result/PoolProblem.pm b/lib/DB/Schema/Result/PoolProblem.pm index db1d22d6..0b47263c 100644 --- a/lib/DB/Schema/Result/PoolProblem.pm +++ b/lib/DB/Schema/Result/PoolProblem.pm @@ -60,30 +60,28 @@ __PACKAGE__->add_columns( is_nullable => 0 }, params => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', - serializer_options => { utf8 => 1} + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', + serializer_options => { utf8 => 1 } } ); sub valid_params { return { - library_id => q{\d+}, + library_id => q{\d+}, problem_path => q{((\w)+\/?)+} }; } sub required_params { - return { - '_ONE_OF_' => ['library_id','problem_path'] - }; + return { '_ONE_OF_' => [ 'library_id', 'problem_path' ] }; } __PACKAGE__->set_primary_key('pool_problem_id'); -__PACKAGE__->belongs_to( problem_pool_id => 'DB::Schema::Result::ProblemPool' ); +__PACKAGE__->belongs_to(problem_pool_id => 'DB::Schema::Result::ProblemPool'); 1; diff --git a/lib/DB/Schema/Result/Problem.pm b/lib/DB/Schema/Result/Problem.pm index 369c5356..fc1d42a2 100644 --- a/lib/DB/Schema/Result/Problem.pm +++ b/lib/DB/Schema/Result/Problem.pm @@ -62,7 +62,7 @@ Note: a problem should have only one of a library_id, problem_path or problem_po sub valid_params { return { - weight => q{^[+]?([0-9]+(?:[\.][0-9]*)?|\.[0-9]+)$}, # positive integers or decimals + weight => q{^[+]?([0-9]+(?:[\.][0-9]*)?|\.[0-9]+)$}, # positive integers or decimals library_id => q{\d+}, problem_path => q{.*}, problem_pool_id => q{\d+} @@ -70,9 +70,7 @@ sub valid_params { } sub required_params { - return { - '_ALL_' => [ 'weight', { '_ONE_OF_' => [ 'library_id', 'problem_path', 'problem_pool_id' ] } ] - }; + return { '_ALL_' => [ 'weight', { '_ONE_OF_' => [ 'library_id', 'problem_path', 'problem_pool_id' ] } ] }; } ### this is the table that stores problems for a given Problem Set @@ -104,12 +102,12 @@ __PACKAGE__->add_columns( is_nullable => 0, default_value => 1 }, - params => { # store params as a JSON object - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', + params => { # store params as a JSON object + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', serializer_options => { utf8 => 1 } } ); @@ -117,10 +115,10 @@ __PACKAGE__->add_columns( __PACKAGE__->set_primary_key('problem_id'); # maybe we don't need this. -__PACKAGE__->add_unique_constraint( [qw/problem_id set_id problem_version problem_number/] ); +__PACKAGE__->add_unique_constraint([qw/problem_id set_id problem_version problem_number/]); -__PACKAGE__->belongs_to( problem_set => 'DB::Schema::Result::ProblemSet', 'set_id' ); +__PACKAGE__->belongs_to(problem_set => 'DB::Schema::Result::ProblemSet', 'set_id'); -__PACKAGE__->has_many( user_problem => 'DB::Schema::Result::UserProblem', 'problem_id' ); +__PACKAGE__->has_many(user_problem => 'DB::Schema::Result::UserProblem', 'problem_id'); 1; diff --git a/lib/DB/Schema/Result/ProblemPool.pm b/lib/DB/Schema/Result/ProblemPool.pm index 2a85fc8b..2bda3180 100644 --- a/lib/DB/Schema/Result/ProblemPool.pm +++ b/lib/DB/Schema/Result/ProblemPool.pm @@ -51,10 +51,10 @@ __PACKAGE__->add_columns( ); __PACKAGE__->set_primary_key('problem_pool_id'); -__PACKAGE__->add_unique_constraint( [qw/course_id pool_name/] ); +__PACKAGE__->add_unique_constraint([qw/course_id pool_name/]); -__PACKAGE__->has_many( pool_problems => 'DB::Schema::Result::PoolProblem', 'problem_pool_id' ); +__PACKAGE__->has_many(pool_problems => 'DB::Schema::Result::PoolProblem', 'problem_pool_id'); -__PACKAGE__->belongs_to( courses => 'DB::Schema::Result::Course', 'course_id' ); +__PACKAGE__->belongs_to(courses => 'DB::Schema::Result::Course', 'course_id'); 1; diff --git a/lib/DB/Schema/Result/ProblemSet.pm b/lib/DB/Schema/Result/ProblemSet.pm index f61bf839..e2a018e3 100644 --- a/lib/DB/Schema/Result/ProblemSet.pm +++ b/lib/DB/Schema/Result/ProblemSet.pm @@ -100,20 +100,20 @@ __PACKAGE__->add_columns( default_value => 1, is_nullable => 0 }, - dates => { # store dates as a JSON object - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', + dates => { # store dates as a JSON object + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', serializer_options => { utf8 => 1 } }, - params => { # store params as a JSON object - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', + params => { # store params as a JSON object + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', serializer_options => { utf8 => 1 } } ); @@ -132,11 +132,11 @@ __PACKAGE__->typecast_map( ); __PACKAGE__->set_primary_key('set_id'); -__PACKAGE__->add_unique_constraint( [qw/course_id set_name/] ); +__PACKAGE__->add_unique_constraint([qw/course_id set_name/]); -__PACKAGE__->belongs_to( courses => 'DB::Schema::Result::Course', 'course_id' ); -__PACKAGE__->has_many( problems => 'DB::Schema::Result::Problem', 'set_id' ); -__PACKAGE__->has_many( user_sets => 'DB::Schema::Result::UserSet', 'set_id' ); +__PACKAGE__->belongs_to(courses => 'DB::Schema::Result::Course', 'course_id'); +__PACKAGE__->has_many(problems => 'DB::Schema::Result::Problem', 'set_id'); +__PACKAGE__->has_many(user_sets => 'DB::Schema::Result::UserSet', 'set_id'); =head2 set_type diff --git a/lib/DB/Schema/Result/ProblemSet/HWSet.pm b/lib/DB/Schema/Result/ProblemSet/HWSet.pm index b5f5bad9..efa6eb6c 100644 --- a/lib/DB/Schema/Result/ProblemSet/HWSet.pm +++ b/lib/DB/Schema/Result/ProblemSet/HWSet.pm @@ -21,7 +21,7 @@ subroutine that returns the array for the valid dates: C<['open', 'reduced_scori =cut sub valid_dates { - return ['open', 'reduced_scoring', 'due' ,'answer']; + return [ 'open', 'reduced_scoring', 'due', 'answer' ]; } =head2 C @@ -30,9 +30,8 @@ subroutine that returns the array for the required dates: C<['open', 'due' ,'ans =cut - sub required_dates { - return ['open', 'due' ,'answer']; + return [ 'open', 'due', 'answer' ]; } =head2 C @@ -75,14 +74,13 @@ This is a description of the homework set. =cut - sub valid_params { return { enable_reduced_scoring => q{[01]}, - hide_hint => q{[01]}, - hardcopy_header => q{.*}, - set_header => q{.*}, - description => q{.*} + hide_hint => q{[01]}, + hardcopy_header => q{.*}, + set_header => q{.*}, + description => q{.*} }; } @@ -92,7 +90,6 @@ No parameters are required for the homework set. =cut - sub required_params { return {}; } diff --git a/lib/DB/Schema/Result/ProblemSet/Quiz.pm b/lib/DB/Schema/Result/ProblemSet/Quiz.pm index 33b5a829..ef545c65 100644 --- a/lib/DB/Schema/Result/ProblemSet/Quiz.pm +++ b/lib/DB/Schema/Result/ProblemSet/Quiz.pm @@ -21,7 +21,7 @@ subroutine that returns the array for the valid dates: C<['open', 'due' ,'answer =cut sub valid_dates { - return ['open', 'due' ,'answer']; + return [ 'open', 'due', 'answer' ]; } =head2 C @@ -30,9 +30,8 @@ subroutine that returns the array for the required dates: C<['open', 'due' ,'ans =cut - sub required_dates { - return ['open', 'due' ,'answer']; + return [ 'open', 'due', 'answer' ]; } =head2 C @@ -59,7 +58,7 @@ if the quiz is timed, how long should it be open. sub valid_params { return { - timed => q{^[01]$}, + timed => q{^[01]$}, quiz_duration => q{\d+}, }; } @@ -70,7 +69,6 @@ No parameters are required for the homework set. =cut - sub required_params { return {}; } diff --git a/lib/DB/Schema/Result/ProblemSet/ReviewSet.pm b/lib/DB/Schema/Result/ProblemSet/ReviewSet.pm index 3fc79363..d4205e37 100644 --- a/lib/DB/Schema/Result/ProblemSet/ReviewSet.pm +++ b/lib/DB/Schema/Result/ProblemSet/ReviewSet.pm @@ -20,7 +20,7 @@ subroutine that returns the array for the valid dates: C<['open', 'closed']> =cut sub valid_dates { - return ['open' ,'closed']; + return [ 'open', 'closed' ]; } =head2 C @@ -30,7 +30,7 @@ subroutine that returns the array for the required dates: C<['open', 'closed']> =cut sub required_dates { - return ['open' ,'closed']; + return [ 'open', 'closed' ]; } =head2 C @@ -49,7 +49,6 @@ subroutine that returns the hashref for the required parameters: (currently emp =cut - sub required_params { return {}; } diff --git a/lib/DB/Schema/Result/User.pm b/lib/DB/Schema/Result/User.pm index fdd620c0..0239a105 100644 --- a/lib/DB/Schema/Result/User.pm +++ b/lib/DB/Schema/Result/User.pm @@ -64,7 +64,6 @@ or authentication, like LTI or LDAP =cut - __PACKAGE__->table('user'); __PACKAGE__->load_components('InflateColumn::Serializer', 'Core'); @@ -103,19 +102,19 @@ __PACKAGE__->add_columns( default_value => 0, }, login_params => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', serializer_options => { utf8 => 1 } } ); __PACKAGE__->set_primary_key('user_id'); -__PACKAGE__->add_unique_constraint( [qw/username/] ); +__PACKAGE__->add_unique_constraint([qw/username/]); -__PACKAGE__->has_many( course_users => 'DB::Schema::Result::CourseUser', { 'foreign.user_id' => 'self.user_id' } ); -__PACKAGE__->many_to_many( courses => 'course_users', 'courses' ); +__PACKAGE__->has_many(course_users => 'DB::Schema::Result::CourseUser', { 'foreign.user_id' => 'self.user_id' }); +__PACKAGE__->many_to_many(courses => 'course_users', 'courses'); 1; diff --git a/lib/DB/Schema/Result/UserProblem.pm b/lib/DB/Schema/Result/UserProblem.pm index cdf26bc6..f7405411 100644 --- a/lib/DB/Schema/Result/UserProblem.pm +++ b/lib/DB/Schema/Result/UserProblem.pm @@ -49,18 +49,18 @@ __PACKAGE__->add_columns( default_value => 1, }, params => { - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', serializer_options => { utf8 => 1 } } ); __PACKAGE__->set_primary_key('user_problem_id'); -__PACKAGE__->belongs_to( problems => 'DB::Schema::Result::Problem', 'problem_id' ); -__PACKAGE__->belongs_to( course_users => 'DB::Schema::Result::CourseUser', 'user_id' ); +__PACKAGE__->belongs_to(problems => 'DB::Schema::Result::Problem', 'problem_id'); +__PACKAGE__->belongs_to(course_users => 'DB::Schema::Result::CourseUser', 'user_id'); 1; diff --git a/lib/DB/Schema/Result/UserSet.pm b/lib/DB/Schema/Result/UserSet.pm index 5e1ae187..d1957ce4 100644 --- a/lib/DB/Schema/Result/UserSet.pm +++ b/lib/DB/Schema/Result/UserSet.pm @@ -3,7 +3,6 @@ use base qw(DBIx::Class::Core DB::WithParams DB::WithDates); use strict; use warnings; - =head1 DESCRIPTION This is the database schema for a UserSet, which plays two roles: @@ -103,31 +102,31 @@ __PACKAGE__->add_columns( is_nullable => 0, default_value => 1, }, - dates => { # store dates as a JSON object - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', + dates => { # store dates as a JSON object + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', serializer_options => { utf8 => 1 } }, - params => { # store params as a JSON object - data_type => 'text', - size => 256, - is_nullable => 0, - default_value => '{}', - serializer_class => 'JSON', + params => { # store params as a JSON object + data_type => 'text', + size => 256, + is_nullable => 0, + default_value => '{}', + serializer_class => 'JSON', serializer_options => { utf8 => 1 } } ); __PACKAGE__->set_primary_key('user_set_id'); -__PACKAGE__->add_unique_constraint( [qw/set_id course_user_id set_version/] ); +__PACKAGE__->add_unique_constraint([qw/set_id course_user_id set_version/]); __PACKAGE__->belongs_to( course_users => 'DB::Schema::Result::CourseUser', { 'foreign.course_user_id' => 'self.course_user_id' } ); -__PACKAGE__->belongs_to( problem_sets => 'DB::Schema::Result::ProblemSet', 'set_id' ); +__PACKAGE__->belongs_to(problem_sets => 'DB::Schema::Result::ProblemSet', 'set_id'); # # This defines the non-abstract classes of ProblemSets. diff --git a/lib/DB/Schema/Result/UserSet/HWSet.pm b/lib/DB/Schema/Result/UserSet/HWSet.pm index fa612afa..df436a4e 100644 --- a/lib/DB/Schema/Result/UserSet/HWSet.pm +++ b/lib/DB/Schema/Result/UserSet/HWSet.pm @@ -8,10 +8,10 @@ use base qw(DB::Schema::Result::UserSet DB::WithParams DB::WithDates); use DB::Schema::Result::ProblemSet::HWSet; -our @VALID_DATES = @DB::Schema::Result::ProblemSet::HWSet::VALID_DATES; +our @VALID_DATES = @DB::Schema::Result::ProblemSet::HWSet::VALID_DATES; our @REQUIRED_DATES = @DB::Schema::Result::ProblemSet::HWSet::REQUIRED_DATES; -our $VALID_PARAMS = $DB::Schema::Result::ProblemSet::HWSet::VALID_PARAMS; +our $VALID_PARAMS = $DB::Schema::Result::ProblemSet::HWSet::VALID_PARAMS; our $REQUIRED_PARAMS = $DB::Schema::Result::ProblemSet::HWSet::REQUIRED_PARAMS; 1; diff --git a/lib/DB/Schema/Result/UserSet/JITAR.pm b/lib/DB/Schema/Result/UserSet/JITAR.pm index da53bfc5..cbe0e0e3 100644 --- a/lib/DB/Schema/Result/UserSet/JITAR.pm +++ b/lib/DB/Schema/Result/UserSet/JITAR.pm @@ -8,10 +8,10 @@ use base qw(DB::Schema::Result::UserSet DB::WithParams DB::WithDates); use DB::Schema::Result::ProblemSet::JITAR; -our @VALID_DATES = @DB::Schema::Result::ProblemSet::JITAR::VALID_DATES; +our @VALID_DATES = @DB::Schema::Result::ProblemSet::JITAR::VALID_DATES; our @REQUIRED_DATES = @DB::Schema::Result::ProblemSet::JITAR::REQUIRED_DATES; -our $VALID_PARAMS = $DB::Schema::Result::ProblemSet::JITAR::VALID_PARAMS; +our $VALID_PARAMS = $DB::Schema::Result::ProblemSet::JITAR::VALID_PARAMS; our $REQUIRED_PARAMS = $DB::Schema::Result::ProblemSet::JITAR::REQUIRED_PARAMS; 1; diff --git a/lib/DB/Schema/Result/UserSet/Quiz.pm b/lib/DB/Schema/Result/UserSet/Quiz.pm index cd29778e..e2a6a7e4 100644 --- a/lib/DB/Schema/Result/UserSet/Quiz.pm +++ b/lib/DB/Schema/Result/UserSet/Quiz.pm @@ -5,10 +5,10 @@ use warnings; use DB::Schema::Result::ProblemSet::Quiz; -our @VALID_DATES = @DB::Schema::Result::ProblemSet::Quiz::VALID_DATES; +our @VALID_DATES = @DB::Schema::Result::ProblemSet::Quiz::VALID_DATES; our @REQUIRED_DATES = @DB::Schema::Result::ProblemSet::Quiz::REQUIRED_DATES; -our $VALID_PARAMS = $DB::Schema::Result::ProblemSet::Quiz::VALID_PARAMS; +our $VALID_PARAMS = $DB::Schema::Result::ProblemSet::Quiz::VALID_PARAMS; our $REQUIRED_PARAMS = $DB::Schema::Result::ProblemSet::Quiz::REQUIRED_PARAMS; 1; diff --git a/lib/DB/Schema/Result/UserSet/ReviewSet.pm b/lib/DB/Schema/Result/UserSet/ReviewSet.pm index b2d0b6a7..eb0a176c 100644 --- a/lib/DB/Schema/Result/UserSet/ReviewSet.pm +++ b/lib/DB/Schema/Result/UserSet/ReviewSet.pm @@ -5,8 +5,8 @@ use warnings; use DB::Schema::Result::ProblemSet::ReviewSet; -our @VALID_DATES = @DB::Schema::Result::ProblemSet::ReviewSet::VALID_DATES; -our @REQUIRED_DATES = @DB::Schema::Result::ProblemSet::ReviewSet::REQUIRED_DATES; +our @VALID_DATES = @DB::Schema::Result::ProblemSet::ReviewSet::VALID_DATES; +our @REQUIRED_DATES = @DB::Schema::Result::ProblemSet::ReviewSet::REQUIRED_DATES; our $VALID_PARAMS = $DB::Schema::Result::ProblemSet::ReviewSet::VALID_PARAMS; our $REQUIRED_PARAMS = $DB::Schema::Result::ProblemSet::ReviewSet::REQUIRED_PARAMS; diff --git a/lib/DB/Schema/ResultSet/Course.pm b/lib/DB/Schema/ResultSet/Course.pm index 49891865..0659eebf 100644 --- a/lib/DB/Schema/ResultSet/Course.pm +++ b/lib/DB/Schema/ResultSet/Course.pm @@ -10,7 +10,7 @@ use List::Util qw/first/; use Clone qw/clone/; use DB::Utils qw/getCourseInfo getUserInfo/; use DB::Exception; -use Exception::Class ( 'DB::Exception::CourseNotFound', 'DB::Exception::CourseExists' ); +use Exception::Class ('DB::Exception::CourseNotFound', 'DB::Exception::CourseExists'); use DB::TestUtils qw/removeIDs/; use WeBWorK3::Utils::Settings qw/getDefaultCourseSettings mergeCourseSettings @@ -38,7 +38,6 @@ A Course as a hashref with the fields described in L =cut - =head2 getCourses This gets a list of Courses stored in the database in the C table. @@ -55,7 +54,7 @@ if C<$as_result_set> is true. Otherwise an array of hash_ref. =cut sub getCourses { - my ( $self, $as_result_set ) = @_; + my ($self, $as_result_set) = @_; my @courses = $self->search(); return @courses if $as_result_set; return map { @@ -89,9 +88,9 @@ of the fields. See above. =cut sub getCourse { - my ( $self, $course_info, $as_result_set ) = @_; - my $course = $self->find( getCourseInfo($course_info) ); - DB::Exception::CourseNotFound->throw( course_name => $course_info ) unless defined($course); + my ($self, $course_info, $as_result_set) = @_; + my $course = $self->find(getCourseInfo($course_info)); + DB::Exception::CourseNotFound->throw(course_name => $course_info) unless defined($course); return $course if $as_result_set; return { $course->get_inflated_columns }; @@ -120,19 +119,18 @@ of the fields. See above. =cut - sub addCourse { - my ( $self, $course_params, $as_result_set ) = @_; - DB::Exception::ParametersNeeded->throw( message => "The parameters must include course_name" ) - unless defined( $course_params->{course_name} ); + my ($self, $course_params, $as_result_set) = @_; + DB::Exception::ParametersNeeded->throw(message => "The parameters must include course_name") + unless defined($course_params->{course_name}); ## check if the course exists. If so throw an error. - my $course = $self->find( { course_name => $course_params->{course_name} } ); - DB::Exception::CourseExists->throw( course_name => $course_params->{course_name} ) if defined($course); + my $course = $self->find({ course_name => $course_params->{course_name} }); + DB::Exception::CourseExists->throw(course_name => $course_params->{course_name}) if defined($course); my $params = {}; for my $field (qw/course_name visible course_dates/) { # this should be looked up - $params->{$field} = $course_params->{$field} if defined( $course_params->{$field} ); + $params->{$field} = $course_params->{$field} if defined($course_params->{$field}); } $params->{course_settings} = {}; @@ -168,10 +166,9 @@ of the fields. See above. =cut - sub deleteCourse { - my ( $self, $course_info, $as_result_set ) = @_; - my $course_to_delete = $self->getCourse( getCourseInfo($course_info), 1 ); + my ($self, $course_info, $as_result_set) = @_; + my $course_to_delete = $self->getCourse(getCourseInfo($course_info), 1); my $deleted_course = $course_to_delete->delete; return $deleted_course if $as_result_set; @@ -200,8 +197,8 @@ The updated course as a C object. =cut sub updateCourse { - my ( $self, $course_info, $course_params, $as_result_set ) = @_; - my $course = $self->getCourse( getCourseInfo($course_info), 1 ); + my ($self, $course_info, $course_params, $as_result_set) = @_; + my $course = $self->getCourse(getCourseInfo($course_info), 1); ## TODO: check the validity of the params my $course_to_return = $course->update($course_params); @@ -249,10 +246,10 @@ if C<$as_result_set> is true. Otherwise an array of hash_ref. =cut sub getUserCourses { - my ( $self, $user_info, $as_result_set ) = @_; - my $user = $self->result_source->schema->resultset("User")->getGlobalUser( getUserInfo($user_info), 1 ); + my ($self, $user_info, $as_result_set) = @_; + my $user = $self->result_source->schema->resultset("User")->getGlobalUser(getUserInfo($user_info), 1); - my @user_courses = $self->search( { 'course_users.user_id' => $user->user_id }, { prefetch => ['course_users'] } ); + my @user_courses = $self->search({ 'course_users.user_id' => $user->user_id }, { prefetch => ['course_users'] }); # my @user_courses = $course_user->courses(); return @user_courses if $as_result_set; @@ -283,24 +280,24 @@ if C<$as_result_set> is true. Otherwise an array of hash_ref. =cut sub getCourseSettings { - my ( $self, $course_info, $as_result_set ) = @_; - my $course = $self->getCourse( $course_info, 1 ); + my ($self, $course_info, $as_result_set) = @_; + my $course = $self->getCourse($course_info, 1); - my $course_settings = getDefaultCourseValues( getDefaultCourseSettings() ); + my $course_settings = getDefaultCourseValues(getDefaultCourseSettings()); my $settings_from_db = { $course->course_settings->get_inflated_columns }; - return mergeCourseSettings( $course_settings, $settings_from_db ); + return mergeCourseSettings($course_settings, $settings_from_db); } sub updateCourseSettings { - my ( $self, $course_info, $course_settings, $as_result_set ) = @_; - my $course = $self->getCourse( $course_info, 1 ); + my ($self, $course_info, $course_settings, $as_result_set) = @_; + my $course = $self->getCourse($course_info, 1); validateCourseSettings($course_settings); my $current_settings = { $course->course_settings->get_inflated_columns }; - my $updated_settings = mergeCourseSettings( $current_settings, $course_settings ); + my $updated_settings = mergeCourseSettings($current_settings, $course_settings); my $cs = $course->course_settings->update($updated_settings); - return mergeCourseSettings( getDefaultCourseValues( getDefaultCourseSettings() ), { $cs->get_inflated_columns } ); + return mergeCourseSettings(getDefaultCourseValues(getDefaultCourseSettings()), { $cs->get_inflated_columns }); } 1; diff --git a/lib/DB/Schema/ResultSet/Problem.pm b/lib/DB/Schema/ResultSet/Problem.pm index 948a7569..f9ef7591 100644 --- a/lib/DB/Schema/ResultSet/Problem.pm +++ b/lib/DB/Schema/ResultSet/Problem.pm @@ -32,7 +32,7 @@ if C<$as_result_set> is true. Otherwise an array of hash_ref. =cut sub getGlobalProblems { - my ( $self, $as_result_set ) = @_; + my ($self, $as_result_set) = @_; my @problems = $self->search(); return @problems if $as_result_set; return map { @@ -74,12 +74,12 @@ An arrayref of the problems. =cut sub getProblems { - my ( $self, $course_info, $as_result_set ) = @_; + my ($self, $course_info, $as_result_set) = @_; my $course_rs = $self->result_source->schema->resultset("Course"); - my $course = $course_rs->getCourse( $course_info, 1 ); + my $course = $course_rs->getCourse($course_info, 1); my @problems = - $self->search( { 'problem_set.course_id' => $course->course_id }, { prefetch => [qw/problem_set/] } ); + $self->search({ 'problem_set.course_id' => $course->course_id }, { prefetch => [qw/problem_set/] }); return \@problems if $as_result_set; return map { @@ -91,13 +91,13 @@ sub getProblems { } sub getSetProblems { - my ( $self, $course_set_info, $as_result_set ) = @_; + my ($self, $course_set_info, $as_result_set) = @_; my $course_rs = $self->result_source->schema->resultset("Course"); my $problem_set_rs = $self->result_source->schema->resultset("ProblemSet"); - my $problem_set = $problem_set_rs->getProblemSet( $course_set_info, 1 ); - my @problems = $self->search( { 'set_id' => $problem_set->set_id } ); + my $problem_set = $problem_set_rs->getProblemSet($course_set_info, 1); + my @problems = $self->search({ 'set_id' => $problem_set->set_id }); return \@problems if $as_result_set; return map { @@ -126,10 +126,10 @@ A hashref containing =cut sub getSetProblem { - my ( $self, $course_set_problem_info, $as_result_set ) = @_; + my ($self, $course_set_problem_info, $as_result_set) = @_; my $course_set_info = { %{ getCourseInfo($course_set_problem_info) }, %{ getSetInfo($course_set_problem_info) } }; my $problem_set_rs = $self->result_source->schema->resultset("ProblemSet"); - my $problem_set = $problem_set_rs->getProblemSet( $course_set_info, 1 ); + my $problem_set = $problem_set_rs->getProblemSet($course_set_info, 1); my $problem_info = getProblemInfo($course_set_problem_info); my $problem = $problem_set->problems->find($problem_info); @@ -155,8 +155,8 @@ Add a single problem to an existing problem set within a course =cut sub addSetProblem { - my ( $self, $course_set_info, $new_problem_params, $as_result_set ) = @_; - my $problem_set = $self->result_source->schema->resultset("ProblemSet")->getProblemSet( $course_set_info, 1 ); + my ($self, $course_set_info, $new_problem_params, $as_result_set) = @_; + my $problem_set = $self->result_source->schema->resultset("ProblemSet")->getProblemSet($course_set_info, 1); # set the problem number to one more than the set's largest $new_problem_params->{problem_number} = 1 + ($problem_set->problems->get_column('problem_number')->max // 0); @@ -183,12 +183,12 @@ delete a single problem to an existing problem set within a course =cut sub deleteSetProblem { - my ( $self, $course_set_problem_info, $problem_params, $as_result_set ) = @_; - my $set_problem = $self->getSetProblem( $course_set_problem_info, 1 ); + my ($self, $course_set_problem_info, $problem_params, $as_result_set) = @_; + my $set_problem = $self->getSetProblem($course_set_problem_info, 1); my $problem_set = $self->result_source->schema->resultset("ProblemSet") - ->getProblemSet( { course_id => $set_problem->problem_set->course_id, set_id => $set_problem->set_id }, 1 ); + ->getProblemSet({ course_id => $set_problem->problem_set->course_id, set_id => $set_problem->set_id }, 1); - my $problem = $problem_set->search_related( "problems", getProblemInfo($course_set_problem_info) )->single; + my $problem = $problem_set->search_related("problems", getProblemInfo($course_set_problem_info))->single; my $deleted_problem = $problem->delete; diff --git a/lib/DB/Schema/ResultSet/ProblemPool.pm b/lib/DB/Schema/ResultSet/ProblemPool.pm index a1154a85..d3ea9268 100644 --- a/lib/DB/Schema/ResultSet/ProblemPool.pm +++ b/lib/DB/Schema/ResultSet/ProblemPool.pm @@ -37,8 +37,8 @@ if C<$as_result_set> is true. Otherwise an array of hash_ref. =cut sub getAllProblemPools { - my ( $self, $as_result_set ) = @_; - my @problem_pools = $self->search( {}, { prefetch => [qw/courses/] } ); + my ($self, $as_result_set) = @_; + my @problem_pools = $self->search({}, { prefetch => [qw/courses/] }); return @problem_pools if $as_result_set; return map { { $_->get_inflated_columns, course_name => $_->courses->course_name }; @@ -52,11 +52,11 @@ Get all problem pools for a given course =cut sub getProblemPools { - my ( $self, $course_info, $as_result_set ) = @_; + my ($self, $course_info, $as_result_set) = @_; my $course_rs = $self->result_source->schema->resultset("Course"); - my $course = $course_rs->getCourse( $course_info, 1 ); + my $course = $course_rs->getCourse($course_info, 1); - my @pools = $self->search( { 'courses.course_id' => $course->course_id }, { prefetch => [qw/courses/] } ); + my @pools = $self->search({ 'courses.course_id' => $course->course_id }, { prefetch => [qw/courses/] }); return \@pools if $as_result_set; return map { @@ -78,21 +78,20 @@ Get a single problem pool for a given course =cut sub getProblemPool { - my ( $self, $course_pool_info, $as_result_set ) = @_; + my ($self, $course_pool_info, $as_result_set) = @_; my $course_rs = $self->result_source->schema->resultset("Course"); - my $course = $course_rs->getCourse( getCourseInfo($course_pool_info), 1 ); + my $course = $course_rs->getCourse(getCourseInfo($course_pool_info), 1); my $search_info = getPoolInfo($course_pool_info); $search_info->{'courses.course_id'} = $course->course_id; - my $pool = $self->find( $search_info, { join => [qw/courses/] } ); + my $pool = $self->find($search_info, { join => [qw/courses/] }); unless ($pool) { my $course_name = $course->course_name; DB::Exception::PoolNotInCourse->throw( - message => "The pool with name \{$course_pool_info->{pool_name}} is not in the course $course_name" - ); + message => "The pool with name \{$course_pool_info->{pool_name}} is not in the course $course_name"); } return $pool if $as_result_set; return { $pool->get_columns }; @@ -106,27 +105,28 @@ Add a problem pool for a given course =cut sub addProblemPool { - my ( $self, $course_info, $pool_params, $as_result_set ) = @_; + my ($self, $course_info, $pool_params, $as_result_set) = @_; my $course_rs = $self->result_source->schema->resultset("Course"); - my $course = $course_rs->getCourse( getCourseInfo($course_info), 1 ); + my $course = $course_rs->getCourse(getCourseInfo($course_info), 1); my $course_name = $course->course_name; - DB::Exception::ParametersNeeded->throw( message => "The pool_name is missing from the parameters" ) - unless defined( $pool_params->{pool_name} ); + DB::Exception::ParametersNeeded->throw(message => "The pool_name is missing from the parameters") + unless defined($pool_params->{pool_name}); my $existing_pool = $self->find( - { 'courses.course_id' => $course->course_id, + { + 'courses.course_id' => $course->course_id, pool_name => $pool_params->{pool_name} }, { prefetch => [qw/courses/] } ); - DB::Exception::PoolAlreadyInCourse->throw( course_name => $course_name, pool_name => $pool_params->{pool_name} ) + DB::Exception::PoolAlreadyInCourse->throw(course_name => $course_name, pool_name => $pool_params->{pool_name}) if defined($existing_pool); my $pool_to_add = $self->new($pool_params); - my $problem_pool = $course->add_to_problem_pools( { $pool_to_add->get_columns } ); + my $problem_pool = $course->add_to_problem_pools({ $pool_to_add->get_columns }); return $problem_pool if $as_result_set; return { $problem_pool->get_columns }; @@ -140,9 +140,9 @@ updates the parameters of an existing problem pool =cut sub updateProblemPool { - my ( $self, $course_pool_info, $pool_params, $as_result_set ) = @_; + my ($self, $course_pool_info, $pool_params, $as_result_set) = @_; - my $pool = $self->getProblemPool( $course_pool_info, 1 ); + my $pool = $self->getProblemPool($course_pool_info, 1); DB::Excpetion::PoolNotInCourse->throw( course_name => getCourseInfo($course_pool_info), @@ -165,11 +165,11 @@ updates the parameters of an existing problem pool =cut sub deleteProblemPool { - my ( $self, $course_pool_info, $pool_params, $as_result_set ) = @_; + my ($self, $course_pool_info, $pool_params, $as_result_set) = @_; - my $pool = $self->getProblemPool( $course_pool_info, 1 ); + my $pool = $self->getProblemPool($course_pool_info, 1); - DB::Exception::PoolNotInCourse->throws( error => "The problem pool does not exist" ) + DB::Exception::PoolNotInCourse->throws(error => "The problem pool does not exist") unless defined($pool); my $deleted_pool = $pool->delete(); @@ -209,29 +209,27 @@ This gets a single problem out of a ProblemPool. =cut sub getPoolProblem { - my ( $self, $course_pool_problem_info, $as_result_set ) = @_; + my ($self, $course_pool_problem_info, $as_result_set) = @_; my $course_pool_info = { %{ getCourseInfo($course_pool_problem_info) }, %{ getPoolInfo($course_pool_problem_info) } }; - my $problem_pool = $self->getProblemPool( $course_pool_info, 1 ); + my $problem_pool = $self->getProblemPool($course_pool_info, 1); my $pool_problem_info = {}; try { # if problem_info was passed in, then parse it. $pool_problem_info = getPoolProblemInfo($course_pool_problem_info); - } - catch { # else just use an empty hash; + } catch { # else just use an empty hash; $pool_problem_info = {}; }; - my @pool_problems = $problem_pool->search_related( "pool_problems", $pool_problem_info )->all; + my @pool_problems = $problem_pool->search_related("pool_problems", $pool_problem_info)->all; - if ( scalar(@pool_problems) == 1 ) { + if (scalar(@pool_problems) == 1) { return $pool_problems[0] if $as_result_set; return { $pool_problems[0]->get_columns }; - } - else { # pick a random problem. + } else { # pick a random problem. my $prob = $pool_problems[ rand @pool_problems ]; return $prob if $as_result_set; return { $prob->get_inflated_columns }; @@ -245,22 +243,22 @@ This adds a problem as a hashref to an existing problem pool. =cut sub addProblemToPool { - my ( $self, $course_pool_info, $problem_params, $as_result_set ) = @_; + my ($self, $course_pool_info, $problem_params, $as_result_set) = @_; - my $pool = $self->getProblemPool( $course_pool_info, 1 ); + my $pool = $self->getProblemPool($course_pool_info, 1); DB::Exception::PoolNotInCourse->throw( message => "The pool with name \{$pool->{pool_name}} is not in the course " - . getCourseInfo($course_pool_info)->{course_name} - ) unless defined($pool); + . getCourseInfo($course_pool_info)->{course_name}) + unless defined($pool); my $course_rs = $self->result_source->schema->resultset("Course"); - my $course = $course_rs->find( { course_id => $pool->course_id } ); + my $course = $course_rs->find({ course_id => $pool->course_id }); my $problem_pool_rs = $self->result_source->schema->resultset("PoolProblem"); $problem_params->{problem_pool_id} = $pool->problem_pool_id; my $pool_problem = $problem_pool_rs->new($problem_params); - my $added_problem = $pool->add_to_pool_problems( { $pool_problem->get_columns } ); + my $added_problem = $pool->add_to_pool_problems({ $pool_problem->get_columns }); return $added_problem if $as_result_set; return { $added_problem->get_inflated_columns }; @@ -294,14 +292,14 @@ updated an existing problem to an existing ProblemPool in a course =cut sub updatePoolProblem { - my ( $self, $course_pool_problem_info, $prob_params, $as_result_set ) = @_; - my $prob = $self->getPoolProblem( $course_pool_problem_info, 1 ); - DB::Exception::PoolProblemNotInPool->throw( info => $course_pool_problem_info ) unless defined($prob); + my ($self, $course_pool_problem_info, $prob_params, $as_result_set) = @_; + my $prob = $self->getPoolProblem($course_pool_problem_info, 1); + DB::Exception::PoolProblemNotInPool->throw(info => $course_pool_problem_info) unless defined($prob); my $problem_pool_rs = $self->result_source->schema->resultset("PoolProblem"); my $prob_to_update = $problem_pool_rs->new($prob_params); - my $prob2 = $prob->update( { $prob_to_update->get_columns } ); + my $prob2 = $prob->update({ $prob_to_update->get_columns }); return $prob2 if $as_result_set; return { $prob2->get_inflated_columns }; } diff --git a/lib/DB/Schema/ResultSet/ProblemSet.pm b/lib/DB/Schema/ResultSet/ProblemSet.pm index a230ec61..dff4b103 100644 --- a/lib/DB/Schema/ResultSet/ProblemSet.pm +++ b/lib/DB/Schema/ResultSet/ProblemSet.pm @@ -43,19 +43,15 @@ An array of courses as a C object. =cut sub getAllProblemSets { - my $self = shift; - my $problem_set_rs = $self->search( undef, { prefetch => 'courses' } ); + my $self = shift; + my $problem_set_rs = $self->search(undef, { prefetch => 'courses' }); my @all_sets = (); - while( my $set = $problem_set_rs->next) { + while (my $set = $problem_set_rs->next) { my $expanded_set = - { - $set->get_inflated_columns, - $set->courses->get_inflated_columns, - set_type => $set->set_type - }; + { $set->get_inflated_columns, $set->courses->get_inflated_columns, set_type => $set->set_type }; delete $expanded_set->{type}; - push(@all_sets,$expanded_set); + push(@all_sets, $expanded_set); } return @all_sets; @@ -74,13 +70,13 @@ Get all problem sets for a given course =cut sub getProblemSets { - my ( $self, $course_info, $set_params, $as_result_set ) = @_; + my ($self, $course_info, $set_params, $as_result_set) = @_; # my $search_params = $self->getCourseInfo($course_info); ## return a hash of course info - my $course_rs = $self->result_source->schema->resultset("Course"); - my $course = $course_rs->getCourse( $course_info, 1 ); + my $course_rs = $self->result_source->schema->resultset("Course"); + my $course = $course_rs->getCourse($course_info, 1); - my $problem_sets = $self->search( { 'me.course_id' => $course->course_id }, { prefetch => ["courses"] } ); - my $sets = _formatSets($problem_sets); + my $problem_sets = $self->search({ 'me.course_id' => $course->course_id }, { prefetch => ["courses"] }); + my $sets = _formatSets($problem_sets); return @$sets; } @@ -92,26 +88,22 @@ Get all hw sets for a given course sub _formatSets { my $problem_sets = shift; - my @sets = (); - while( my $set = $problem_sets->next) { - my $expanded_set = - { - $set->get_inflated_columns, - set_type => $set->set_type - }; + my @sets = (); + while (my $set = $problem_sets->next) { + my $expanded_set = { $set->get_inflated_columns, set_type => $set->set_type }; delete $expanded_set->{type}; - push(@sets,$expanded_set); + push(@sets, $expanded_set); } return \@sets; } sub getHWSets { - my ( $self, $course_info, $as_result_set ) = @_; + my ($self, $course_info, $as_result_set) = @_; my $search_params = getCourseInfo($course_info); # pull out the course_info that is passed $search_params->{'me.type'} = 1; # set the type to search for. - my $quizzes = $self->search( $search_params, { prefetch => ["courses"] } ); - my $sets = _formatSets($quizzes); + my $quizzes = $self->search($search_params, { prefetch => ["courses"] }); + my $sets = _formatSets($quizzes); return @$sets; } @@ -122,11 +114,11 @@ Get all quizzes for a given course =cut sub getQuizzes { - my ( $self, $course_info, $as_result_set ) = @_; + my ($self, $course_info, $as_result_set) = @_; my $search_params = getCourseInfo($course_info); # pull out the course_info that is passed $search_params->{'me.type'} = 2; # set the type to search for. - my @sets = $self->search( $search_params, { prefetch => ["courses"] } ); + my @sets = $self->search($search_params, { prefetch => ["courses"] }); return \@sets if $as_result_set; return map { { $_->get_inflated_columns, set_type => $_->set_type }; @@ -140,22 +132,19 @@ Get one HW set for a given course =cut sub getProblemSet { - my ( $self, $course_set_info, $as_result_set ) = @_; + my ($self, $course_set_info, $as_result_set) = @_; my $course_info = getCourseInfo($course_set_info); my $course_rs = $self->result_source->schema->resultset("Course"); - my $course = $course_rs->getCourse( $course_info, 1 ); + my $course = $course_rs->getCourse($course_info, 1); - my $problem_set = $course->problem_sets->find( getSetInfo($course_set_info) ); + my $problem_set = $course->problem_sets->find(getSetInfo($course_set_info)); DB::Exception::SetNotInCourse->throw( set_name => getSetInfo($course_set_info), course_name => $course->course_name ) unless defined($problem_set); return $problem_set if $as_result_set; - my $set = { - $problem_set->get_inflated_columns, - set_type => $problem_set->set_type - }; + my $set = { $problem_set->get_inflated_columns, set_type => $problem_set->set_type }; delete $set->{type}; return $set; @@ -168,22 +157,21 @@ Get one HW set for a given course =cut sub addProblemSet { - my ( $self, $course_info, $params, $as_result_set ) = @_; - my $course = $self->result_source->schema->resultset("Course")->getCourse( getCourseInfo($course_info), 1 ); + my ($self, $course_info, $params, $as_result_set) = @_; + my $course = $self->result_source->schema->resultset("Course")->getCourse(getCourseInfo($course_info), 1); my $set_params = clone($params); $set_params->{type} = $SET_TYPES->{ $set_params->{set_type} || 'HW' }; delete $set_params->{set_type}; - - DB::Exception::ParametersNeeded->throw( message => "You must defined the field set_name in the 2nd argument" ) - unless defined( $set_params->{set_name} ); + DB::Exception::ParametersNeeded->throw(message => "You must defined the field set_name in the 2nd argument") + unless defined($set_params->{set_name}); ## check if the set exists. my $search_params = { course_id => $course->course_id, set_name => $set_params->{set_name} }; - my $problem_set = $self->find( $search_params, prefetch => 'courses' ); - DB::Exception::SetAlreadyExists->throws( set_name => $set_params->{set_name}, course_name => $course->course_name ) + my $problem_set = $self->find($search_params, prefetch => 'courses'); + DB::Exception::SetAlreadyExists->throws(set_name => $set_params->{set_name}, course_name => $course->course_name) if defined($problem_set); my $set_obj = $self->new($set_params); @@ -194,13 +182,10 @@ sub addProblemSet { $set_obj->validDates(); $set_obj->validParams(); - my $new_set = $course->add_to_problem_sets( $set_params, 1 ); + my $new_set = $course->add_to_problem_sets($set_params, 1); return $new_set if $as_result_set; - my $set = { - $new_set->get_inflated_columns, - set_type => $new_set->set_type - }; + my $set = { $new_set->get_inflated_columns, set_type => $new_set->set_type }; delete $set->{type}; return $set; } @@ -212,30 +197,26 @@ Update a problem set (HW, Quiz, etc.) for a given course =cut sub updateProblemSet { - my ( $self, $course_set_info, $updated_params, $as_result_set ) = @_; + my ($self, $course_set_info, $updated_params, $as_result_set) = @_; - my $problem_set = $self->getProblemSet( $course_set_info, 1 ); + my $problem_set = $self->getProblemSet($course_set_info, 1); my $set_params = { $problem_set->get_inflated_columns }; my $params = clone($updated_params); if (defined $params->{set_type}) { - $params->{type} = $SET_TYPES->{ $params->{set_type}}; + $params->{type} = $SET_TYPES->{ $params->{set_type} }; delete $params->{set_type}; } - - my $params2 = updateAllFields( $set_params, $params ); + my $params2 = updateAllFields($set_params, $params); my $set_obj = $self->new($params2); ## check the parameters are valid. $set_obj->validDates(); $set_obj->validParams(); - my $updated_set = $problem_set->update( { $set_obj->get_inflated_columns } ); + my $updated_set = $problem_set->update({ $set_obj->get_inflated_columns }); return $updated_set if $as_result_set; - my $set = { - $updated_set->get_inflated_columns, - set_type => $updated_set->set_type - }; + my $set = { $updated_set->get_inflated_columns, set_type => $updated_set->set_type }; delete $set->{type}; return $set; } @@ -247,16 +228,13 @@ Delete a problem set (HW, Quiz, etc.) for a given course =cut sub deleteProblemSet { - my ( $self, $course_set_info, $as_result_set ) = @_; + my ($self, $course_set_info, $as_result_set) = @_; - my $set_to_delete = $self->getProblemSet( $course_set_info, 1 ); + my $set_to_delete = $self->getProblemSet($course_set_info, 1); $set_to_delete->delete; return $set_to_delete if $as_result_set; - my $set = { - $set_to_delete->get_inflated_columns, - set_type => $set_to_delete->set_type - }; + my $set = { $set_to_delete->get_inflated_columns, set_type => $set_to_delete->set_type }; delete $set->{type}; return $set; } @@ -294,17 +272,16 @@ Creates a new version of a problem set for a given course for either any entire =cut sub newSetVersion { - my ( $self, $info ) = @_; + my ($self, $info) = @_; my $course_set_info = { %{ getCourseInfo($info) }, %{ getSetInfo($info) } }; my $problem_set = $self->getProblemSet($course_set_info); # if $info also contains user info my @fields = keys %$info; - if ( scalar(@fields) == 3 ) { + if (scalar(@fields) == 3) { my $user_info = getUserInfo($info); - } - else { + } else { my $user_set_rs = $self->result_source->schema->resultset("UserSet"); # @user_sets = $user_set_rs->get diff --git a/lib/DB/Schema/ResultSet/User.pm b/lib/DB/Schema/ResultSet/User.pm index 319295fb..28b53b0b 100644 --- a/lib/DB/Schema/ResultSet/User.pm +++ b/lib/DB/Schema/ResultSet/User.pm @@ -1,3 +1,4 @@ + =head1 DESCRIPTION This is the functionality of a User in WeBWorK. This package is based on @@ -17,7 +18,7 @@ use Clone qw/clone/; use DB::Utils qw/getCourseInfo getUserInfo removeLoginParams/; use DB::Exception; -use Exception::Class ( 'DB::Exception::UserNotFound', 'DB::Exception::CourseExists', "DB::Exception::UserNotInCourse" ); +use Exception::Class ('DB::Exception::UserNotFound', 'DB::Exception::CourseExists', "DB::Exception::UserNotInCourse"); =head1 getAllGlobalUsers @@ -34,10 +35,10 @@ An array of courses as a C object. =cut sub getAllGlobalUsers { - my ( $self, $as_result_set ) = @_; - my @users = $self->search( {} ); + my ($self, $as_result_set) = @_; + my @users = $self->search({}); return \@users if $as_result_set; - return map { removeLoginParams( { $_->get_inflated_columns } ); } @users; + return map { removeLoginParams({ $_->get_inflated_columns }); } @users; } =head1 getGlobalUser @@ -62,9 +63,9 @@ C determine which is returned. =cut sub getGlobalUser { - my ( $self, $user_info, $as_result_set ) = @_; - my $user = $self->find( getUserInfo($user_info) ); - DB::Exception::UserNotFound->throw( username => $user_info ) unless defined($user); + my ($self, $user_info, $as_result_set) = @_; + my $user = $self->find(getUserInfo($user_info)); + DB::Exception::UserNotFound->throw(username => $user_info) unless defined($user); return $user if $as_result_set; my $params = { $user->get_inflated_columns }; $params->{role} = "admin" if $user->is_admin; @@ -102,18 +103,18 @@ The user as C object or C if no user exist ### TODO: check that other params are legal sub addGlobalUser { - my ( $self, $user_params, $as_result_set ) = @_; - DB::Exception::ParametersNeeded->throw( message => "The parameters must include username" ) - unless defined( $user_params->{username} ); + my ($self, $user_params, $as_result_set) = @_; + DB::Exception::ParametersNeeded->throw(message => "The parameters must include username") + unless defined($user_params->{username}); my $params = clone($user_params); # remove the user_id if defined and equal to zero. - if ( defined ($params->{user_id}) && $params->{user_id} == 0) { + if (defined($params->{user_id}) && $params->{user_id} == 0) { delete $params->{user_id}; } my $new_user = $self->create($params); return $new_user if $as_result_set; - return removeLoginParams( { $new_user->get_columns } ); + return removeLoginParams({ $new_user->get_columns }); } =head1 deleteGlobalUser @@ -139,12 +140,12 @@ The deleted user as a C object. ## TODO: delete everything related to the user from all tables. sub deleteGlobalUser { - my ( $self, $user_info, $as_result_set ) = @_; - my $user_to_delete = $self->getGlobalUser( $user_info, 1 ); + my ($self, $user_info, $as_result_set) = @_; + my $user_to_delete = $self->getGlobalUser($user_info, 1); my $deleted_user = $user_to_delete->delete; return $deleted_user if $as_result_set; - return removeLoginParams( { $deleted_user->get_inflated_columns } ); + return removeLoginParams({ $deleted_user->get_inflated_columns }); } =head1 updateGlobalUser @@ -184,21 +185,21 @@ The updated course as a C or a hashref. ## TODO: check that the user_params are valid. sub updateGlobalUser { - my ( $self, $user_info, $user_params, $as_result_set ) = @_; - my $user = $self->getGlobalUser( $user_info, 1 ); + my ($self, $user_info, $user_params, $as_result_set) = @_; + my $user = $self->getGlobalUser($user_info, 1); my $user_obj = $self->new($user_params); - my $updated_user = $user->update( { $user_obj->get_inflated_columns } ); + my $updated_user = $user->update({ $user_obj->get_inflated_columns }); return $updated_user if $as_result_set; - return removeLoginParams( { $updated_user->get_inflated_columns } ); + return removeLoginParams({ $updated_user->get_inflated_columns }); } ## This clearly needs to be fixed to include encryption of the password. # we need to decide on what encryption algorithm. sub authenticate { - my ( $self, $username, $password ) = @_; - my $user = $self->getGlobalUser( { username => $username }, 1 ); + my ($self, $username, $password) = @_; + my $user = $self->getGlobalUser({ username => $username }, 1); return $user->login_params->{password} eq $password; } @@ -227,20 +228,18 @@ An array of Users (as hashrefs) or an arrayref of Cresult_source->schema->resultset("Course"); - my $course = $course_rs->getCourse( getCourseInfo($course_info), 1 ); - my @users = $self->search( { 'course_users.course_id' => $course->course_id }, { prefetch => ["course_users"] } ); + my $course = $course_rs->getCourse(getCourseInfo($course_info), 1); + my @users = $self->search({ 'course_users.course_id' => $course->course_id }, { prefetch => ["course_users"] }); return \@users if $as_result_set; return map { - removeLoginParams( - { - # $_->get_columns, - $_->course_users->first->get_columns, - params => $_->course_users->first->get_inflated_column("params") - } - ); + removeLoginParams({ + # $_->get_columns, + $_->course_users->first->get_columns, + params => $_->course_users->first->get_inflated_column("params") + }); } @users; } @@ -265,24 +264,19 @@ An array of MergedCourseUsers (as hashrefs) =cut sub getMergedCourseUsers { - my ( $self, $course_info ) = @_; + my ($self, $course_info) = @_; my $course_rs = $self->result_source->schema->resultset("Course"); - my $course = $course_rs->getCourse( getCourseInfo($course_info), 1 ); - my @users = $self->search( { 'course_users.course_id' => $course->course_id }, { prefetch => ["course_users"] } ); + my $course = $course_rs->getCourse(getCourseInfo($course_info), 1); + my @users = $self->search({ 'course_users.course_id' => $course->course_id }, { prefetch => ["course_users"] }); return map { - removeLoginParams( - { - $_->get_columns, - $_->course_users->first->get_columns, - params => $_->course_users->first->get_inflated_column("params") - } - ); + removeLoginParams({ + $_->get_columns, $_->course_users->first->get_columns, + params => $_->course_users->first->get_inflated_column("params") + }); } @users; } - - ### # # CRUD for users in a course @@ -319,12 +313,14 @@ An hashref of the user. =cut sub getUser { - my ( $self, $course_user_info, $as_result_set ) = @_; + my ($self, $course_user_info, $as_result_set) = @_; my $course_info = getCourseInfo($course_user_info); - my $course = $self->result_source->schema->resultset("Course")->getCourse( $course_info, 1 ); - my $course_user = $course->users->find( getUserInfo($course_user_info) ); - DB::Exception::UserNotInCourse->throw( course_name => $course->course_name, username => $course_user_info->{username} ) - unless defined($course_user); + my $course = $self->result_source->schema->resultset("Course")->getCourse($course_info, 1); + my $course_user = $course->users->find(getUserInfo($course_user_info)); + DB::Exception::UserNotInCourse->throw( + course_name => $course->course_name, + username => $course_user_info->{username} + ) unless defined($course_user); return $course_user if $as_result_set; my $user_params = { $course_user->get_columns, $course_user->course_users->first->get_columns }; @@ -333,26 +329,24 @@ sub getUser { } sub getCourseUser { - my ( $self, $course_user_info, $as_result_set ) = @_; + my ($self, $course_user_info, $as_result_set) = @_; - my $course = $self->result_source->schema->resultset("Course") - ->getCourse(getCourseInfo($course_user_info),1); - my $user = $self->getGlobalUser(getUserInfo($course_user_info),1); - my @keys = keys %$course_user_info; + my $course = $self->result_source->schema->resultset("Course")->getCourse(getCourseInfo($course_user_info), 1); + my $user = $self->getGlobalUser(getUserInfo($course_user_info), 1); + my @keys = keys %$course_user_info; - DB::Exception::TooManyParameters->throw( - message => "Too many parameters were passed into getCourseUser" - ) if (scalar(@keys) != 2 ); + DB::Exception::TooManyParameters->throw(message => "Too many parameters were passed into getCourseUser") + if (scalar(@keys) != 2); my $course_user = $self->result_source->schema->resultset("CourseUser") - ->find({course_id => $course->course_id, user_id => $user->user_id}); + ->find({ course_id => $course->course_id, user_id => $user->user_id }); DB::Exception::UserNotInCourse->throw( - message => "The user ${\$user->username} is not enrolled in the course ${\$course->course_name}" - ) unless defined $course_user; + message => "The user ${\$user->username} is not enrolled in the course ${\$course->course_name}") + unless defined $course_user; return $course_user if $as_result_set; - return {$course_user->get_inflated_columns}; + return { $course_user->get_inflated_columns }; } @@ -372,24 +366,23 @@ The method returns only the information in the course_user table =cut sub addCourseUser { - my ( $self, $course_user_params, $as_result_set ) = @_; + my ($self, $course_user_params, $as_result_set) = @_; # warn "in addCourseUser"; # warn Dumper $course_user_params; - my $course = $self->result_source->schema->resultset("Course") - ->getCourse(getCourseInfo($course_user_params),1); - my $user = $self->getGlobalUser(getUserInfo($course_user_params),1); + my $course = $self->result_source->schema->resultset("Course")->getCourse(getCourseInfo($course_user_params), 1); + my $user = $self->getGlobalUser(getUserInfo($course_user_params), 1); # check if the user is already in the given course my $cu = $self->result_source->schema->resultset("CourseUser") - ->find({ user_id => $user->user_id, course_id => $course->course_id}); + ->find({ user_id => $user->user_id, course_id => $course->course_id }); ## remove the course_user_id if it is 0 (it's new) delete $course_user_params->{course_user_id} if defined($course_user_params->{course_user_id}) && $course_user_params->{course_user_id} == 0; DB::Exception::UserAlreadyInCourse->throw( - message => "The user with username: ${\$user->username} is already in the course: ${\$course->course_name}" - ) if defined($cu); + message => "The user with username: ${\$user->username} is already in the course: ${\$course->course_name}") + if defined($cu); my $params = clone($course_user_params); @@ -400,14 +393,13 @@ sub addCourseUser { ## still need to check params for validity. my $course_user = $self->result_source->schema->resultset("CourseUser")->new($params); - $course->add_to_users({user_id => $user->user_id}); + $course->add_to_users({ user_id => $user->user_id }); my $user_to_return = $self->result_source->schema->resultset("CourseUser") - ->find({course_id => $course->course_id, user_id => $user->user_id}) - ->update($params); + ->find({ course_id => $course->course_id, user_id => $user->user_id })->update($params); return $user_to_return if $as_result_set; - return {$user_to_return->get_inflated_columns}; + return { $user_to_return->get_inflated_columns }; } =head2 updateCourseUser @@ -417,13 +409,13 @@ This method updates the course user table =cut sub updateCourseUser { - my ( $self, $course_user_info, $course_user_params, $as_result_set ) = @_; - my $course_user = $self->getCourseUser($course_user_info,1); + my ($self, $course_user_info, $course_user_params, $as_result_set) = @_; + my $course_user = $self->getCourseUser($course_user_info, 1); my $course_user_to_return = $course_user->update($course_user_params); return $course_user_to_return if $as_result_set; - return {$course_user_to_return->get_inflated_columns}; + return { $course_user_to_return->get_inflated_columns }; } @@ -434,11 +426,11 @@ This method updates the course user table =cut sub deleteCourseUser { - my ( $self, $course_user_info, $course_user_params, $as_result_set ) = @_; - my $course_user_to_delete = $self->getCourseUser($course_user_info,1)->delete; + my ($self, $course_user_info, $course_user_params, $as_result_set) = @_; + my $course_user_to_delete = $self->getCourseUser($course_user_info, 1)->delete; return $course_user_to_delete if $as_result_set; - return {$course_user_to_delete->get_inflated_columns}; + return { $course_user_to_delete->get_inflated_columns }; } @@ -535,17 +527,17 @@ An hashref of the added user. # } sub _checkCourseUser { - my ( $self, $params ) = @_; + my ($self, $params) = @_; my @fields = keys %$params; my $course_user_rs = $self->result_source->schema->resultset("CourseUser"); my @cols = $course_user_rs->result_source->columns; - @cols = grep { !( $_ =~ /_id$/x ) } @cols; + @cols = grep { !($_ =~ /_id$/x) } @cols; - my @illegal_fields = array_minus( @fields, @cols ); + my @illegal_fields = array_minus(@fields, @cols); DB::Exception::ParametersNeeded->throw( - message => "The fields " . join( ", ", @illegal_fields ) . " are not legal for a user." - ) unless scalar(@illegal_fields) == 0; + message => "The fields " . join(", ", @illegal_fields) . " are not legal for a user.") + unless scalar(@illegal_fields) == 0; return 1; } diff --git a/lib/DB/Schema/ResultSet/UserSet.pm b/lib/DB/Schema/ResultSet/UserSet.pm index d3311379..e9cb8fb3 100644 --- a/lib/DB/Schema/ResultSet/UserSet.pm +++ b/lib/DB/Schema/ResultSet/UserSet.pm @@ -1,3 +1,4 @@ + =head1 DESCRIPTION This is the functionality of a UserSet in WeBWorK. This package is based on @@ -17,7 +18,7 @@ use DB::Utils qw/getCourseInfo getUserInfo getSetInfo updateAllFields/; use DB::WithDates; use DB::WithParams; -use Exception::Class ( 'DB::Exception::UserSetExists' ); +use Exception::Class ('DB::Exception::UserSetExists'); =head2 getUserSets @@ -42,20 +43,20 @@ get all UserSet for a given course and either a given user or given set =cut sub getUserSetsForUser { - my ( $self, $info, $as_result_set ) = @_; + my ($self, $info, $as_result_set) = @_; my $course = $self->_getCourse($info); my $user = $self->_getUser($info); my $course_user = $self->_getCourseUser($info); - my @user_sets = $self->search( { course_user_id => $course_user->course_user_id } ); + my @user_sets = $self->search({ course_user_id => $course_user->course_user_id }); my @user_setids = map { { set_id => $_->set_id }; } @user_sets; - my @problem_sets = $course->problem_sets->search( \@user_setids ); + my @problem_sets = $course->problem_sets->search(\@user_setids); my @user_sets_to_return = (); - for my $i ( 0 .. $#user_sets ) { - my $params = _mergeUserSet($problem_sets[$i],$user_sets[$i],$user); - push( @user_sets_to_return, $params ); + for my $i (0 .. $#user_sets) { + my $params = _mergeUserSet($problem_sets[$i], $user_sets[$i], $user); + push(@user_sets_to_return, $params); } return @user_sets_to_return; @@ -68,17 +69,17 @@ get an array of all user sets for a given problem set (HW, quiz, etc.) =cut sub getUserSetsForSet { - my ( $self, $set_info, $as_result_set ) = @_; + my ($self, $set_info, $as_result_set) = @_; my $course = $self->_getCourse($set_info); - my $problem_set = $self->_getProblemSet( - { - course_id => $course->course_id, %{getSetInfo($set_info)} - }); + my $problem_set = $self->_getProblemSet({ + course_id => $course->course_id, + %{ getSetInfo($set_info) } + }); my @user_sets = $self->search( { - set_id => $problem_set->set_id + set_id => $problem_set->set_id }, { prefetch => { course_users => 'users' } @@ -86,10 +87,9 @@ sub getUserSetsForSet { ); my @user_sets_to_return = (); - for my $i ( 0 .. $#user_sets ) { - my $params = _mergeUserSet($problem_set,$user_sets[$i], - $user_sets[$i]->course_users->users); - push( @user_sets_to_return, $params ); + for my $i (0 .. $#user_sets) { + my $params = _mergeUserSet($problem_set, $user_sets[$i], $user_sets[$i]->course_users->users); + push(@user_sets_to_return, $params); } return @user_sets_to_return; } @@ -101,11 +101,11 @@ get a single UserSet for a given course, user, and ProblemSet =cut sub getUserSet { - my ( $self, $user_set_info, $as_result_set ) = @_; + my ($self, $user_set_info, $as_result_set) = @_; - my $problem_set = $self->_getProblemSet( $user_set_info); - my $user = $self->_getUser($user_set_info); - my $course_user = $self->_getCourseUser( $user_set_info); + my $problem_set = $self->_getProblemSet($user_set_info); + my $user = $self->_getUser($user_set_info); + my $course_user = $self->_getCourseUser($user_set_info); my $user_set = $self->find( { @@ -116,7 +116,7 @@ sub getUserSet { { prefetch => [qw/problem_sets/] } ); return $user_set if $as_result_set; - return _mergeUserSet($problem_set,$user_set,$user); + return _mergeUserSet($problem_set, $user_set, $user); } =head2 addUserSet @@ -126,21 +126,21 @@ add a single UserSet for a given course, user, and ProblemSet =cut sub addUserSet { - my ( $self, $user_set_info, $user_set_params, $as_result_set ) = @_; + my ($self, $user_set_info, $user_set_params, $as_result_set) = @_; my $problem_set = $self->_getProblemSet($user_set_info); - my $user = $self->_getUser($user_set_info); + my $user = $self->_getUser($user_set_info); my $course_user = $self->_getCourseUser($user_set_info); DB::Exception::UserSetExists->throw( - username => $user->username, - set_name => $problem_set->set_name, + username => $user->username, + set_name => $problem_set->set_name, course_name => $problem_set->course_id - ) if $self->getUserSet($user_set_info,1); + ) if $self->getUserSet($user_set_info, 1); my $params = { course_user_id => $course_user->course_user_id, - set_id => $problem_set->set_id + set_id => $problem_set->set_id }; for my $key (keys %$user_set_params) { @@ -151,15 +151,15 @@ sub addUserSet { my $new_user_set = $self->new($params); $new_user_set->validParams($problem_set->type) if $new_user_set->params; - $new_user_set->validDates($problem_set->type) if $new_user_set->dates; + $new_user_set->validDates($problem_set->type) if $new_user_set->dates; my $user_set = $problem_set->add_to_user_sets($params); ## add_to_user_set not getting default values, so get the just added user_set - my $s = $self->find({user_set_id => $user_set->user_set_id}); + my $s = $self->find({ user_set_id => $user_set->user_set_id }); return $user_set if $as_result_set; - return _mergeUserSet($problem_set,$s,$user); + return _mergeUserSet($problem_set, $s, $user); } =head2 updateUserSet @@ -169,14 +169,14 @@ update a single UserSet for a given course, user, and ProblemSet =cut sub updateUserSet { - my ( $self, $user_set_info, $user_set_params, $as_result_set ) = @_; + my ($self, $user_set_info, $user_set_params, $as_result_set) = @_; - my $user_set = $self->getUserSet( $user_set_info, 1 ); + my $user_set = $self->getUserSet($user_set_info, 1); DB::Exception::UserSetNotInCourse->throw( - set_name => $user_set_info->{set_name}, + set_name => $user_set_info->{set_name}, course_name => $user_set_info->{course_name}, - username => $user_set_info->{username} + username => $user_set_info->{username} ) unless defined($user_set); ## only allow params and dates to be updated @@ -187,21 +187,21 @@ sub updateUserSet { } my $problem_set = $self->_getProblemSet($user_set_info); - my $user = $self->_getUser($user_set_info); + my $user = $self->_getUser($user_set_info); ## make sure the parameters and dates are valid. my $new_user_set = $self->new($user_set_params); $new_user_set->validParams($problem_set->type) if $new_user_set->params; - $new_user_set->validDates($problem_set->type) if $new_user_set->dates; + $new_user_set->validDates($problem_set->type) if $new_user_set->dates; my $updated_user_set = $user_set->update($user_set_params); - ## update not getting all values, so get the user_set - my $s = $self->find({user_set_id => $user_set->user_set_id}); + ## update not getting all values, so get the user_set + my $s = $self->find({ user_set_id => $user_set->user_set_id }); return $updated_user_set if $as_result_set; - return _mergeUserSet($problem_set,$s,$user); + return _mergeUserSet($problem_set, $s, $user); } =head2 deleteUserSet @@ -211,22 +211,22 @@ delete a single UserSet for a given course, user, and ProblemSet =cut sub deleteUserSet { - my ( $self, $user_set_info, $user_set_params, $as_result_set ) = @_; + my ($self, $user_set_info, $user_set_params, $as_result_set) = @_; - my $user_set = $self->getUserSet( $user_set_info, 1 ); + my $user_set = $self->getUserSet($user_set_info, 1); DB::Exception::UserSetNotInCourse->throw( - set_name => $user_set_info->{set_name}, + set_name => $user_set_info->{set_name}, course_name => $user_set_info->{course_name}, - username => $user_set_info->{username} + username => $user_set_info->{username} ) unless defined($user_set); my $problem_set = $self->_getProblemSet($user_set_info); - my $user = $self->_getUser($user_set_info); + my $user = $self->_getUser($user_set_info); $user_set->delete; return $user_set if $as_result_set; - return _mergeUserSet($problem_set,$user_set,$user); + return _mergeUserSet($problem_set, $user_set, $user); } @@ -251,47 +251,49 @@ sub _user_rs { # return the course/set info given the user_set_info is passed in sub _getProblemSet { - my ($self,$info) = @_; + my ($self, $info) = @_; my $set_info = { %{ getCourseInfo($info) }, %{ getSetInfo($info) } }; - return $self->_problem_set_rs->getProblemSet($set_info,1); + return $self->_problem_set_rs->getProblemSet($set_info, 1); } # return the course/set info given the user_set_info is passed in sub _getUser { - my ($self,$info) = @_; + my ($self, $info) = @_; my $user_info = { %{ getCourseInfo($info) }, %{ getUserInfo($info) } }; - return $self->_user_rs->getUser($user_info,1); + return $self->_user_rs->getUser($user_info, 1); } # return the course/set info given the user_set_info is passed in sub _getCourse { - my ($self,$info) = @_; - return $self->_course_rs->getCourse(getCourseInfo($info),1); + my ($self, $info) = @_; + return $self->_course_rs->getCourse(getCourseInfo($info), 1); } # return the course user with the given data sub _getCourseUser { - my ($self,$info) = @_; + my ($self, $info) = @_; my $course = $self->_getCourse($info); - my $user = $self->_getUser( + my $user = $self->_getUser( { course_id => $course->course_id, - %{getUserInfo($info)} - }, 1 ); + %{ getUserInfo($info) } + }, + 1 + ); return $self->result_source->schema->resultset("CourseUser") - ->find({course_id => $course->course_id, user_id => $user->user_id}); + ->find({ course_id => $course->course_id, user_id => $user->user_id }); } # merge the user set data with the problem set information sub _mergeUserSet { - my ($problem_set,$user_set,$user) = @_; + my ($problem_set, $user_set, $user) = @_; # override the user set params - my $params = updateAllFields( $problem_set->params, $user_set->params ); + my $params = updateAllFields($problem_set->params, $user_set->params); # my $dates = updateAllFields( $problem_set->dates, $user_set->dates ); my $user_set_dates = $user_set->dates || {}; @@ -299,18 +301,17 @@ sub _mergeUserSet { # check if there are dates in the user_set # and use the user_set dates otherwise use the problem_set ones. my @date_fields = keys %$user_set_dates; - my $dates = (scalar(@date_fields) > 0) ? $user_set_dates : $problem_set->dates; + my $dates = (scalar(@date_fields) > 0) ? $user_set_dates : $problem_set->dates; return { $user_set->get_columns, - set_type => $problem_set->set_type, - set_name => $problem_set->set_name, + set_type => $problem_set->set_type, + set_name => $problem_set->set_name, set_visible => $problem_set->set_visible, - dates => $dates, - params => $params, - username => $user->username + dates => $dates, + params => $params, + username => $user->username }; } - 1; diff --git a/lib/DB/TestUtils.pm b/lib/DB/TestUtils.pm index 3ac89a3b..84e975b0 100644 --- a/lib/DB/TestUtils.pm +++ b/lib/DB/TestUtils.pm @@ -23,7 +23,7 @@ field starting with PARAM: and DATE: respectively. =cut sub buildHash { - my $input = shift; + my $input = shift; my $output = { params => {}, dates => {} }; for my $key (keys %{$input}) { if ($key =~ /^PARAM:(.*)/x) { @@ -34,17 +34,17 @@ sub buildHash { $output->{$key} = $input->{$key}; } } - my @date_fields = keys %{$output->{dates}}; + my @date_fields = keys %{ $output->{dates} }; delete $output->{dates} if (scalar(@date_fields) == 0); return $output; } sub loadCSV { - my $filename = shift; - my $items_from_csv = csv (in => $filename, headers => "auto", blank_is_undef => 1); - my @all_items = (); + my $filename = shift; + my $items_from_csv = csv(in => $filename, headers => "auto", blank_is_undef => 1); + my @all_items = (); for my $item (@$items_from_csv) { - push(@all_items,buildHash($item)); + push(@all_items, buildHash($item)); } return @all_items; } @@ -57,23 +57,23 @@ Used for testing against items from the database with all id tags removed. =cut -sub removeIDs { # remove any field that ends in _id except student_id +sub removeIDs { # remove any field that ends in _id except student_id my $obj = shift; - for my $key (keys %$obj){ + for my $key (keys %$obj) { delete $obj->{$key} if $key =~ /_id$/x && $key ne 'student_id'; } return; } sub filterBySetType { - my ($all_sets,$type,$course_name) = @_; - my $type_hash = $DB::Schema::ResultSet::ProblemSet::SET_TYPES; + my ($all_sets, $type, $course_name) = @_; + my $type_hash = $DB::Schema::ResultSet::ProblemSet::SET_TYPES; my @filtered_sets = @$all_sets; - if (defined($course_name)){ + if (defined($course_name)) { @filtered_sets = grep { $_->{course_name} eq $course_name } @filtered_sets; } - if (defined($type)){ + if (defined($type)) { @filtered_sets = grep { $_->{set_type} eq $type } @filtered_sets; } diff --git a/lib/DB/Utils.pm b/lib/DB/Utils.pm index 44d340ef..30af34d6 100644 --- a/lib/DB/Utils.pm +++ b/lib/DB/Utils.pm @@ -13,9 +13,7 @@ use Data::Dump qw/dd/; use List::Util qw/first/; use Scalar::Util qw/reftype/; -use Exception::Class ( - 'DB::Exception::ParametersNeeded' - ); +use Exception::Class ('DB::Exception::ParametersNeeded'); sub getCourseInfo { return _get_info(shift, qw/course_id course_name/); @@ -26,19 +24,19 @@ sub getUserInfo { } sub getSetInfo { - return _get_info(shift,qw/set_id set_name/); + return _get_info(shift, qw/set_id set_name/); } sub getPoolInfo { - return _get_info(shift,qw/problem_pool_id pool_name/); + return _get_info(shift, qw/problem_pool_id pool_name/); } sub getProblemInfo { - return _get_info(shift,qw/problem_number problem_id/); + return _get_info(shift, qw/problem_number problem_id/); } sub getPoolProblemInfo { - return _get_info(shift,qw/library_id pool_problem_id/); + return _get_info(shift, qw/library_id pool_problem_id/); } # This is a generic internal subroutine to check that the info passed in contains certain fields @@ -47,18 +45,16 @@ sub getPoolProblemInfo { # @fields is an array of the valid fields to be parsed. sub _get_info { - my ($input_info,@fields) = @_; + my ($input_info, @fields) = @_; my $output_info = {}; for my $key (@fields) { $output_info->{$key} = $input_info->{$key} if defined($input_info->{$key}); } - DB::Exception::ParametersNeeded->throw( - message => "You must pass in only one of " . join(", ",@fields) . "." - ) if scalar(keys %$output_info) > 1; - DB::Exception::ParametersNeeded->throw( - message => "You must pass exactly one of " . join(", ",@fields) . "." - ) if scalar(keys %$output_info) < 1; + DB::Exception::ParametersNeeded->throw(message => "You must pass in only one of " . join(", ", @fields) . ".") + if scalar(keys %$output_info) > 1; + DB::Exception::ParametersNeeded->throw(message => "You must pass exactly one of " . join(", ", @fields) . ".") + if scalar(keys %$output_info) < 1; return $output_info; } @@ -71,15 +67,14 @@ This returns the hashref with both the original and any replacements. =cut sub updateAllFields { - my ($current_fields,$updated_fields) = @_; + my ($current_fields, $updated_fields) = @_; my $fields_to_return = clone($current_fields); for my $key (keys %$updated_fields) { if (defined(reftype($updated_fields->{$key})) && reftype($updated_fields->{$key}) eq "HASH") { - $fields_to_return->{$key} = updateAllFields($current_fields->{$key} || {},$updated_fields->{$key}); + $fields_to_return->{$key} = updateAllFields($current_fields->{$key} || {}, $updated_fields->{$key}); } else { - $fields_to_return->{$key} = defined($updated_fields->{$key}) ? - $updated_fields->{$key} : - $current_fields->{$key}; + $fields_to_return->{$key} = + defined($updated_fields->{$key}) ? $updated_fields->{$key} : $current_fields->{$key}; } } return $fields_to_return; diff --git a/lib/DB/WithDates.pm b/lib/DB/WithDates.pm index 89d10efe..1c42d59a 100644 --- a/lib/DB/WithDates.pm +++ b/lib/DB/WithDates.pm @@ -8,11 +8,11 @@ use Data::Dump qw/dd/; use DB::Exception; -our $valid_dates; # array of allowed/valid dates -our $required_dates; # array of required dates +our $valid_dates; # array of allowed/valid dates +our $required_dates; # array of required dates sub validDates { - my ($self,$type) = @_; + my ($self, $type) = @_; # the following stops the carping of perlcritic ## no critic 'ProhibitStringyEval' ## no critic 'RequireCheckingReturnValueOfEval' @@ -32,10 +32,10 @@ sub validDates { } sub validDateFields { - my $self = shift; - my @fields = keys %{$self->dates}; - my @bad_fields = array_minus(@fields, @$valid_dates); # if this is not empty, there are illegal fields - DB::Exception::InvalidDateField->throw(field_names=> join(", ",@bad_fields)) + my $self = shift; + my @fields = keys %{ $self->dates }; + my @bad_fields = array_minus(@fields, @$valid_dates); # if this is not empty, there are illegal fields + DB::Exception::InvalidDateField->throw(field_names => join(", ", @bad_fields)) if (scalar(@bad_fields) != 0); return 1; @@ -47,7 +47,7 @@ sub validDateFormat { my $self = shift; for my $key (@$valid_dates) { next unless defined($self->dates->{$key}); - my $invalid_date = {}; + my $invalid_date = {}; $invalid_date->{$key} = $self->dates->{$key}; DB::Exception::InvalidDateFormat->throw(date => $invalid_date) unless $self->dates->{$key} =~ /^\d+$/x; } @@ -55,26 +55,25 @@ sub validDateFormat { } sub hasRequiredDateFields { - my $self = shift; - my @fields = keys %{$self->dates}; - my @bad_fields = array_minus(@$required_dates,@fields); - DB::Exception::RequiredDateFields->throw( - message => "The field(s) " .join(", ",@bad_fields) . " must be present" - ) if (scalar(@bad_fields) != 0); + my $self = shift; + my @fields = keys %{ $self->dates }; + my @bad_fields = array_minus(@$required_dates, @fields); + DB::Exception::RequiredDateFields->throw(message => "The field(s) " . join(", ", @bad_fields) . " must be present") + if (scalar(@bad_fields) != 0); return 1; } sub checkDates { my $self = shift; - my @fields = keys %{$self->dates}; - my @date_fields = intersect(@fields,@$valid_dates); + my @fields = keys %{ $self->dates }; + my @date_fields = intersect(@fields, @$valid_dates); - for my $i (0..(scalar(@date_fields)-2)){ - next unless defined($self->dates->{$date_fields[$i]}) && defined($self->dates->{$date_fields[$i+1]}); + for my $i (0 .. (scalar(@date_fields) - 2)) { + next unless defined($self->dates->{ $date_fields[$i] }) && defined($self->dates->{ $date_fields[ $i + 1 ] }); DB::Exception::ImproperDateOrder->throw( - message => "The date/time $date_fields[$i] must occur before $date_fields[$i+1]" - ) if ($self->dates->{$date_fields[$i]} > $self->dates->{$date_fields[$i+1]}); + message => "The date/time $date_fields[$i] must occur before $date_fields[$i+1]") + if ($self->dates->{ $date_fields[$i] } > $self->dates->{ $date_fields[ $i + 1 ] }); } return 1; } diff --git a/lib/DB/WithParams.pm b/lib/DB/WithParams.pm index fe58c55b..ab8d1edf 100644 --- a/lib/DB/WithParams.pm +++ b/lib/DB/WithParams.pm @@ -8,17 +8,14 @@ use Data::Dump qw/dd/; use Scalar::Util qw/reftype/; # shared across subroutines, so 'our' ensures that these do not go out of scope -our $valid_params; # hash of valid parameters and the regexp for the values. -our $required_params; # array of the required parameters. +our $valid_params; # hash of valid parameters and the regexp for the values. +our $required_params; # array of the required parameters. use DB::Exception; -use Exception::Class ( - 'DB::Exception::UndefinedParameter', - 'DB::Exception::InvalidParameter', - ); +use Exception::Class ('DB::Exception::UndefinedParameter', 'DB::Exception::InvalidParameter',); sub validParams { - my ($self,$type) = @_; + my ($self, $type) = @_; # the following stops the carping of perlcritic ## no critic 'ProhibitStringyEval' ## no critic 'RequireCheckingReturnValueOfEval' @@ -42,13 +39,12 @@ sub validParamFields { my $self = shift; return 1 unless defined($self->params); my @valid_fields = keys %$valid_params; - my @fields = keys %{$self->params}; - my @inter = intersect(@fields,@valid_fields); + my @fields = keys %{ $self->params }; + my @inter = intersect(@fields, @valid_fields); if (scalar(@inter) != scalar(@fields)) { my @bad_fields = array_minus(@fields, @valid_fields); DB::Exception::UndefinedParameter->throw( - "The following parameters are not allowed for this DB table: " . join(", ",@bad_fields) - ); + "The following parameters are not allowed for this DB table: " . join(", ", @bad_fields)); } return 1; } @@ -56,11 +52,10 @@ sub validParamFields { sub validateParams { my $self = shift; return 1 unless defined $self->params; - for my $key (keys %{$self->params}){ + for my $key (keys %{ $self->params }) { my $re = $valid_params->{$key}; - DB::Exception::InvalidParameter->throw( - message => "The parameter named $key is not valid" - ) unless $self->params->{$key} =~ qr/^$re$/x; + DB::Exception::InvalidParameter->throw(message => "The parameter named $key is not valid") + unless $self->params->{$key} =~ qr/^$re$/x; } return 1; } @@ -71,7 +66,7 @@ sub checkRequiredParams { if (reftype($required_params) eq "HASH") { for my $key (keys %$required_params) { - last unless $self->_check_params($key,$required_params->{$key}); + last unless $self->_check_params($key, $required_params->{$key}); } } return 1; @@ -80,30 +75,29 @@ sub checkRequiredParams { ## the following is an internal subroutine to check the struture of a hashref for $required_params. sub _check_params { - my ($self,$type,$value) = @_; - my $valid = 0; ## assume that it is not valid; + my ($self, $type, $value) = @_; + my $valid = 0; ## assume that it is not valid; if ($type eq "_ALL_") { croak "The value of the _ALL_ required type needs to be an array ref." unless reftype($value) eq "ARRAY"; for my $el (@$value) { - if (!defined(reftype($el))) { # assume it is a string - $valid = grep {/^$el$/x } keys %{$self->params}; - DB::Exception::ParametersNeeded->throw( - message => "Request must include: $el" - ) unless $valid; - } elsif( reftype($el) eq "HASH") { + if (!defined(reftype($el))) { # assume it is a string + $valid = grep {/^$el$/x} keys %{ $self->params }; + DB::Exception::ParametersNeeded->throw(message => "Request must include: $el") + unless $valid; + } elsif (reftype($el) eq "HASH") { for my $key (keys %$el) { - $valid = $self->_check_params($key,$el->{$key}); + $valid = $self->_check_params($key, $el->{$key}); } } - last unless ($valid); # if the current element in the loop is not valid, break out. + last unless ($valid); # if the current element in the loop is not valid, break out. } } elsif ($type eq "_ONE_OF_") { croak "The value of the _ONE_OF_ required type needs to be an array ref." unless reftype($value) eq "ARRAY"; - my @fields = keys %{$self->params}; - $valid = scalar(intersect(@fields,@$value)) == 1; + my @fields = keys %{ $self->params }; + $valid = scalar(intersect(@fields, @$value)) == 1; DB::Exception::ParametersNeeded->throw( - message => "Request must include exactly ONE of the following parameters: " . join(', ', @$value) - ) unless $valid; + message => "Request must include exactly ONE of the following parameters: " . join(', ', @$value)) + unless $valid; } return $valid; } diff --git a/lib/WeBWorK3.pm b/lib/WeBWorK3.pm index 6753adcc..dc0e7aed 100644 --- a/lib/WeBWorK3.pm +++ b/lib/WeBWorK3.pm @@ -31,17 +31,20 @@ sub startup { $self->secrets($config->{secrets}); # Load the database and DBIC plugin - $self->plugin(DBIC => { + $self->plugin( + DBIC => { schema => DB::Schema->connect($config->{database_dsn}, $config->{database_user}, $config->{database_password}) } ); # Load the authentication plugin - $self->plugin(Authentication => { - load_user => sub ($app, $uid) { $self->load_account($uid) }, - validate_user => sub ($c, $u, $p, $e) { $self->validate($u, $p) ? $u : undef; } - }); + $self->plugin( + Authentication => { + load_user => sub ($app, $uid) { $self->load_account($uid) }, + validate_user => sub ($c, $u, $p, $e) { $self->validate($u, $p) ? $u : undef; } + } + ); # Set up the session $self->sessions->cookie_name('Webwork3Authen'); @@ -53,13 +56,13 @@ sub startup { # Load permissions and set up some helpers for dealing with permissions. $perm_table = LoadFile("$ENV{WW3_ROOT}/conf/permissions.yaml"); - $self->helper(perm_table => sub ($c) { return $perm_table; }); + $self->helper(perm_table => sub ($c) { return $perm_table; }); $self->helper(ignore_permissions => sub ($c) { return $config->{ignore_permissions}; }); # Handle all api route exceptions $self->hook(around_dispatch => $WeBWorK3::Hooks::exception_handler); - $self->hook(around_action => $WeBWorK3::Hooks::check_permission); + $self->hook(around_action => $WeBWorK3::Hooks::check_permission); # Load all routes $self->loginRoutes(); @@ -73,22 +76,22 @@ sub startup { return; } -sub load_account($self, $user_id) { +sub load_account ($self, $user_id) { my $user = $self->schema->resultset("User")->getGlobalUser({ username => $user_id }); return $user; } -sub validate($self, $user, $password) { +sub validate ($self, $user, $password) { return $self->schema->resultset("User")->authenticate($user, $password); } -sub loginRoutes($self) { +sub loginRoutes ($self) { $self->routes->post('/webwork3/api/login')->to('Login#login'); $self->routes->any('/webwork3/api/logout')->to('Login#logout_user'); return; } -sub coursesRoutes($self) { +sub coursesRoutes ($self) { my $course_routes = $self->routes->any('/webwork3/api/courses')->to(controller => 'Course'); $course_routes->get('/')->to(action => 'getCourses'); $course_routes->get('/:course_id')->to(action => 'getCourse'); @@ -98,7 +101,7 @@ sub coursesRoutes($self) { return; } -sub userRoutes($self) { +sub userRoutes ($self) { my $user_routes = $self->routes->any('/webwork3/api/users')->to(controller => 'User'); $user_routes->get('/')->to(action => 'getGlobalUsers'); $user_routes->post('/')->to(action => 'addGlobalUser'); @@ -109,7 +112,7 @@ sub userRoutes($self) { return; } -sub courseUserRoutes($self) { +sub courseUserRoutes ($self) { my $course_user_routes = $self->routes->any('/webwork3/api/courses/:course_id/users')->to(controller => 'User'); $course_user_routes->get('/')->to(action => 'getCourseUsers'); $course_user_routes->post('/')->to(action => 'addCourseUser'); @@ -120,7 +123,7 @@ sub courseUserRoutes($self) { return; } -sub problemSetRoutes($self) { +sub problemSetRoutes ($self) { $self->routes->get('/webwork3/api/sets')->to("ProblemSet#getProblemSets"); my $problem_set_routes = $self->routes->any('/webwork3/api/courses/:course_id/sets')->to(controller => 'ProblemSet'); @@ -132,20 +135,20 @@ sub problemSetRoutes($self) { return; } -sub problemRoutes($self) { - my $problem_routes = $self->routes->any('/webwork3/api/courses/:course_id/sets/:set_id/problems') - ->to(controller => 'Problem'); +sub problemRoutes ($self) { + my $problem_routes = + $self->routes->any('/webwork3/api/courses/:course_id/sets/:set_id/problems')->to(controller => 'Problem'); $problem_routes->post('/')->to(action => 'addProblem'); return; } -sub settingsRoutes($self) { +sub settingsRoutes ($self) { $self->routes->get('/webwork3/api/default_settings')->to("Settings#getDefaultCourseSettings"); $self->routes->get('/webwork3/api/courses/:course_id/settings')->to("Settings#getCourseSettings"); return; } -sub utilityRoutes($self) { +sub utilityRoutes ($self) { $self->routes->post('/webwork3/api/client-logs')->to("Logger#clientLog"); return; } diff --git a/lib/WeBWorK3/Controller/Course.pm b/lib/WeBWorK3/Controller/Course.pm index c6bb13a6..5ae0e1a5 100644 --- a/lib/WeBWorK3/Controller/Course.pm +++ b/lib/WeBWorK3/Controller/Course.pm @@ -7,15 +7,15 @@ use Mojo::Base 'Mojolicious::Controller', -signatures; use Data::Dump qw/dd/; sub getCourses { - my $self = shift; - my @all_courses = $self->schema->resultset("Course")->getCourses; + my $self = shift; + my @all_courses = $self->schema->resultset("Course")->getCourses; $self->render(json => \@all_courses); return; } sub getCourse { - my $self = shift; - my $course = $self->schema->resultset("Course")->getCourse( {course_id => int( $self->param("course_id") )} ); + my $self = shift; + my $course = $self->schema->resultset("Course")->getCourse({ course_id => int($self->param("course_id")) }); $self->render(json => $course); return; } @@ -23,24 +23,23 @@ sub getCourse { ## update the course given by course_id with given params sub updateCourse { - my $self = shift; + my $self = shift; my $course = $self->schema->resultset("Course") - ->updateCourse( {course_id => int( $self->param("course_id") )},$self->req->json); + ->updateCourse({ course_id => int($self->param("course_id")) }, $self->req->json); $self->render(json => $course); return; } sub addCourse { - my $self = shift; + my $self = shift; my $course = $self->schema->resultset("Course")->addCourse($self->req->json); $self->render(json => $course); return; } sub deleteCourse { - my $self = shift; - my $course = $self->schema->resultset("Course") - ->deleteCourse( {course_id => int( $self->param("course_id") )}); + my $self = shift; + my $course = $self->schema->resultset("Course")->deleteCourse({ course_id => int($self->param("course_id")) }); $self->render(json => $course); return; } diff --git a/lib/WeBWorK3/Controller/Logger.pm b/lib/WeBWorK3/Controller/Logger.pm index ba7cb452..9f8e7cbf 100644 --- a/lib/WeBWorK3/Controller/Logger.pm +++ b/lib/WeBWorK3/Controller/Logger.pm @@ -7,25 +7,25 @@ use Mojo::File qw(path); use Mojo::Log; use JSON qw(decode_json); -my $path = path("$ENV{WW3_ROOT}/logs")->make_path->child('clientLog.log'); +my $path = path("$ENV{WW3_ROOT}/logs")->make_path->child('clientLog.log'); my $clientLogFile = Mojo::Log->new(path => $path); -sub clientLog($c) { - my $rawJSON = $c->req->body; +sub clientLog ($c) { + my $rawJSON = $c->req->body; my $logEntry = decode_json($rawJSON); - my $level = ($logEntry->{level} =~ /(debug|info|warn|error)/) ? $1 : 'fatal' ; + my $level = ($logEntry->{level} =~ /(debug|info|warn|error)/) ? $1 : 'fatal'; # optionally log information from user cookie... - for my $cookie (@{$c->req->cookies}) { + for my $cookie (@{ $c->req->cookies }) { $c->log->info($cookie->to_string); } # write entire json to file in production mode - $clientLogFile->$level($rawJSON);# if ( $ENV{MOJO_MODE} && $ENV{MOJO_MODE} eq 'production' ); + $clientLogFile->$level($rawJSON); # if ( $ENV{MOJO_MODE} && $ENV{MOJO_MODE} eq 'production' ); $c->log->$level($logEntry->{message}); $c->rendered(200); return; -}; +} 1; diff --git a/lib/WeBWorK3/Controller/Login.pm b/lib/WeBWorK3/Controller/Login.pm index 8ba63b4b..8ffb74cc 100644 --- a/lib/WeBWorK3/Controller/Login.pm +++ b/lib/WeBWorK3/Controller/Login.pm @@ -4,7 +4,7 @@ use strict; use Mojo::Base 'Mojolicious::Controller', -signatures; -sub login($c) { +sub login ($c) { my $params = $c->req->json; if ($c->authenticate($params->{username}, $params->{password})) { $c->render(json => { logged_in => 1, user => $c->current_user }); @@ -14,7 +14,7 @@ sub login($c) { return; } -sub logout_user($c) { +sub logout_user ($c) { $c->logout; $c->session(expires => 1); $c->render(json => { logged_in => 0, message => "Successfully logged out." }); diff --git a/lib/WeBWorK3/Controller/Problem.pm b/lib/WeBWorK3/Controller/Problem.pm index 1b8cc264..fe508ff0 100644 --- a/lib/WeBWorK3/Controller/Problem.pm +++ b/lib/WeBWorK3/Controller/Problem.pm @@ -11,18 +11,18 @@ use Mojo::JSON qw/true false/; sub addProblem ($self) { my $course_set_params = { course_id => int($self->param("course_id")), - set_id => int($self->param("set_id")) + set_id => int($self->param("set_id")) }; my $problem_params = { params => { - weight => 1, + weight => 1, # TODO: finalize OPL DB and migrate away from paths # library_id => $self->req->json->{id}, - problem_path => $self->req->json->{file_path} + problem_path => $self->req->json->{file_path} } }; - my $problem = $self->schema->resultset("Problem")->addSetProblem($course_set_params,$problem_params); + my $problem = $self->schema->resultset("Problem")->addSetProblem($course_set_params, $problem_params); $self->render(json => $problem); return; } diff --git a/lib/WeBWorK3/Controller/ProblemSet.pm b/lib/WeBWorK3/Controller/ProblemSet.pm index 973e7f55..c8042714 100644 --- a/lib/WeBWorK3/Controller/ProblemSet.pm +++ b/lib/WeBWorK3/Controller/ProblemSet.pm @@ -9,16 +9,16 @@ use Try::Tiny; use Mojo::JSON qw/true false/; sub getAllProblemSets { - my $self = shift; - my @all_problem_sets = $self->schema->resultset("ProblemSet")->getAllProblemSets; + my $self = shift; + my @all_problem_sets = $self->schema->resultset("ProblemSet")->getAllProblemSets; $self->render(json => \@all_problem_sets); return; } sub getProblemSets { my $self = shift; - my @problem_sets = $self->schema->resultset("ProblemSet") - ->getProblemSets({ course_id => int($self->param("course_id")) }); + my @problem_sets = + $self->schema->resultset("ProblemSet")->getProblemSets({ course_id => int($self->param("course_id")) }); # convert booleans for my $set (@problem_sets) { $set->{set_visible} = $set->{set_visible} ? true : false; @@ -28,12 +28,11 @@ sub getProblemSets { } sub getProblemSet { - my $self = shift; - my $problem_set = $self->schema->resultset("ProblemSet") - ->getProblemSet({ - course_id => int( $self->param("course_id")), - set_id => int( $self->param("set_id")) - }); + my $self = shift; + my $problem_set = $self->schema->resultset("ProblemSet")->getProblemSet({ + course_id => int($self->param("course_id")), + set_id => int($self->param("set_id")) + }); $self->render(json => $problem_set); return; } @@ -41,31 +40,32 @@ sub getProblemSet { ## update the course given by course_id with given params sub updateProblemSet { - my $self = shift; - my $problem_set = $self->schema->resultset("ProblemSet") - ->updateProblemSet( { - course_id => int( $self->param("course_id")), - set_id => int( $self->param("set_id")) - },$self->req->json); + my $self = shift; + my $problem_set = $self->schema->resultset("ProblemSet")->updateProblemSet( + { + course_id => int($self->param("course_id")), + set_id => int($self->param("set_id")) + }, + $self->req->json + ); $self->render(json => $problem_set); return; } sub addProblemSet { - my $self = shift; + my $self = shift; my $problem_set = $self->schema->resultset("ProblemSet") - ->addProblemSet({course_id => int( $self->param("course_id"))}, $self->req->json); + ->addProblemSet({ course_id => int($self->param("course_id")) }, $self->req->json); $self->render(json => $problem_set); return; } sub deleteProblemSet { - my $self = shift; - my $problem_set = $self->schema->resultset("ProblemSet") - ->deleteProblemSet( { - course_id => int( $self->param("course_id")), - set_id => int( $self->param("set_id")) - }); + my $self = shift; + my $problem_set = $self->schema->resultset("ProblemSet")->deleteProblemSet({ + course_id => int($self->param("course_id")), + set_id => int($self->param("set_id")) + }); $self->render(json => $problem_set); return; } diff --git a/lib/WeBWorK3/Controller/Settings.pm b/lib/WeBWorK3/Controller/Settings.pm index ceb27a03..ae016b84 100644 --- a/lib/WeBWorK3/Controller/Settings.pm +++ b/lib/WeBWorK3/Controller/Settings.pm @@ -17,24 +17,23 @@ use YAML::XS qw/LoadFile/; # this reads the default settings from a file sub getDefaultCourseSettings { - my $self = shift; - my $settings = LoadFile(path($self->config->{webwork3_home},"conf","course_defaults.yml")); + my $self = shift; + my $settings = LoadFile(path($self->config->{webwork3_home}, "conf", "course_defaults.yml")); ## check if the file exists $self->render(json => $settings); return; } sub getCourseSettings { - my $self = shift; - my $course_settings = $self->schema->resultset("Course") - ->getCourseSettings({ - course_id => int( $self->param("course_id")), - }); + my $self = shift; + my $course_settings = $self->schema->resultset("Course")->getCourseSettings({ + course_id => int($self->param("course_id")), + }); ## flatten to a single array: my @course_settings = (); for my $category (keys %$course_settings) { - for my $key(keys %{$course_settings->{$category}}) { - push(@course_settings,{ var=>$key, value => $course_settings->{$category}->{$key}}); + for my $key (keys %{ $course_settings->{$category} }) { + push(@course_settings, { var => $key, value => $course_settings->{$category}->{$key} }); } } $self->render(json => \@course_settings); diff --git a/lib/WeBWorK3/Controller/User.pm b/lib/WeBWorK3/Controller/User.pm index 5531a67c..c472b8b4 100644 --- a/lib/WeBWorK3/Controller/User.pm +++ b/lib/WeBWorK3/Controller/User.pm @@ -4,40 +4,40 @@ use Mojo::Base 'Mojolicious::Controller', -signatures; use Data::Dump qw/dd/; sub getGlobalUsers { - my $self = shift; - my @global_users = $self->schema->resultset("User")->getAllGlobalUsers; + my $self = shift; + my @global_users = $self->schema->resultset("User")->getAllGlobalUsers; $self->render(json => \@global_users); return; } sub getGlobalUser { my $self = shift; - my $user = $self->param("user") =~ /^\d+$/ ? - $self->schema->resultset("User")->getGlobalUser( { user_id => int( $self->param("user") )} ) : - $self->schema->resultset("User")->getGlobalUser( { username => $self->param("user") } ); + my $user = + $self->param("user") =~ /^\d+$/ + ? $self->schema->resultset("User")->getGlobalUser({ user_id => int($self->param("user")) }) + : $self->schema->resultset("User")->getGlobalUser({ username => $self->param("user") }); $self->render(json => $user); return; } sub updateGlobalUser { my $self = shift; - my $user = $self->schema->resultset("User")->updateGlobalUser( - { user_id => int( $self->param("user_id") )}, - $self->req->json ); + my $user = $self->schema->resultset("User") + ->updateGlobalUser({ user_id => int($self->param("user_id")) }, $self->req->json); $self->render(json => $user); return; } sub addGlobalUser { my $self = shift; - my $user = $self->schema->resultset("User")->addGlobalUser($self->req->json ); + my $user = $self->schema->resultset("User")->addGlobalUser($self->req->json); $self->render(json => $user); return; } sub deleteGlobalUser { my $self = shift; - my $user = $self->schema->resultset("User")->deleteGlobalUser({user_id => int($self->param("user_id"))}); + my $user = $self->schema->resultset("User")->deleteGlobalUser({ user_id => int($self->param("user_id")) }); $self->render(json => $user); return; } @@ -45,34 +45,32 @@ sub deleteGlobalUser { ## the following subs are related to users within a given course. sub getMergedCourseUsers ($c) { - my @course_users = $c->schema->resultset("User")->getMergedCourseUsers( - {course_id => int($c->param("course_id"))}); + my @course_users = + $c->schema->resultset("User")->getMergedCourseUsers({ course_id => int($c->param("course_id")) }); $c->render(json => \@course_users); return; } sub getCourseUsers { my $self = shift; - my @course_users = $self->schema->resultset("User")->getCourseUsers( - {course_id => int($self->param("course_id"))}); + my @course_users = + $self->schema->resultset("User")->getCourseUsers({ course_id => int($self->param("course_id")) }); $self->render(json => \@course_users); return; } sub getCourseUser { - my $self = shift; - my $course_user = $self->schema->resultset("User")->getCourseUser( - { - course_id => int($self->param("course_id")), - user_id => int($self->param("user_id")) - } - ); + my $self = shift; + my $course_user = $self->schema->resultset("User")->getCourseUser({ + course_id => int($self->param("course_id")), + user_id => int($self->param("user_id")) + }); $self->render(json => $course_user); return; } sub addCourseUser { - my $self = shift; + my $self = shift; my $params = $self->req->json; $params->{course_id} = $self->param("course_id"); my $course_user = $self->schema->resultset("User")->addCourseUser($params); @@ -81,31 +79,31 @@ sub addCourseUser { } sub updateCourseUser { - my $self = shift; + my $self = shift; my $course_user = $self->schema->resultset("User")->updateCourseUser( { course_id => int($self->param("course_id")), - user_id => int($self->param("user_id")) - }, $self->req->json); + user_id => int($self->param("user_id")) + }, + $self->req->json + ); $self->render(json => $course_user); return; } sub deleteCourseUser { - my $self = shift; - my $course_user = $self->schema->resultset("User")->deleteCourseUser( - { - course_id => int($self->param("course_id")), - user_id => int($self->param("user_id")) - }); + my $self = shift; + my $course_user = $self->schema->resultset("User")->deleteCourseUser({ + course_id => int($self->param("course_id")), + user_id => int($self->param("user_id")) + }); $self->render(json => $course_user); return; } sub getUserCourses { - my $self = shift; - my @user_courses = $self->schema->resultset("Course") - ->getUserCourses({user_id => $self->param('user_id')}); + my $self = shift; + my @user_courses = $self->schema->resultset("Course")->getUserCourses({ user_id => $self->param('user_id') }); $self->render(json => \@user_courses); return; } diff --git a/lib/WeBWorK3/Hooks.pm b/lib/WeBWorK3/Hooks.pm index 0a3aa844..5db2476f 100644 --- a/lib/WeBWorK3/Hooks.pm +++ b/lib/WeBWorK3/Hooks.pm @@ -13,7 +13,7 @@ our $exception_handler = sub { try { $next->(); } catch { - my $output = {exception => ref($_)}; + my $output = { exception => ref($_) }; $output->{message} = $_->message if (ref($_) && (ref($_) eq 'Mojo::Exception' || ref($_) =~ /^DB::Exception/x)); $output->{message} = $_ if ($_ && ref($_) eq 'DBIx::Class::Exception'); @@ -28,10 +28,10 @@ our $exception_handler = sub { my $ignore_permissions = 1; sub has_permission { - my ($user,$perm) = @_; + my ($user, $perm) = @_; if ($perm->{allowed_users}) { return "" unless $user->{role}; - return grep {$_ eq $user->{role} } @{$perm->{allowed_users}}; + return grep { $_ eq $user->{role} } @{ $perm->{allowed_users} }; } return 1 unless ($perm->{check_permission} || $perm->{admin_required}); return ($user && $user->{is_admin}) if $perm->{admin_required}; @@ -45,12 +45,12 @@ our $check_permission = sub { my ($next, $c, $action) = @_; return $next->() if ($c->ignore_permissions || $c->req->url->to_string =~ /\/api\/login/x); my $controller_name = $c->{stash}->{controller}; - my $action_name = $c->{stash}->{action}; + my $action_name = $c->{stash}->{action}; if ($c->req->url->to_string =~ /\/api/x) { - if (has_permission($c->current_user,$c->perm_table->{$controller_name}->{$action_name})) { + if (has_permission($c->current_user, $c->perm_table->{$controller_name}->{$action_name})) { return $next->(); } else { - $c->render( json => { has_permission => 0, msg => "permission error"}); + $c->render(json => { has_permission => 0, msg => "permission error" }); } } else { $next->(); diff --git a/lib/WeBWorK3/Utils/Settings.pm b/lib/WeBWorK3/Utils/Settings.pm index f72b9567..b8353e25 100644 --- a/lib/WeBWorK3/Utils/Settings.pm +++ b/lib/WeBWorK3/Utils/Settings.pm @@ -19,7 +19,7 @@ use DB::Exception::InvalidCourseFieldType; use WeBWorK3; -my @allowed_fields = qw/var category subcategory doc doc2 default type options/; +my @allowed_fields = qw/var category subcategory doc doc2 default type options/; my @required_fields = qw/var doc type default/; =head1 loadDefaultCourseSettings @@ -42,14 +42,14 @@ it as a hash of categories/variables =cut sub getDefaultCourseValues { - my $course_defaults = getDefaultCourseSettings(); # the full default course settings + my $course_defaults = getDefaultCourseSettings(); # the full default course settings my $all_settings = {}; - for my $category (@course_setting_categories){ + for my $category (@course_setting_categories) { $all_settings->{$category} = {}; - my @settings = grep { $_->{category} eq $category} @$course_defaults; + my @settings = grep { $_->{category} eq $category } @$course_defaults; for my $setting (@settings) { - $all_settings->{$category}->{$setting->{var}} = $setting->{default}; + $all_settings->{$category}->{ $setting->{var} } = $setting->{default}; } } return $all_settings; @@ -66,18 +66,18 @@ For each course setting in the first argument (typically from the configuration =cut sub mergeCourseSettings { - my ($settings,$settings_to_update) = @_; + my ($settings, $settings_to_update) = @_; my $updated_settings = {}; ## merge the non-optional categories for my $category (@course_setting_categories) { $updated_settings->{$category} = {}; - my @fields = keys %{$settings->{$category}}; - push(@fields,keys %{$settings_to_update->{$category}}); + my @fields = keys %{ $settings->{$category} }; + push(@fields, keys %{ $settings_to_update->{$category} }); for my $key (@fields) { ## use the value in $settings_to_update if it exists, if not use the other - $updated_settings->{$category}->{$key} - = $settings_to_update->{$category}->{$key} || $settings->{$category}->{$key}; + $updated_settings->{$category}->{$key} = + $settings_to_update->{$category}->{$key} || $settings->{$category}->{$key}; } } @@ -92,7 +92,7 @@ checkSettingsConfFile loads the course settings configuration file and checks fo sub validateSettingsConfFile { # my @all_settings = getDefaultCourseSettings(); - for my $setting (@{getDefaultCourseSettings()}) { + for my $setting (@{ getDefaultCourseSettings() }) { validateSettingConfig($setting); } return 1; @@ -113,23 +113,25 @@ isValidCourseSettings checks if the course settings are valid including =cut sub flattenCourseSettings { - my $settings = shift; + my $settings = shift; my @flattened_settings = (); for my $category (keys %$settings) { - for my $var (keys %{$settings->{$category}}) { - push(@flattened_settings, - { - var => $var, - category => $category, - value => $settings->{$category}->{$var} - }); + for my $var (keys %{ $settings->{$category} }) { + push( + @flattened_settings, + { + var => $var, + category => $category, + value => $settings->{$category}->{$var} + } + ); } } return \@flattened_settings; } sub validateCourseSettings { - my $course_settings = flattenCourseSettings(shift); + my $course_settings = flattenCourseSettings(shift); my $default_course_settings = getDefaultCourseSettings(); for my $setting (@$course_settings) { validateSingleCourseSetting($setting, $default_course_settings); @@ -140,9 +142,8 @@ sub validateCourseSettings { sub validateSingleCourseSetting { my ($setting, $default_course_settings) = @_; my @default_setting = grep { $_->{var} eq $setting->{var} } @$default_course_settings; - DB::Exception::UndefinedCourseField->throw( - message => qq/The course setting $setting->{var} is not valid/ - ) unless scalar(@default_setting) == 1; + DB::Exception::UndefinedCourseField->throw(message => qq/The course setting $setting->{var} is not valid/) + unless scalar(@default_setting) == 1; validateSetting($setting); @@ -184,78 +185,80 @@ sub validateSettingConfig { # check that the variable name is kebobCase - DB::Exception::InvalidCourseField->throw( - message => "The variable name $setting->{var} must be in kebob case" - ) unless kebobCase($setting->{var}); + DB::Exception::InvalidCourseField->throw(message => "The variable name $setting->{var} must be in kebob case") + unless kebobCase($setting->{var}); # check that each of the setting fields is allowed - for my $field (keys %$setting){ + for my $field (keys %$setting) { my @fields = grep { $_ eq $field } @allowed_fields; DB::Exception::InvalidCourseField->throw( - message => "The field: $field is not an allowed field of the setting $setting->{var}" - ) if scalar(@fields) == 0; + message => "The field: $field is not an allowed field of the setting $setting->{var}") + if scalar(@fields) == 0; } # check that each of the required fields is present in the setting - for my $field (@required_fields){ + for my $field (@required_fields) { my @fields = grep { $_ eq $field } (keys %$setting); DB::Exception::InvalidCourseField->throw( - message => "The field: $field is a required field for the setting $setting->{var}" - ) if scalar(@fields) == 0; + message => "The field: $field is a required field for the setting $setting->{var}") + if scalar(@fields) == 0; } my @type = grep { $_ eq $setting->{type} } @valid_types; DB::Exception::InvalidCourseFieldType->throw( - message => "The setting type: $setting->{type} is not valid for variable: $setting->{var}" - ) unless scalar(@type)==1; + message => "The setting type: $setting->{type} is not valid for variable: $setting->{var}") + unless scalar(@type) == 1; return validateSetting($setting); } sub validateSetting { my $setting = shift; - my $value = $setting->{default} || $setting->{value}; + my $value = $setting->{default} || $setting->{value}; return 0 if !defined $setting->{type}; - if ($setting->{type} eq "list"){ + if ($setting->{type} eq "list") { validateList($setting); } elsif ($setting->{type} eq "time") { DB::Exception::InvalidCourseFieldType->throw( - message => qq/The default for variable $setting->{var} which is $value must be a time value/ - ) unless isTimeString($setting->{default}); + message => qq/The default for variable $setting->{var} which is $value must be a time value/) + unless isTimeString($setting->{default}); } elsif ($setting->{type} eq "integer") { DB::Exception::InvalidCourseFieldType->throw( - message => qq/The default for variable $setting->{var} which is $value must be an integer/ - ) unless isInteger($setting->{default}); + message => qq/The default for variable $setting->{var} which is $value must be an integer/) + unless isInteger($setting->{default}); } elsif ($setting->{type} eq "decimal") { DB::Exception::InvalidCourseFieldType->throw( - message => qq/The default for variable $setting->{var} which is $value must be a decimal/ - ) unless isDecimal($setting->{default}); + message => qq/The default for variable $setting->{var} which is $value must be a decimal/) + unless isDecimal($setting->{default}); } elsif ($setting->{type} eq "time_duration") { DB::Exception::InvalidCourseFieldType->throw( - message => qq/The default for variable $setting->{var} which is $value must be a time duration/ - ) unless isTimeDuration($setting->{default}); + message => qq/The default for variable $setting->{var} which is $value must be a time duration/) + unless isTimeDuration($setting->{default}); } return 1; } sub validateList { my $setting = shift; - croak "The options field for the type list in " . $setting->{var} . " is missing " unless defined($setting->{options}); + croak "The options field for the type list in " . $setting->{var} . " is missing " + unless defined($setting->{options}); croak "The options field for " . $setting->{var} . " is not an ARRAYREF" unless ref($setting->{options}) eq "ARRAY"; # see if the $setting->{options} is an arrayref of strings or hashrefs - my @opt = (ref($setting->{options}->[0]) eq "HASH") ? - grep { $_ eq $setting->{default} } map { $_->{value} } @{$setting->{options}} : - grep { $_ eq $setting->{default} } @{$setting->{options}}; - croak "The default for variable " . $setting->{var} . " needs to be one of the given options" unless scalar(@opt) == 1; + my @opt = + (ref($setting->{options}->[0]) eq "HASH") + ? grep { $_ eq $setting->{default} } map { $_->{value} } @{ $setting->{options} } + : grep { $_ eq $setting->{default} } @{ $setting->{options} }; + croak "The default for variable " . $setting->{var} . " needs to be one of the given options" + unless scalar(@opt) == 1; return 1; } sub isInteger { - return shift =~ /^-?\d+$/ + return shift =~ /^-?\d+$/; } # test for a 24-hour time string diff --git a/t/db/001_courses.t b/t/db/001_courses.t index b5631105..1327f931 100644 --- a/t/db/001_courses.t +++ b/t/db/001_courses.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -59,44 +59,44 @@ for my $course (@courses) { $course->{course_dates} = $course->{dates}; delete $course->{dates}; } -@courses = sortByCourseName( \@courses ); +@courses = sortByCourseName(\@courses); ## check the list of all courses my @courses_from_db = $course_rs->getCourses; for my $course (@courses_from_db) { removeIDs($course); } -@courses_from_db = sortByCourseName( \@courses_from_db ); +@courses_from_db = sortByCourseName(\@courses_from_db); -is_deeply( \@courses_from_db, \@courses, "getCourses: course names" ); +is_deeply(\@courses_from_db, \@courses, "getCourses: course names"); ## get a single course by name -my $course = $course_rs->getCourse( { course_name => "Calculus" } ); +my $course = $course_rs->getCourse({ course_name => "Calculus" }); my $calc_id = $course->{course_id}; delete $course->{course_id}; my @calc_courses = grep { $_->{course_name} eq "Calculus" } @courses; -is_deeply( $course, $calc_courses[0], "getCourse: get a single course by name" ); +is_deeply($course, $calc_courses[0], "getCourse: get a single course by name"); ## get a single course by course_id -$course = $course_rs->getCourse( { course_id => $calc_id } ); +$course = $course_rs->getCourse({ course_id => $calc_id }); delete $course->{course_id}; -is_deeply( $course, $calc_courses[0], "getCourse: get a single course by id" ); +is_deeply($course, $calc_courses[0], "getCourse: get a single course by id"); ## try to get a single course with sending proper info: throws_ok { - $course_rs->getCourse( { course_id => $calc_id, course_name => "Calculus" } ); + $course_rs->getCourse({ course_id => $calc_id, course_name => "Calculus" }); } "DB::Exception::ParametersNeeded", "getCourse: sends too much info"; throws_ok { - $course_rs->getCourse( { name => "Calculus" } ); + $course_rs->getCourse({ name => "Calculus" }); } "DB::Exception::ParametersNeeded", "getCourse: sends wrong info"; ## try to get a single course that doesn't exist throws_ok { - $course_rs->getCourse( { course_name => "non_existent_course" } ); + $course_rs->getCourse({ course_name => "non_existent_course" }); } "DB::Exception::CourseNotFound", "getCourse: get a non-existent course"; @@ -111,57 +111,57 @@ my $new_course = $course_rs->addCourse($new_course_params); my $added_course_id = $new_course->{course_id}; removeIDs($new_course); -is_deeply( $new_course_params, $new_course, "addCourse: add a new course" ); +is_deeply($new_course_params, $new_course, "addCourse: add a new course"); ## add a course that already exists throws_ok { - $course_rs->addCourse( { course_name => "Geometry", visible => 1 } ); + $course_rs->addCourse({ course_name => "Geometry", visible => 1 }); } "DB::Exception::CourseExists", "addCourse: course already exists"; ## update the course name -my $updated_course = $course_rs->updateCourse( { course_id => $added_course_id }, { course_name => "Geometry II" } ); +my $updated_course = $course_rs->updateCourse({ course_id => $added_course_id }, { course_name => "Geometry II" }); $new_course_params->{course_name} = "Geometry II"; delete $updated_course->{course_id}; -is_deeply( $new_course_params, $updated_course, "updateCourse: update a course by name" ); +is_deeply($new_course_params, $updated_course, "updateCourse: update a course by name"); ## Try to update an non-existent course throws_ok { - $course_rs->updateCourse( { course_name => "non_existent_course" } ); + $course_rs->updateCourse({ course_name => "non_existent_course" }); } "DB::Exception::CourseNotFound", "updateCourse: update a non-existent course_name"; throws_ok { - $course_rs->updateCourse( { course_id => -9 }, $new_course_params ); + $course_rs->updateCourse({ course_id => -9 }, $new_course_params); } "DB::Exception::CourseNotFound", "updateCourse: update a non-existent course_id"; ## delete a course -my $deleted_course = $course_rs->deleteCourse( { course_name => "Geometry II" } ); +my $deleted_course = $course_rs->deleteCourse({ course_name => "Geometry II" }); removeIDs($deleted_course); -is_deeply( $new_course_params, $deleted_course, "deleteCourse: delete a course" ); +is_deeply($new_course_params, $deleted_course, "deleteCourse: delete a course"); ## try to delete a non-existent course by name throws_ok { - $course_rs->deleteCourse( { course_name => "undefined_name" } ) + $course_rs->deleteCourse({ course_name => "undefined_name" }) } "DB::Exception::CourseNotFound", "deleteCourse: delete a non-existent course_name"; ## try to delete a non-existent course by id throws_ok { - $course_rs->deleteCourse( { course_id => -9 } ) + $course_rs->deleteCourse({ course_id => -9 }) } "DB::Exception::CourseNotFound", "deleteCourse: delete a non-existent course_id"; ## get a list of courses for a user -my @user_courses = $course_rs->getUserCourses( { username => "lisa" } ); +my @user_courses = $course_rs->getUserCourses({ username => "lisa" }); for my $user_course (@user_courses) { removeIDs($user_course); } @@ -176,12 +176,12 @@ for my $user_course (@user_courses_from_csv) { } } -is_deeply( \@user_courses, \@user_courses_from_csv, "getUserCourses: get all courses for a given user" ); +is_deeply(\@user_courses, \@user_courses_from_csv, "getUserCourses: get all courses for a given user"); ## try to get a list of course from a non-existent user throws_ok { - $course_rs->getUserCourses( { username => "non_existent_user" } ); + $course_rs->getUserCourses({ username => "non_existent_user" }); } "DB::Exception::UserNotFound", "getUserCourse: try to get a list of courses for a non-existent user"; diff --git a/t/db/002_course_settings.t b/t/db/002_course_settings.t index 4216a457..e6020fcd 100644 --- a/t/db/002_course_settings.t +++ b/t/db/002_course_settings.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::webwork_home = dirname( dirname($main::test_dir) ); + $main::test_dir = abs_path(dirname(__FILE__)); + $main::webwork_home = dirname(dirname($main::test_dir)); $main::lib_dir = "$main::webwork_home/lib"; } @@ -40,47 +40,47 @@ my $schema = loadSchema(); # test for various types -ok( isInteger(0), "check type: integer" ); -ok( isInteger(100), "check type: integer" ); -ok( isInteger(-30), "check type: integer" ); -ok( !isInteger(0.5), "check type: not an integer" ); -ok( !isInteger(-2.5), "check type: not an integer" ); - -ok( isTimeString("1:59"), "check type: 24-hour time string" ); -ok( isTimeString("01:59"), "check type: 24-hour time string" ); -ok( isTimeString("00:59"), "check type: 24-hour time string" ); -ok( isTimeString("11:59"), "check type: 24-hour time string" ); -ok( isTimeString("13:59"), "check type: 24-hour time string" ); -ok( isTimeString("21:00"), "check type: 24-hour time string" ); - -ok( !isTimeString("24:59"), "check type: not a 24-hour time string" ); -ok( !isTimeString("31:59"), "check type: not a 24-hour time string" ); -ok( !isTimeString("23:69"), "check type: not a 24-hour time string" ); - -ok( isTimeDuration("2 days"), "check type: time duration" ); -ok( isTimeDuration("10 sec"), "check type: time duration" ); -ok( isTimeDuration("12 min"), "check type: time duration" ); -ok( isTimeDuration("24 hrs"), "check type: time duration" ); -ok( isTimeDuration("24 hours"), "check type: time duration" ); -ok( isTimeDuration("1 week"), "check type: time duration" ); -ok( isTimeDuration("1 WEEK"), "check type: time duration" ); - -ok( !isTimeDuration("-24 hrs"), "check type: not a time duration" ); -ok( !isTimeDuration("4 apples"), "check type: not a time duration" ); - -ok( isDecimal(0.3), "check type: decimal" ); -ok( isDecimal(3), "check type: decimal" ); -ok( isDecimal(-0.3), "check type: decimal" ); -ok( isDecimal("0.33"), "check type: decimal" ); -ok( isDecimal("-.33"), "check type: decimal" ); - -ok( isDecimal("00.33"), "check type: decimal" ); -ok( !isDecimal("0-.33"), "check type: not a decimal" ); -ok( !isDecimal("abc"), "check type: not a decimal" ); +ok(isInteger(0), "check type: integer"); +ok(isInteger(100), "check type: integer"); +ok(isInteger(-30), "check type: integer"); +ok(!isInteger(0.5), "check type: not an integer"); +ok(!isInteger(-2.5), "check type: not an integer"); + +ok(isTimeString("1:59"), "check type: 24-hour time string"); +ok(isTimeString("01:59"), "check type: 24-hour time string"); +ok(isTimeString("00:59"), "check type: 24-hour time string"); +ok(isTimeString("11:59"), "check type: 24-hour time string"); +ok(isTimeString("13:59"), "check type: 24-hour time string"); +ok(isTimeString("21:00"), "check type: 24-hour time string"); + +ok(!isTimeString("24:59"), "check type: not a 24-hour time string"); +ok(!isTimeString("31:59"), "check type: not a 24-hour time string"); +ok(!isTimeString("23:69"), "check type: not a 24-hour time string"); + +ok(isTimeDuration("2 days"), "check type: time duration"); +ok(isTimeDuration("10 sec"), "check type: time duration"); +ok(isTimeDuration("12 min"), "check type: time duration"); +ok(isTimeDuration("24 hrs"), "check type: time duration"); +ok(isTimeDuration("24 hours"), "check type: time duration"); +ok(isTimeDuration("1 week"), "check type: time duration"); +ok(isTimeDuration("1 WEEK"), "check type: time duration"); + +ok(!isTimeDuration("-24 hrs"), "check type: not a time duration"); +ok(!isTimeDuration("4 apples"), "check type: not a time duration"); + +ok(isDecimal(0.3), "check type: decimal"); +ok(isDecimal(3), "check type: decimal"); +ok(isDecimal(-0.3), "check type: decimal"); +ok(isDecimal("0.33"), "check type: decimal"); +ok(isDecimal("-.33"), "check type: decimal"); + +ok(isDecimal("00.33"), "check type: decimal"); +ok(!isDecimal("0-.33"), "check type: not a decimal"); +ok(!isDecimal("abc"), "check type: not a decimal"); ## check that the configuration file is valid; -is( validateSettingsConfFile(), 1, "configuration file valid" ); +is(validateSettingsConfFile(), 1, "configuration file valid"); ### TODO: test to make sure that all of the checks for the course configurations work. @@ -96,104 +96,96 @@ my $valid_setting = { default => 0 }; -is( validateSettingConfig($valid_setting), 1, "course setting: valid setting" ); +is(validateSettingConfig($valid_setting), 1, "course setting: valid setting"); ## check various parts of the setting; throws_ok { - validateSettingConfig( - { var => "mySetting", - doc => "this is a setting", - type => "integer", - category => "general", - default => 0 - } - ) + validateSettingConfig({ + var => "mySetting", + doc => "this is a setting", + type => "integer", + category => "general", + default => 0 + }) } "DB::Exception::InvalidCourseField", "course setting: variable not in kebob case"; throws_ok { - validateSettingConfig( - { var => "my_setting", - doc3 => "this is a setting", - type => "integer", - category => "general", - default => 0 - } - ) + validateSettingConfig({ + var => "my_setting", + doc3 => "this is a setting", + type => "integer", + category => "general", + default => 0 + }) } "DB::Exception::InvalidCourseField", "course setting: course setting with illegal field"; throws_ok { - validateSettingConfig( - { var => "my_setting", - type => "integer", - category => "general", - default => 0 - } - ) + validateSettingConfig({ + var => "my_setting", + type => "integer", + category => "general", + default => 0 + }) } "DB::Exception::InvalidCourseField", "course setting: missing required field"; throws_ok { - validateSettingConfig( - { var => "my_setting", - doc => "this is a setting", - type => "nonnegint", - category => "general", - default => 0 - } - ) + validateSettingConfig({ + var => "my_setting", + doc => "this is a setting", + type => "nonnegint", + category => "general", + default => 0 + }) } "DB::Exception::InvalidCourseFieldType", "course setting: non valid course parameter type"; ## validate settings throws_ok { - validateSettingConfig( - { var => "my_setting", - doc => "this is a setting", - type => "time", - category => "general", - default => "12:343" - } - ) + validateSettingConfig({ + var => "my_setting", + doc => "this is a setting", + type => "time", + category => "general", + default => "12:343" + }) } "DB::Exception::InvalidCourseFieldType", "course setting: bad time string"; throws_ok { - validateSettingConfig( - { var => "my_setting", - doc => "this is a setting", - type => "integer", - category => "general", - default => "12.343" - } - ) + validateSettingConfig({ + var => "my_setting", + doc => "this is a setting", + type => "integer", + category => "general", + default => "12.343" + }) } "DB::Exception::InvalidCourseFieldType", "course setting: bad integer format"; throws_ok { - validateSettingConfig( - { var => "my_setting", - doc => "this is a setting", - type => "time_duration", - category => "general", - default => "-2 days" - } - ) + validateSettingConfig({ + var => "my_setting", + doc => "this is a setting", + type => "time_duration", + category => "general", + default => "-2 days" + }) } "DB::Exception::InvalidCourseFieldType", "course setting: bad time duration format"; throws_ok { - validateSettingConfig( - { var => "my_setting", - doc => "this is a setting", - type => "decimal", - category => "general", - default => "12:343" - } - ) + validateSettingConfig({ + var => "my_setting", + doc => "this is a setting", + type => "decimal", + category => "general", + default => "12:343" + }) } "DB::Exception::InvalidCourseFieldType", "course setting: bad decimal format"; @@ -203,64 +195,64 @@ my $course_rs = $schema->resultset("Course"); #make a new course with no settings and compare to the default settings -my $new_course = $course_rs->addCourse( { course_name => "New Course" } ); +my $new_course = $course_rs->addCourse({ course_name => "New Course" }); my $default_course_values = getDefaultCourseValues(); my $new_course_info = { course_id => $new_course->{course_id} }; my $course_settings = $course_rs->getCourseSettings($new_course_info); -is_deeply( $course_settings, $default_course_values, "course settings: default course_settings" ); +is_deeply($course_settings, $default_course_values, "course settings: default course_settings"); # set a single course setting in General my $updated_general_setting = { general => { course_description => "This is my new course description" } }; -my $updated_course_settings = $course_rs->updateCourseSettings( $new_course_info, $updated_general_setting ); +my $updated_course_settings = $course_rs->updateCourseSettings($new_course_info, $updated_general_setting); -my $current_course_values = mergeCourseSettings( $default_course_values, $updated_general_setting ); +my $current_course_values = mergeCourseSettings($default_course_values, $updated_general_setting); -is_deeply( $current_course_values, $updated_course_settings, "course_settings: updated general setting" ); +is_deeply($current_course_values, $updated_course_settings, "course_settings: updated general setting"); # update another general setting $updated_general_setting = { general => { hardcopy_theme => "One Column" } }; -$updated_course_settings = $course_rs->updateCourseSettings( $new_course_info, $updated_general_setting ); +$updated_course_settings = $course_rs->updateCourseSettings($new_course_info, $updated_general_setting); -$current_course_values = mergeCourseSettings( $current_course_values, $updated_general_setting ); +$current_course_values = mergeCourseSettings($current_course_values, $updated_general_setting); -is_deeply( $current_course_values, $updated_course_settings, "course_settings: updated another general setting" ); +is_deeply($current_course_values, $updated_course_settings, "course_settings: updated another general setting"); # set a single course setting in Optional Modules my $updated_optional_setting = { optional => { enable_show_me_another => 1 } }; -$updated_course_settings = $course_rs->updateCourseSettings( $new_course_info, $updated_optional_setting ); -$current_course_values = mergeCourseSettings( $current_course_values, $updated_optional_setting ); +$updated_course_settings = $course_rs->updateCourseSettings($new_course_info, $updated_optional_setting); +$current_course_values = mergeCourseSettings($current_course_values, $updated_optional_setting); -is_deeply( $current_course_values, $updated_course_settings, "course_settings: updated optional setting" ); +is_deeply($current_course_values, $updated_course_settings, "course_settings: updated optional setting"); # set a single course setting in problem_set my $updated_problem_set_setting = { problem_set => { time_assign_due => "11:52" } }; -$updated_course_settings = $course_rs->updateCourseSettings( $new_course_info, $updated_problem_set_setting ); -$current_course_values = mergeCourseSettings( $current_course_values, $updated_problem_set_setting ); +$updated_course_settings = $course_rs->updateCourseSettings($new_course_info, $updated_problem_set_setting); +$current_course_values = mergeCourseSettings($current_course_values, $updated_problem_set_setting); -is_deeply( $current_course_values, $updated_course_settings, "course_settings: updated problem set setting" ); +is_deeply($current_course_values, $updated_course_settings, "course_settings: updated problem set setting"); # set a single course setting in problem my $updated_problem_setting = { problem => { display_mode => "images" } }; -$updated_course_settings = $course_rs->updateCourseSettings( $new_course_info, $updated_problem_setting ); -$current_course_values = mergeCourseSettings( $current_course_values, $updated_problem_setting ); +$updated_course_settings = $course_rs->updateCourseSettings($new_course_info, $updated_problem_setting); +$current_course_values = mergeCourseSettings($current_course_values, $updated_problem_setting); -is_deeply( $current_course_values, $updated_course_settings, "course_settings: updated problem setting" ); +is_deeply($current_course_values, $updated_course_settings, "course_settings: updated problem setting"); # make sure that an nonexistant setting throws an exception my $undefined_problem_setting = { general => { non_existent_setting => 1 } }; throws_ok { - $course_rs->updateCourseSettings( $new_course_info, $undefined_problem_setting ); + $course_rs->updateCourseSettings($new_course_info, $undefined_problem_setting); } "DB::Exception::UndefinedCourseField", "course settings: undefined course_setting field"; @@ -268,7 +260,7 @@ throws_ok { my $invalid_list_option = { general => { hardcopy_theme => 'default' } }; -$course_rs->updateCourseSettings( $new_course_info, $invalid_list_option ); +$course_rs->updateCourseSettings($new_course_info, $invalid_list_option); # make sure that an invalid integer setting throws an exception @@ -280,6 +272,6 @@ $course_rs->updateCourseSettings( $new_course_info, $invalid_list_option ); ## finally delete the new course that was made; -$course_rs->deleteCourse( { course_id => $new_course->{course_id} } ); +$course_rs->deleteCourse({ course_id => $new_course->{course_id} }); done_testing(); diff --git a/t/db/003_users.t b/t/db/003_users.t index c0e995ef..7c7e6e64 100644 --- a/t/db/003_users.t +++ b/t/db/003_users.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -28,16 +28,14 @@ use DB::TestUtils qw/loadCSV removeIDs loadSchema/; my $schema = loadSchema(); - # $schema->storage->debug(1); # print out the SQL commands. my $users_rs = $schema->resultset("User"); # remove the maggie user if exists in the database -my $maggie = $users_rs->find({username => "maggie"}); +my $maggie = $users_rs->find({ username => "maggie" }); $maggie->delete if defined($maggie); - ## get a list of users from the CSV file my @students = loadCSV("$main::test_dir/sample_data/students.csv"); @@ -58,12 +56,12 @@ for my $student (@students) { push( @students, { - username => "admin", - email => 'admin@google.com', - is_admin => 1, - first_name => "Andrea", - last_name => "Administrator", - student_id => undef + username => "admin", + email => 'admin@google.com', + is_admin => 1, + first_name => "Andrea", + last_name => "Administrator", + student_id => undef } ); my @all_students = sort { $a->{username} cmp $b->{username} } @students; @@ -76,39 +74,39 @@ for my $user (@users_from_db) { } @users_from_db = sort { $a->{username} cmp $b->{username} } @users_from_db; -is_deeply( \@all_students, \@users_from_db, "getUsers: all users" ); +is_deeply(\@all_students, \@users_from_db, "getUsers: all users"); # dd \@all_students; # dd \@users_from_db; ## get one user that exists -my $user = $users_rs->getGlobalUser( { username => $all_students[0]->{username} } ); +my $user = $users_rs->getGlobalUser({ username => $all_students[0]->{username} }); removeIDs($user); delete $user->{role}; -is_deeply( $all_students[0], $user, "getUser: by username" ); +is_deeply($all_students[0], $user, "getUser: by username"); -$user = $users_rs->getGlobalUser( { user_id => 2 } ); +$user = $users_rs->getGlobalUser({ user_id => 2 }); removeIDs($user); my @stud2 = grep { $_->{username} eq $user->{username} } @all_students; -is_deeply( $stud2[0], $user, "getUser: by user_id" ); +is_deeply($stud2[0], $user, "getUser: by user_id"); ## get one user that does not exist throws_ok { - $user = $users_rs->getGlobalUser( { user_id => -9 } ); + $user = $users_rs->getGlobalUser({ user_id => -9 }); } "DB::Exception::UserNotFound", "getUser: undefined user_id"; throws_ok { - $user = $users_rs->getGlobalUser( { username => "non_existent_user" } ); + $user = $users_rs->getGlobalUser({ username => "non_existent_user" }); } "DB::Exception::UserNotFound", "getUser: undefined username"; ## add one user $user = { - username => "wiggam", + username => "wiggam", last_name => "Wiggam", first_name => "Clancy", email => 'wiggam@springfieldpd.gov', @@ -118,51 +116,51 @@ $user = { my $new_user = $users_rs->addGlobalUser($user); removeIDs($new_user); -is_deeply( $user, $new_user, "addUser: adding a user" ); +is_deeply($user, $new_user, "addUser: adding a user"); ## update a user my $updated_user = {%$user}; # make a copy of $user; $updated_user->{email} = 'spring.cop@gmail.com'; -my $up_user_from_db = $users_rs->updateGlobalUser( { username => $updated_user->{username} }, $updated_user ); +my $up_user_from_db = $users_rs->updateGlobalUser({ username => $updated_user->{username} }, $updated_user); removeIDs($up_user_from_db); -is_deeply( $updated_user, $up_user_from_db, "updateUser: updating a user" ); +is_deeply($updated_user, $up_user_from_db, "updateUser: updating a user"); ## try to update a user without passing username info: throws_ok { - $users_rs->updateGlobalUser( { username_name => "wiggam" }, $updated_user ); + $users_rs->updateGlobalUser({ username_name => "wiggam" }, $updated_user); } "DB::Exception::ParametersNeeded", "updateUser: wrong user_info sent"; ## try to update a user that doesn't exist: throws_ok { - $users_rs->updateGlobalUser( { username => "non_existent_user" }, $updated_user ); + $users_rs->updateGlobalUser({ username => "non_existent_user" }, $updated_user); } "DB::Exception::UserNotFound", "updateUser: update user for a non-existing username"; throws_ok { - $users_rs->updateGlobalUser( { user_id => -5 }, $updated_user ); + $users_rs->updateGlobalUser({ user_id => -5 }, $updated_user); } "DB::Exception::UserNotFound", "updateUser: update user for a non-existing user_id"; ## delete a user -my $user_to_delete = $users_rs->deleteGlobalUser( { username => $user->{username} } ); +my $user_to_delete = $users_rs->deleteGlobalUser({ username => $user->{username} }); delete $user_to_delete->{user_id}; -is_deeply( $updated_user, $user_to_delete, "deleteUser: delete a user" ); +is_deeply($updated_user, $user_to_delete, "deleteUser: delete a user"); ## delete a user that doesn't exist. throws_ok { - $user = $users_rs->deleteGlobalUser( { username => "undefined_username" } ); + $user = $users_rs->deleteGlobalUser({ username => "undefined_username" }); } "DB::Exception::UserNotFound", "deleteUser: trying to delete with undefined username"; throws_ok { - $user = $users_rs->deleteGlobalUser( { user_id => -3 } ); + $user = $users_rs->deleteGlobalUser({ user_id => -3 }); } "DB::Exception::UserNotFound", "deleteUser: trying to delete with undefined user_id"; diff --git a/t/db/004_course_users.t b/t/db/004_course_users.t index f47f2a05..b03af708 100644 --- a/t/db/004_course_users.t +++ b/t/db/004_course_users.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -50,7 +50,7 @@ for my $student (@precalc_students) { ## get the course_id for Precalc -my $precalc = $course_rs->getCourse({course_name => "Precalculus"}); +my $precalc = $course_rs->getCourse({ course_name => "Precalculus" }); ## test getUsers @@ -63,17 +63,14 @@ my @results = $user_rs->search( } ); my @users = map { - removeLoginParams( - { - $_->get_columns, - $_->course_users->first->get_columns, - params => $_->course_users->first->get_inflated_column("params") - } - ); - } @results; + removeLoginParams({ + $_->get_columns, $_->course_users->first->get_columns, + params => $_->course_users->first->get_inflated_column("params") + }); +} @results; my @precalc_students_from_db = sort { $a->{username} cmp $b->{username} } @users; -my $precalc_students_from_db = removeCourseUserIDs( \@precalc_students_from_db ); +my $precalc_students_from_db = removeCourseUserIDs(\@precalc_students_from_db); sub removeCourseUserIDs { my $users = shift; @@ -83,44 +80,44 @@ sub removeCourseUserIDs { return; } -is_deeply( \@precalc_students, \@precalc_students_from_db, "getUsers: get users from a course" ); +is_deeply(\@precalc_students, \@precalc_students_from_db, "getUsers: get users from a course"); ## getUsers: test that an unknown course results in an error throws_ok { - $user_rs->getCourseUsers( { course_name => "unknown_course" } ); + $user_rs->getCourseUsers({ course_name => "unknown_course" }); } 'DB::Exception::CourseNotFound', "getUsers: undefined course_name"; throws_ok { - $user_rs->getCourseUsers( { course_id => -3 } ); + $user_rs->getCourseUsers({ course_id => -3 }); } 'DB::Exception::CourseNotFound', "getUsers: undefined course_id"; ## test getUser -my $user = $user_rs->getUser( { course_name => "Precalculus", username => $precalc_students[0]->{username} } ); +my $user = $user_rs->getUser({ course_name => "Precalculus", username => $precalc_students[0]->{username} }); removeIDs($user); -is_deeply( $precalc_students[0], $user, "getUser: get one user" ); +is_deeply($precalc_students[0], $user, "getUser: get one user"); ## getUser: test that an unknown course results in an error throws_ok { - $user_rs->getUser( { course_name => "unknown_course", username => "barney" } ); + $user_rs->getUser({ course_name => "unknown_course", username => "barney" }); } 'DB::Exception::CourseNotFound', "getUser: undefined course"; ## getUser: test that an unknown user results in an error throws_ok { - $user_rs->getUser( { course_name => "Precalculus", username => "unknown_user" } ); + $user_rs->getUser({ course_name => "Precalculus", username => "unknown_user" }); } 'DB::Exception::UserNotInCourse', "getUser: undefined user"; ## getUser: test that an existing user who is not in the course returns an error. throws_ok { - $user_rs->getUser( { course_name => "Arithmetic", username => "marge" } ); + $user_rs->getUser({ course_name => "Arithmetic", username => "marge" }); } 'DB::Exception::UserNotInCourse', "getUser: get a user that is not in the course"; @@ -128,30 +125,28 @@ throws_ok { # remove the following user if already defined in the course -my $arithmetic = $course_rs->find( {course_name => "Arithmetic" }); -my $quimby = $user_rs->find( { username => "quimby" }); +my $arithmetic = $course_rs->find({ course_name => "Arithmetic" }); +my $quimby = $user_rs->find({ username => "quimby" }); # warn Dumper {$quimby->get_inflated_columns} if $quimby; -if( defined($quimby)) { +if (defined($quimby)) { $quimby->delete; - my $cu = $schema->resultset("CourseUser") - ->find( { user_id => $quimby->user_id, course_id => $arithmetic->course_id}); + my $cu = + $schema->resultset("CourseUser")->find({ user_id => $quimby->user_id, course_id => $arithmetic->course_id }); $cu->delete if defined($cu); } # warn Dumper {$cu->get_inflated_columns} if $cu; -my $user_params = -{ - username => "quimby", +my $user_params = { + username => "quimby", first_name => "Joe", last_name => "Quimby", email => 'mayor_joe@springfield.gov', student_id => "12345", is_admin => 0 }; -my $course_user_params = -{ +my $course_user_params = { course_name => "Arithmetic", - username => "quimby", + username => "quimby", role => "student", params => {}, recitation => undef, @@ -166,19 +161,19 @@ for my $key (qw/username course_name/) { removeIDs($user); delete $user_params->{course_name}; -is_deeply( $course_user_params, $user, "addUser: add a user to a course" ); +is_deeply($course_user_params, $user, "addUser: add a user to a course"); ## addUser: check that if the course doesn't exist, an error is thrown: throws_ok { - $user_rs->addCourseUser( { course_name => "unknown_course", username => "barney" }, {} ); + $user_rs->addCourseUser({ course_name => "unknown_course", username => "barney" }, {}); } "DB::Exception::CourseNotFound", "addUser: the course doesn't exist"; ## addUser: the course exists, but the user is already a member. throws_ok { - $user_rs->addCourseUser( { course_name => "Arithmetic", username => "moe" }); + $user_rs->addCourseUser({ course_name => "Arithmetic", username => "moe" }); } "DB::Exception::UserAlreadyInCourse", "addUser: the user is already a member"; @@ -186,58 +181,57 @@ throws_ok { my $updated_user = { params => { comment => 'Mayor Joe is the best!!' }, recitation => "2" }; -for my $key ( keys %$updated_user ) { +for my $key (keys %$updated_user) { $course_user_params->{$key} = $updated_user->{$key}; } -my $user_from_db = $user_rs->updateCourseUser( { course_name => 'Arithmetic', username => 'quimby' }, $updated_user ); +my $user_from_db = $user_rs->updateCourseUser({ course_name => 'Arithmetic', username => 'quimby' }, $updated_user); removeIDs($user_from_db); -is_deeply( $course_user_params, $user_from_db, "updateUser: update a single user in an existing course." ); +is_deeply($course_user_params, $user_from_db, "updateUser: update a single user in an existing course."); ## updateUser: check that if the course doesn't exist, an error is thrown: throws_ok { - $user_rs->updateCourseUser( { course_name => "unknown_course", username => "barney" }, $updated_user ); + $user_rs->updateCourseUser({ course_name => "unknown_course", username => "barney" }, $updated_user); } "DB::Exception::CourseNotFound", "updateUser: the course doesn't exist"; ## updateUser: check that if the course exists, but the user not a member. throws_ok { - $user_rs->updateCourseUser( { course_name => "Arithmetic", username => "marge" }, $updated_user ); + $user_rs->updateCourseUser({ course_name => "Arithmetic", username => "marge" }, $updated_user); } "DB::Exception::UserNotInCourse", "updateUser: the user is not a member of the course"; ## updateUser: send in wrong information throws_ok { - $user_rs->updateCourseUser( { course_name => "Arithmetic", username_name => "bart" }, $updated_user ); + $user_rs->updateCourseUser({ course_name => "Arithmetic", username_name => "bart" }, $updated_user); } "DB::Exception::ParametersNeeded", "updateUser: the incorrect information is passed in."; ## updateUser: update a user with nonvalid fields throws_ok { - $user_rs->updateCourseUser( { course_name => "Arithmetic", username => "quimby" }, { sleeps_in_class => 1 } ); + $user_rs->updateCourseUser({ course_name => "Arithmetic", username => "quimby" }, { sleeps_in_class => 1 }); } "DBIx::Class::Exception", "updateUser: an invalid field is set"; - # These next test add a course user where both the course and user exist, but the user is # not in the course. - my $course_user = { - username => "apu", + username => "apu", course_name => "Arithmetic", - role => "instructor", - params => {}, - recitation => undef, - section => undef + role => "instructor", + params => {}, + recitation => undef, + section => undef }; throws_ok { - $user_rs->getCourseUser({username => $course_user->{username}, course_name => $course_user->{course_name}}); -} "DB::Exception::UserNotInCourse", "getCourseUser: the user is not in the course"; + $user_rs->getCourseUser({ username => $course_user->{username}, course_name => $course_user->{course_name} }); +} +"DB::Exception::UserNotInCourse", "getCourseUser: the user is not in the course"; my $course_user_from_db = $user_rs->addCourseUser($course_user); removeIDs($course_user_from_db); @@ -246,19 +240,19 @@ for my $key (qw/username course_name/) { delete $course_user->{$key}; } -is_deeply($course_user,$course_user_from_db,"addCourseUser: successfully adding a course user"); +is_deeply($course_user, $course_user_from_db, "addCourseUser: successfully adding a course user"); # try to add a non-existent user from a course: throws_ok { - $user_rs->addCourseUser({ course_name => "Arithmetic", username => "non_existent_user"}) + $user_rs->addCourseUser({ course_name => "Arithmetic", username => "non_existent_user" }) } "DB::Exception::UserNotFound", "getCourseUser: try to add a non-existent user to a course"; # check that a non-existent course throws an error: throws_ok { - $user_rs->addCourseUser({ course_name => "non_existent_course", username => "bart"}) + $user_rs->addCourseUser({ course_name => "non_existent_course", username => "bart" }) } "DB::Exception::CourseNotFound", "getCourseUser: try to add a user to a non-existent course"; @@ -266,23 +260,25 @@ throws_ok { $course_user->{recitation} = "2"; -my $course_user3 = $user_rs->updateCourseUser({ - username => "apu", +my $course_user3 = $user_rs->updateCourseUser( + { + username => "apu", course_name => "Arithmetic" - },{recitation => "2"}); + }, + { recitation => "2" } +); removeIDs($course_user3); is_deeply($course_user3, $course_user, "updateCourseUser: update a field"); - ## delete a course user my $course_user_to_delete = $user_rs->deleteCourseUser({ - username => "apu", - course_name => "Arithmetic", - }); + username => "apu", + course_name => "Arithmetic", +}); removeIDs($course_user_to_delete); -is_deeply($course_user_to_delete,$course_user, "deleteCourseUser: delete a course user"); +is_deeply($course_user_to_delete, $course_user, "deleteCourseUser: delete a course user"); ## deleteUser: delete a single user from a course @@ -294,12 +290,12 @@ SKIP: { skip "delete added users", 5 if $dont_delete_users; - my $deleted_course_user = $user_rs->deleteCourseUser( { course_name => "Arithmetic", username => "quimby" } ); + my $deleted_course_user = $user_rs->deleteCourseUser({ course_name => "Arithmetic", username => "quimby" }); removeIDs($deleted_course_user); - is_deeply( $course_user_params, $deleted_course_user, 'deleteCourseUser: delete a user from a course' ); + is_deeply($course_user_params, $deleted_course_user, 'deleteCourseUser: delete a user from a course'); - $deleted_user = $user_rs->deleteGlobalUser( {username => "quimby"}); + $deleted_user = $user_rs->deleteGlobalUser({ username => "quimby" }); removeIDs($deleted_user); is_deeply($user_params, $deleted_user, "deleteGlobalUser: delete a user"); @@ -307,21 +303,21 @@ SKIP: { ## deleteUser: check that if the course doesn't exist, an error is thrown: throws_ok { - $user_rs->deleteCourseUser( { course_name => "unknown_course", username => "barney" } ); + $user_rs->deleteCourseUser({ course_name => "unknown_course", username => "barney" }); } "DB::Exception::CourseNotFound", "deleteUser: the course doesn't exist"; ## deleteUser: check that if the course exists, but the user not a member. throws_ok { - $user_rs->deleteCourseUser( { course_name => "Arithmetic", username => "marge" } ); + $user_rs->deleteCourseUser({ course_name => "Arithmetic", username => "marge" }); } "DB::Exception::UserNotInCourse", "deleteUser: the user is not a member of the course"; ## deleteUser: send in username_name instead of username throws_ok { - $user_rs->deleteCourseUser( { course_name => "Arithmetic", username_name => "bart" } ); + $user_rs->deleteCourseUser({ course_name => "Arithmetic", username_name => "bart" }); } "DB::Exception::ParametersNeeded", "deleteUser: the incorrect information is passed in."; diff --git a/t/db/005_hwsets.t b/t/db/005_hwsets.t index 8cca5cc9..4639823c 100644 --- a/t/db/005_hwsets.t +++ b/t/db/005_hwsets.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -33,7 +33,7 @@ use DB::TestUtils qw/loadCSV removeIDs filterBySetType loadSchema/; my $schema = loadSchema(); -my $strp = DateTime::Format::Strptime->new( pattern => '%FT%T',on_error => 'croak' ); +my $strp = DateTime::Format::Strptime->new(pattern => '%FT%T', on_error => 'croak'); # $schema->storage->debug(1); # print out the SQL commands. @@ -48,16 +48,16 @@ my $user_rs = $schema->resultset("User"); my @hw_sets = loadCSV("$main::test_dir/sample_data/hw_sets.csv"); for my $set (@hw_sets) { $set->{set_type} = "HW"; - for my $date (keys %{$set->{dates}}) { - my $dt = $strp->parse_datetime( $set->{dates}->{$date}); + for my $date (keys %{ $set->{dates} }) { + my $dt = $strp->parse_datetime($set->{dates}->{$date}); $set->{dates}->{$date} = $dt->epoch; } } my @quizzes = loadCSV("$main::test_dir/sample_data/quizzes.csv"); for my $quiz (@quizzes) { $quiz->{set_type} = "QUIZ"; - for my $date (keys %{$quiz->{dates}}) { - my $dt = $strp->parse_datetime( $quiz->{dates}->{$date}); + for my $date (keys %{ $quiz->{dates} }) { + my $dt = $strp->parse_datetime($quiz->{dates}->{$date}); $quiz->{dates}->{$date} = $dt->epoch; } } @@ -65,19 +65,19 @@ for my $quiz (@quizzes) { my @review_sets = loadCSV("$main::test_dir/sample_data/review_sets.csv"); for my $set (@review_sets) { $set->{set_type} = "REVIEW"; - for my $date (keys %{$set->{dates}}) { - my $dt = $strp->parse_datetime( $set->{dates}->{$date}); + for my $date (keys %{ $set->{dates} }) { + my $dt = $strp->parse_datetime($set->{dates}->{$date}); $set->{dates}->{$date} = $dt->epoch; } } -my @all_problem_sets = ( @hw_sets, @quizzes, @review_sets ); +my @all_problem_sets = (@hw_sets, @quizzes, @review_sets); ## Test getting all problem sets my @problem_sets_from_db = $problem_set_rs->getAllProblemSets; @problem_sets_from_db = sort { $a->{set_name} cmp $b->{set_name} } @problem_sets_from_db; -@all_problem_sets = sort { $a->{set_name} cmp $b->{set_name} } @all_problem_sets; +@all_problem_sets = sort { $a->{set_name} cmp $b->{set_name} } @all_problem_sets; ## remove the id tags: for my $set (@problem_sets_from_db) { @@ -86,14 +86,12 @@ for my $set (@problem_sets_from_db) { delete $set->{course_dates}; } - -is_deeply( \@all_problem_sets, \@problem_sets_from_db, "getProblemSets: get all sets" ); - +is_deeply(\@all_problem_sets, \@problem_sets_from_db, "getProblemSets: get all sets"); ## test for all sets in one course # filter the precalculus sets: -my @precalc_sets = filterBySetType( \@all_problem_sets, undef, "Precalculus" ); +my @precalc_sets = filterBySetType(\@all_problem_sets, undef, "Precalculus"); ## make a clone of the sets: my $all_precalc_sets = clone(\@precalc_sets); @@ -104,18 +102,18 @@ for my $set (@$all_precalc_sets) { my @all_precalc_sets = sort { $a->{set_name} cmp $b->{set_name} } @$all_precalc_sets; -my @precalc_sets_from_db = $problem_set_rs->getProblemSets( { course_name => "Precalculus" } ); +my @precalc_sets_from_db = $problem_set_rs->getProblemSets({ course_name => "Precalculus" }); # remove id tags: for my $set (@precalc_sets_from_db) { removeIDs($set); } -is_deeply( \@all_precalc_sets, \@precalc_sets_from_db, "getProblemSets: get sets for one course" ); +is_deeply(\@all_precalc_sets, \@precalc_sets_from_db, "getProblemSets: get sets for one course"); ## test all HW sets in one course -my @precalc_hw = filterBySetType( \@all_problem_sets, "HW", "Precalculus" ); +my @precalc_hw = filterBySetType(\@all_problem_sets, "HW", "Precalculus"); @precalc_hw = map { {%$_}; } @precalc_hw; # make a clone @@ -124,38 +122,38 @@ for my $set (@precalc_hw) { delete $set->{course_name}; } @precalc_hw = sort { $a->{set_name} cmp $b->{set_name} } @precalc_hw; -my @precalc_hw_from_db = $problem_set_rs->getHWSets( { course_name => "Precalculus" } ); +my @precalc_hw_from_db = $problem_set_rs->getHWSets({ course_name => "Precalculus" }); # remove id tags: for my $set (@precalc_hw_from_db) { removeIDs($set); } -is_deeply( \@precalc_hw, \@precalc_hw_from_db, "getHWSets: get all homework for one course" ); +is_deeply(\@precalc_hw, \@precalc_hw_from_db, "getHWSets: get all homework for one course"); ## get one Problem set my $set_one = $precalc_hw[0]; -my $set_from_db = $problem_set_rs->getProblemSet( { course_name => "Precalculus", set_name => $set_one->{set_name} } ); +my $set_from_db = $problem_set_rs->getProblemSet({ course_name => "Precalculus", set_name => $set_one->{set_name} }); removeIDs($set_from_db); -is_deeply( $set_one, $set_from_db, "getProblemSet: get one homework" ); +is_deeply($set_one, $set_from_db, "getProblemSet: get one homework"); ## get a problem set that doesn't exist. throws_ok { - $problem_set_rs->getProblemSet( { course_name => "Precalculus", set_name => "nonexistent_set" } ); + $problem_set_rs->getProblemSet({ course_name => "Precalculus", set_name => "nonexistent_set" }); } "DB::Exception::SetNotInCourse", "getProblemSet: non-existent set name"; throws_ok { - $problem_set_rs->getProblemSet( { course_name => "Precalculus", set_id => 99999 } ); + $problem_set_rs->getProblemSet({ course_name => "Precalculus", set_id => 99999 }); } "DB::Exception::SetNotInCourse", "getProblemSet: non-existent set_id"; ## try to get a problem set that is not in a given course throws_ok { - $problem_set_rs->getProblemSet( { course_name => "Precalculus", set_id => 6 } ); + $problem_set_rs->getProblemSet({ course_name => "Precalculus", set_id => 6 }); } "DB::Exception::SetNotInCourse", "getProblemSet: find a set that is not in a course"; @@ -167,13 +165,12 @@ my $new_set_params = { set_type => "HW" }; -my $new_set = $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_set_params ); +my $new_set = $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_set_params); my $new_set_id = $new_set->{set_id}; removeIDs($new_set); delete $new_set->{type}; -is_deeply( $new_set_params, $new_set, "addProblemSet: add one homework" ); - +is_deeply($new_set_params, $new_set, "addProblemSet: add one homework"); ## try to add a homework without set_name @@ -184,7 +181,7 @@ my $new_set2 = { }; throws_ok { - $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_set2 ); + $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_set2); } "DB::Exception::ParametersNeeded", "addProblemSet: set_name not passed in."; @@ -197,7 +194,7 @@ my $new_set3 = { }; throws_ok { - $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_set3 ); + $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_set3); } "DB::Exception::InvalidDateField", "addProblemSet: invalid date field passed in."; @@ -210,7 +207,7 @@ my $new_set4 = { }; throws_ok { - $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_set4 ); + $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_set4); } "DB::Exception::RequiredDateFields", "addProblemSet: missing required date fields"; @@ -222,7 +219,7 @@ my $new_set5 = { set_type => "HW" }; throws_ok { - $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_set5 ); + $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_set5); } "DB::Exception::InvalidDateFormat", "addProblemSet: adding a non-numeric date"; @@ -235,7 +232,7 @@ my $new_set6 = { params => {} }; throws_ok { - $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_set6 ); + $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_set6); } "DB::Exception::ImproperDateOrder", "addProblemSet: adding an illegal date order."; @@ -249,7 +246,7 @@ my $new_set7 = { }; throws_ok { - $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_set7 ); + $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_set7); } "DB::Exception::UndefinedParameter", "addProblemSet: adding an undefined parameter field"; @@ -262,7 +259,7 @@ my $new_set8 = { params => { enable_reduced_scoring => 0, hide_hint => "yes" } }; throws_ok { - $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_set8 ); + $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_set8); } "DB::Exception::InvalidParameter", "addProblemSet: adding an non-valid parameter"; @@ -272,13 +269,13 @@ $new_set_params->{set_name} = "HW #8"; $new_set_params->{params} = { enable_reduced_scoring => 1 }; $new_set_params->{type} = 1; -my $updated_set = $problem_set_rs->updateProblemSet( { course_name => "Precalculus", set_id => $new_set_id }, - { set_name => $new_set_params->{set_name}, params => { enable_reduced_scoring => 1 } } ); +my $updated_set = $problem_set_rs->updateProblemSet({ course_name => "Precalculus", set_id => $new_set_id }, + { set_name => $new_set_params->{set_name}, params => { enable_reduced_scoring => 1 } }); removeIDs($updated_set); delete $updated_set->{set_visible}; delete $new_set_params->{type}; -is_deeply( $new_set_params, $updated_set, "updateSet: change the set parameters" ); +is_deeply($new_set_params, $updated_set, "updateSet: change the set parameters"); ## update the set where the set_type is sent, but the type is not: @@ -286,44 +283,43 @@ $new_set_params->{set_name} = "HW #88"; $new_set_params->{set_type} = "HW"; delete $new_set_params->{type}; -$updated_set = $problem_set_rs->updateProblemSet({course_name => "Precalculus", set_id => $new_set_id}, - $new_set_params); +$updated_set = + $problem_set_rs->updateProblemSet({ course_name => "Precalculus", set_id => $new_set_id }, $new_set_params); removeIDs($updated_set); delete $updated_set->{set_visible}; -is_deeply( $new_set_params, $updated_set, "updateSet: update a set with set_type defined." ); - +is_deeply($new_set_params, $updated_set, "updateSet: update a set with set_type defined."); ## try to update a set with an illegal field throws_ok { - $problem_set_rs->updateProblemSet( { course_name => "Precalculus", set_id => $new_set_id }, { bad_field => 0 } ); + $problem_set_rs->updateProblemSet({ course_name => "Precalculus", set_id => $new_set_id }, { bad_field => 0 }); } "DBIx::Class::Exception", "updateProblemSet: use a non-existing field"; ## try to update a set with an illegal date field throws_ok { - $problem_set_rs->updateProblemSet( { course_name => "Precalculus", set_id => $new_set_id }, - { dates => { bad_date => 99 } } ); + $problem_set_rs->updateProblemSet({ course_name => "Precalculus", set_id => $new_set_id }, + { dates => { bad_date => 99 } }); } "DB::Exception::InvalidDateField", "updateSet: invalid date field passed in."; ## try to update a set with an dates in a bad order throws_ok { - $problem_set_rs->updateProblemSet( { course_name => "Precalculus", set_id => $new_set_id }, - { dates => { open => 999, answer => 100 } } ); + $problem_set_rs->updateProblemSet({ course_name => "Precalculus", set_id => $new_set_id }, + { dates => { open => 999, answer => 100 } }); } "DB::Exception::ImproperDateOrder", "updateSet: adding an illegal date order."; ## delete a set -my $deleted_set = $problem_set_rs->deleteProblemSet( { course_name => "Precalculus", set_name => "HW #88" } ); +my $deleted_set = $problem_set_rs->deleteProblemSet({ course_name => "Precalculus", set_name => "HW #88" }); removeIDs($deleted_set); delete $deleted_set->{set_visible}; -is_deeply( $new_set_params, $deleted_set, "deleteProblemSet: delete a set" ); +is_deeply($new_set_params, $deleted_set, "deleteProblemSet: delete a set"); done_testing; diff --git a/t/db/006_quizzes.t b/t/db/006_quizzes.t index 27204aeb..88ac1350 100644 --- a/t/db/006_quizzes.t +++ b/t/db/006_quizzes.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -30,7 +30,7 @@ use DB::Schema; use DB::TestUtils qw/loadCSV removeIDs filterBySetType loadSchema/; my $schema = loadSchema(); -my $strp = DateTime::Format::Strptime->new( pattern => '%FT%T',on_error => 'croak' ); +my $strp = DateTime::Format::Strptime->new(pattern => '%FT%T', on_error => 'croak'); # $schema->storage->debug(1); # print out the SQL commands. @@ -47,64 +47,62 @@ my @quizzes = loadCSV("$main::test_dir/sample_data/quizzes.csv"); for my $quiz (@quizzes) { $quiz->{type} = 2; $quiz->{set_type} = "QUIZ"; - for my $date (keys %{$quiz->{dates}}) { - my $dt = $strp->parse_datetime( $quiz->{dates}->{$date}); + for my $date (keys %{ $quiz->{dates} }) { + my $dt = $strp->parse_datetime($quiz->{dates}->{$date}); $quiz->{dates}->{$date} = $dt->epoch; } } ## remove the quiz: Quiz #9 if it exists: -my $quiz_to_delete = $problem_set_rs->find({set_name => "Quiz #9"}); +my $quiz_to_delete = $problem_set_rs->find({ set_name => "Quiz #9" }); $quiz_to_delete->delete if defined($quiz_to_delete); - ## test: get all quizzes from one course -my @precalc_quizzes = filterBySetType( \@quizzes, "QUIZ", "Precalculus" ); +my @precalc_quizzes = filterBySetType(\@quizzes, "QUIZ", "Precalculus"); @precalc_quizzes = map { {%$_}; -} @precalc_quizzes; # clone all quizzes +} @precalc_quizzes; # clone all quizzes for my $quiz (@precalc_quizzes) { delete $quiz->{course_name}; # delete $quiz->{type}; } @precalc_quizzes = sort { $a->{set_name} cmp $b->{set_name} } @precalc_quizzes; -my @precalc_quizzes_from_db = $problem_set_rs->getQuizzes( { course_name => "Precalculus" } ); +my @precalc_quizzes_from_db = $problem_set_rs->getQuizzes({ course_name => "Precalculus" }); # remove id tags: for my $quiz (@precalc_quizzes_from_db) { removeIDs($quiz); } -is_deeply( \@precalc_quizzes, \@precalc_quizzes_from_db, "getQuizzes: get all quizzes for one course" ); +is_deeply(\@precalc_quizzes, \@precalc_quizzes_from_db, "getQuizzes: get all quizzes for one course"); # get a single quiz -my $quiz_from_db = $problem_set_rs->getProblemSet({ course_name => "Precalculus", set_name => "Quiz #1"}); +my $quiz_from_db = $problem_set_rs->getProblemSet({ course_name => "Precalculus", set_name => "Quiz #1" }); removeIDs($quiz_from_db); -my @quiz_from_csv = grep { $_->{set_name} eq "Quiz #1"} @precalc_quizzes; +my @quiz_from_csv = grep { $_->{set_name} eq "Quiz #1" } @precalc_quizzes; delete $quiz_from_csv[0]->{type}; -is_deeply($quiz_from_csv[0],$quiz_from_db,"getQuiz: get one quiz from a single course"); +is_deeply($quiz_from_csv[0], $quiz_from_db, "getQuiz: get one quiz from a single course"); # try to get a quiz that doesn't exist in a course that does: throws_ok { - $problem_set_rs->getProblemSet( { course_name => "Precalculus", set_name => "nonexisent quiz" } ); + $problem_set_rs->getProblemSet({ course_name => "Precalculus", set_name => "nonexisent quiz" }); } "DB::Exception::SetNotInCourse", "getQuiz: non-existent set name"; # try to get a quiz from a course that doesn't exist throws_ok { - $problem_set_rs->getProblemSet( { course_name => "nonexistent course", set_name => "Quiz #1" } ); + $problem_set_rs->getProblemSet({ course_name => "nonexistent course", set_name => "Quiz #1" }); } "DB::Exception::CourseNotFound", "getQuiz: try to get a quiz from a non-existent course"; - ## add a new quiz my $new_quiz_params = { @@ -113,16 +111,16 @@ my $new_quiz_params = { set_type => "QUIZ" }; -my $new_quiz = $problem_set_rs->addProblemSet( { course_name => "Precalculus" }, $new_quiz_params ); +my $new_quiz = $problem_set_rs->addProblemSet({ course_name => "Precalculus" }, $new_quiz_params); removeIDs($new_quiz); -is_deeply($new_quiz,$new_quiz_params,"addQuiz: add a new quiz"); +is_deeply($new_quiz, $new_quiz_params, "addQuiz: add a new quiz"); ## try to add a quiz to a non existent course throws_ok { - $problem_set_rs->addProblemSet( { course_name => "nonexistent course", set_name => "Quiz #1" } ); + $problem_set_rs->addProblemSet({ course_name => "nonexistent course", set_name => "Quiz #1" }); } "DB::Exception::CourseNotFound", "addQuiz: try to add a quiz from a non-existent course"; @@ -134,12 +132,13 @@ throws_ok { course_name => "Precalculus" }, { - set_type => 'QUIZ', - set_name => "Quiz #99", + set_type => 'QUIZ', + set_name => "Quiz #99", nonexistent_field => 1, } ) -} "DBIx::Class::Exception", "addQuiz: try to add a quiz with a bad parameter"; +} +"DBIx::Class::Exception", "addQuiz: try to add a quiz with a bad parameter"; ## try to add a quiz without specifying the name: @@ -153,7 +152,8 @@ throws_ok { set_visible => 1, } ); -} "DB::Exception::ParametersNeeded", "addQuiz: try to add a quiz with a bad field"; +} +"DB::Exception::ParametersNeeded", "addQuiz: try to add a quiz with a bad field"; ## try to add a quiz with an undefined parameter: @@ -163,20 +163,21 @@ throws_ok { course_name => "Precalculus" }, { - set_type => 'QUIZ', - set_name => "Quiz #99", + set_type => 'QUIZ', + set_name => "Quiz #99", set_visible => 1, - params => { + params => { param1 => 0 }, dates => { - open => 10, - due => 100, + open => 10, + due => 100, answer => 200, } } ); -} "DB::Exception::UndefinedParameter", "addQuiz: try to add a quiz with a undefined parameter"; +} +"DB::Exception::UndefinedParameter", "addQuiz: try to add a quiz with a undefined parameter"; ## try to add a quiz with a non-valid parameter: @@ -186,20 +187,21 @@ throws_ok { course_name => "Precalculus" }, { - set_type => 'QUIZ', - set_name => "Quiz #99", + set_type => 'QUIZ', + set_name => "Quiz #99", set_visible => 1, - params => { + params => { timed => 'yes' }, dates => { - open => 10, - due => 100, + open => 10, + due => 100, answer => 200, } } ); -} "DB::Exception::InvalidParameter", "addQuiz: try to add a quiz with a non-valid parameter"; +} +"DB::Exception::InvalidParameter", "addQuiz: try to add a quiz with a non-valid parameter"; ## try to add a quiz with a missing required date fields @@ -211,13 +213,14 @@ throws_ok { { set_type => 'QUIZ', set_name => "Quiz #99", - dates => { + dates => { open => 10, - due => 100 + due => 100 } } ); -} "DB::Exception::RequiredDateFields", "addQuiz: try to add a quiz with a missing required date fields"; +} +"DB::Exception::RequiredDateFields", "addQuiz: try to add a quiz with a missing required date fields"; ## try to add a quiz with an undefined date field @@ -227,18 +230,19 @@ throws_ok { course_name => "Precalculus" }, { - set_type => 'QUIZ', - set_name => "Quiz #99", + set_type => 'QUIZ', + set_name => "Quiz #99", set_visible => 1, - dates => { - open => 10, - due => 100, - answer => 200, + dates => { + open => 10, + due => 100, + answer => 200, reduced_scoring => 300 } } ); -} "DB::Exception::InvalidDateField", "addQuiz: try to add a quiz with an undefined date field"; +} +"DB::Exception::InvalidDateField", "addQuiz: try to add a quiz with an undefined date field"; ## try to add a quiz with dates that are out of order @@ -248,34 +252,33 @@ throws_ok { course_name => "Precalculus" }, { - set_type => 'QUIZ', - set_name => "Quiz #99", + set_type => 'QUIZ', + set_name => "Quiz #99", set_visible => 1, - dates => { - open => 10, - due => 300, + dates => { + open => 10, + due => 300, answer => 200, } } ); -} "DB::Exception::ImproperDateOrder", "addQuiz: try to add a quiz with dates that are out of order"; +} +"DB::Exception::ImproperDateOrder", "addQuiz: try to add a quiz with dates that are out of order"; # update the visibility of the quiz -my $updated_params = { - set_visible => 0 -}; +my $updated_params = { set_visible => 0 }; my $updated_quiz = $problem_set_rs->updateProblemSet( { course_name => "Precalculus", - set_name => "Quiz #9" + set_name => "Quiz #9" }, $updated_params ); $new_quiz->{set_visible} = 0; -$new_quiz->{params} = {}; +$new_quiz->{params} = {}; removeIDs($updated_quiz); @@ -292,13 +295,13 @@ $updated_params = { $updated_quiz = $problem_set_rs->updateProblemSet( { course_name => "Precalculus", - set_name => "Quiz #9" + set_name => "Quiz #9" }, $updated_params ); removeIDs($updated_quiz); -$new_quiz->{params} = { timed => 1}; +$new_quiz->{params} = { timed => 1 }; is_deeply($new_quiz, $updated_quiz, "updateQuiz: successfully update the params of the quiz"); @@ -306,8 +309,8 @@ is_deeply($new_quiz, $updated_quiz, "updateQuiz: successfully update the params $updated_params = { dates => { - open => 400, - due => 500, + open => 400, + due => 500, answer => 600 } }; @@ -315,7 +318,7 @@ $updated_params = { $updated_quiz = $problem_set_rs->updateProblemSet( { course_name => "Precalculus", - set_name => "Quiz #9" + set_name => "Quiz #9" }, $updated_params ); @@ -331,13 +334,14 @@ throws_ok { $problem_set_rs->updateProblemSet( { course_name => "Precalculus", - set_name => "Quiz #9" + set_name => "Quiz #9" }, { nonexistent_field => 1 } ); -} "DBIx::Class::Exception", "updateQuiz: try to update a quiz with a non-valid field"; +} +"DBIx::Class::Exception", "updateQuiz: try to update a quiz with a non-valid field"; # try to update a non-existent param of the quiz @@ -345,7 +349,7 @@ throws_ok { $problem_set_rs->updateProblemSet( { course_name => "Precalculus", - set_name => "Quiz #9" + set_name => "Quiz #9" }, { params => { @@ -353,7 +357,8 @@ throws_ok { } } ); -} "DB::Exception::UndefinedParameter", "updateQuiz: try to update a quiz with an undefined parameter"; +} +"DB::Exception::UndefinedParameter", "updateQuiz: try to update a quiz with an undefined parameter"; # try to update a parameter with a bad value @@ -361,7 +366,7 @@ throws_ok { $problem_set_rs->updateProblemSet( { course_name => "Precalculus", - set_name => "Quiz #9" + set_name => "Quiz #9" }, { params => { @@ -369,7 +374,8 @@ throws_ok { } } ); -} "DB::Exception::InvalidParameter", "updateQuiz: try to update a quiz with a non-valid field"; +} +"DB::Exception::InvalidParameter", "updateQuiz: try to update a quiz with a non-valid field"; # try to update a quiz with an invalid date @@ -377,7 +383,7 @@ throws_ok { $problem_set_rs->updateProblemSet( { course_name => "Precalculus", - set_name => "Quiz #9" + set_name => "Quiz #9" }, { dates => { @@ -385,7 +391,8 @@ throws_ok { } } ); -} "DB::Exception::InvalidDateField", "updateQuiz: try to update a quiz with a non-valid date"; +} +"DB::Exception::InvalidDateField", "updateQuiz: try to update a quiz with a non-valid date"; # try to update a quiz with a date out of order @@ -393,73 +400,67 @@ throws_ok { $problem_set_rs->updateProblemSet( { course_name => "Precalculus", - set_name => "Quiz #9" + set_name => "Quiz #9" }, { dates => { open => 50, - due => 40 + due => 40 } } ); -} "DB::Exception::ImproperDateOrder", "updateQuiz: try to update a quiz with out of order dates"; +} +"DB::Exception::ImproperDateOrder", "updateQuiz: try to update a quiz with out of order dates"; # try to delete from a non-existent course: throws_ok { - $problem_set_rs->deleteProblemSet( - { - course_name => "Course does not exist", - set_name => "Quiz #9" - } - ); -} "DB::Exception::CourseNotFound", 'deleteQuiz: try to delete a quiz from a non-existent course'; + $problem_set_rs->deleteProblemSet({ + course_name => "Course does not exist", + set_name => "Quiz #9" + }); +} +"DB::Exception::CourseNotFound", 'deleteQuiz: try to delete a quiz from a non-existent course'; # try to delete from a non-existent course: throws_ok { - $problem_set_rs->deleteProblemSet( - { - course_id => 9999, - set_name => "Quiz #9" - } - ); -} "DB::Exception::CourseNotFound", 'deleteQuiz: try to delete a quiz from a non-existent course_id'; + $problem_set_rs->deleteProblemSet({ + course_id => 9999, + set_name => "Quiz #9" + }); +} +"DB::Exception::CourseNotFound", 'deleteQuiz: try to delete a quiz from a non-existent course_id'; # try to delete from a non-existent set in a course: throws_ok { - $problem_set_rs->deleteProblemSet( - { - course_name => "Precalculus", - set_name => "Quiz #999" - } - ); -} "DB::Exception::SetNotInCourse", 'deleteQuiz: try to delete a non-existent quiz'; + $problem_set_rs->deleteProblemSet({ + course_name => "Precalculus", + set_name => "Quiz #999" + }); +} +"DB::Exception::SetNotInCourse", 'deleteQuiz: try to delete a non-existent quiz'; # try to delete from a non-existent set in a course: throws_ok { - $problem_set_rs->deleteProblemSet( - { - course_name => "Precalculus", - set_id => 99999 - } - ); -} "DB::Exception::SetNotInCourse", 'deleteQuiz: try to delete a non-existent quiz as set_id'; - + $problem_set_rs->deleteProblemSet({ + course_name => "Precalculus", + set_id => 99999 + }); +} +"DB::Exception::SetNotInCourse", 'deleteQuiz: try to delete a non-existent quiz as set_id'; # try to delete from a non-existent set in a course: -my $deleted_quiz = $problem_set_rs->deleteProblemSet( - { - course_name => "Precalculus", - set_name => "Quiz #9" - } - ); +my $deleted_quiz = $problem_set_rs->deleteProblemSet({ + course_name => "Precalculus", + set_name => "Quiz #9" +}); removeIDs($deleted_quiz); -is_deeply($deleted_quiz,$new_quiz,"delete Quiz: successfully delete a quiz"); +is_deeply($deleted_quiz, $new_quiz, "delete Quiz: successfully delete a quiz"); done_testing; diff --git a/t/db/007_user_set.t b/t/db/007_user_set.t index 4298889b..0e6914cc 100644 --- a/t/db/007_user_set.t +++ b/t/db/007_user_set.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -34,29 +34,28 @@ use DB::TestUtils qw/loadCSV removeIDs loadSchema/; my $schema = loadSchema(); -my $strp = DateTime::Format::Strptime->new( pattern => '%FT%T',on_error => 'croak' ); +my $strp = DateTime::Format::Strptime->new(pattern => '%FT%T', on_error => 'croak'); # $schema->storage->debug(1); # print out the SQL commands. my $user_set_rs = $schema->resultset("UserSet"); my $course_rs = $schema->resultset("Course"); my $course_user_rs = $schema->resultset("CourseUser"); -my $course = $course_rs->find( { course_id => 1 } ); +my $course = $course_rs->find({ course_id => 1 }); # temporarily delete the added set -my $u = $course_user_rs->find({user_id => 12 }); -my $user_sets_to_delete = $user_set_rs->search({course_user_id => $u->course_user_id}); +my $u = $course_user_rs->find({ user_id => 12 }); +my $user_sets_to_delete = $user_set_rs->search({ course_user_id => $u->course_user_id }); $user_sets_to_delete->delete_all if $user_sets_to_delete; - # load info from CSV files my @hw_sets = loadCSV("$main::test_dir/sample_data/hw_sets.csv"); for my $hw_set (@hw_sets) { - $hw_set->{set_type} = "HW"; - $hw_set->{set_version} = 1 unless defined( $hw_set->{set_version} ); - for my $date (keys %{$hw_set->{dates}}) { - my $dt = $strp->parse_datetime( $hw_set->{dates}->{$date}); + $hw_set->{set_type} = "HW"; + $hw_set->{set_version} = 1 unless defined($hw_set->{set_version}); + for my $date (keys %{ $hw_set->{dates} }) { + my $dt = $strp->parse_datetime($hw_set->{dates}->{$date}); $hw_set->{dates}->{$date} = $dt->epoch; } } @@ -73,30 +72,30 @@ for my $user_set (@all_user_sets) { # determine params and dates overrides my $params = clone($hw_set->{params}); # copy the params from the hw_set - for my $key ( keys %{ $user_set->{params} } ) { + for my $key (keys %{ $user_set->{params} }) { $params->{$key} = $user_set->{params}->{$key}; } my $problem_set_dates = clone($hw_set->{dates}); - my @date_fields = keys %{$user_set->{dates}}; - my $dates = (scalar(@date_fields) > 0) ? $user_set->{dates} : $problem_set_dates; + my @date_fields = keys %{ $user_set->{dates} }; + my $dates = (scalar(@date_fields) > 0) ? $user_set->{dates} : $problem_set_dates; $user_set->{params} = {%$params}; $user_set->{dates} = {%$dates}; - $user_set->{set_version} = 1 unless defined( $user_set->{set_version} ); + $user_set->{set_version} = 1 unless defined($user_set->{set_version}); $user_set->{set_type} = $hw_set->{set_type}; $user_set->{set_visible} = $hw_set->{set_visible}; } ## get all user set for a given user in a course -my @user_sets_from_db = $user_set_rs->getUserSetsForUser( - { - course_name => $course->course_name, - username => "homer" - } -); +my @user_sets_from_db = $user_set_rs->getUserSetsForUser({ + course_name => $course->course_name, + username => "homer" +}); -my @user_sets = map { {%{$_}}; } @all_user_sets; # make a copy of the sets +my @user_sets = map { + { %{$_} }; +} @all_user_sets; # make a copy of the sets @user_sets = grep { $_->{course_name} eq $course->course_name && $_->{username} eq "homer" } @user_sets; @@ -109,206 +108,201 @@ for my $user_set (@user_sets_from_db) { delete $user_set->{type}; } -is_deeply( \@user_sets_from_db, \@user_sets, "getUserSets: get all user sets for a user in a course" ); +is_deeply(\@user_sets_from_db, \@user_sets, "getUserSets: get all user sets for a user in a course"); ## get all user sets for a given set in a course -@user_sets_from_db = $user_set_rs->getUserSetsForSet( { course_name => "Precalculus", set_name => "HW #1" } ); +@user_sets_from_db = $user_set_rs->getUserSetsForSet({ course_name => "Precalculus", set_name => "HW #1" }); -@user_sets = map { {%{$_}}; } @all_user_sets; # make a copy of the sets +@user_sets = map { + { %{$_} }; +} @all_user_sets; # make a copy of the sets @user_sets = grep { $_->{course_name} eq "Precalculus" && $_->{set_name} eq "HW #1" } @user_sets; for my $user_set (@user_sets) { delete $user_set->{course_name}; } - for my $user_set (@user_sets_from_db) { removeIDs($user_set); delete $user_set->{type}; } -is_deeply( \@user_sets_from_db, \@user_sets, "getUserSets: get all user sets for a set in a course" ); +is_deeply(\@user_sets_from_db, \@user_sets, "getUserSets: get all user sets for a set in a course"); ## try to get a user set from a non-existing course throws_ok { - $user_set_rs->getUserSetsForUser( { course_name => "non_existent_course", username => "homer" } ); + $user_set_rs->getUserSetsForUser({ course_name => "non_existent_course", username => "homer" }); } "DB::Exception::CourseNotFound", "getUserSets: attempt to get user sets from a nonexistent course"; ## try to get a user set from a non-existing course throws_ok { - $user_set_rs->getUserSetsForUser( { course_name => "Precalculus", username => "non_existent_user" } ); + $user_set_rs->getUserSetsForUser({ course_name => "Precalculus", username => "non_existent_user" }); } "DB::Exception::UserNotInCourse", "getUserSets: attempt to get user sets from a nonexistent user"; ## try to get a user set from a user not in the course throws_ok { - $user_set_rs->getUserSetsForUser( { course_name => "non_existent_course", username => "bart" } ); + $user_set_rs->getUserSetsForUser({ course_name => "non_existent_course", username => "bart" }); } "DB::Exception::CourseNotFound", "getUserSets: attempt to get user sets from user not in the course"; ## get a single UserSet my $info = { - username => "homer", + username => "homer", course_name => "Precalculus", set_name => "HW #1" }; my $user_set = $user_set_rs->getUserSet($info); -my @sets = map { {%{$_}}; } @all_user_sets; # make a copy +my @sets = map { + { %{$_} }; +} @all_user_sets; # make a copy my $user_set_from_csv = firstval { $_->{course_name} eq "Precalculus" && $_->{username} eq $info->{username} && $_->{set_name} eq $info->{set_name} -} @sets; +} +@sets; removeIDs($user_set); delete $user_set->{type}; delete $user_set_from_csv->{course_name}; -is_deeply( $user_set_from_csv, $user_set, "getUserSet: get a user set from a course" ); +is_deeply($user_set_from_csv, $user_set, "getUserSet: get a user set from a course"); ## try to get a user set from a non-existent course throws_ok { - $user_set_rs->getUserSet( - { - course_name => "non_existent_course", - username => "homer", - set_name => "HW #1" - } - ); + $user_set_rs->getUserSet({ + course_name => "non_existent_course", + username => "homer", + set_name => "HW #1" + }); } "DB::Exception::CourseNotFound", "getUserSet: try to get a user set from a non-existent course"; ## try to get a user set from a non-existent user throws_ok { - $user_set_rs->getUserSet( - { - course_name => "Precalculus", - username => "non_existent_user", - set_name => "HW #1" - } - ); + $user_set_rs->getUserSet({ + course_name => "Precalculus", + username => "non_existent_user", + set_name => "HW #1" + }); } "DB::Exception::UserNotInCourse", "getUserSet: try to get a user set from a non-existent user"; ## try to get a user set from a user not in the course throws_ok { - $user_set_rs->getUserSet( - { course_name => "Precalculus", - username => "marge", - set_name => "HW #1" - } - ); + $user_set_rs->getUserSet({ + course_name => "Precalculus", + username => "marge", + set_name => "HW #1" + }); } "DB::Exception::UserNotInCourse", "getUserSet: try to get a user set not in the course"; ## try to get a user set from a non-existent set throws_ok { - $user_set_rs->getUserSet( - { course_name => "Precalculus", - username => "homer", - set_name => "HW #999" - } - ); + $user_set_rs->getUserSet({ + course_name => "Precalculus", + username => "homer", + set_name => "HW #999" + }); } "DB::Exception::SetNotInCourse", "getUserSet: try to get a user set from a non-existent set"; # add a user set my $new_user_set_info = { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #1" + set_name => "HW #1" }; my $new_user_set = $user_set_rs->addUserSet($new_user_set_info); my $hw_sets = clone(\@hw_sets); -my $set = firstval { +my $set = firstval { $_->{course_name} eq $new_user_set_info->{course_name} && $_->{set_name} eq $new_user_set_info->{set_name} -} @$hw_sets; +} +@$hw_sets; $set->{username} = $new_user_set_info->{username}; removeIDs($new_user_set); delete $set->{course_name}; delete $new_user_set->{type}; -is_deeply($new_user_set,$set,"addUserSet: add a new user set"); +is_deeply($new_user_set, $set, "addUserSet: add a new user set"); # try to add a user set to a course that doesn't exist throws_ok { - $user_set_rs->addUserSet( - { - username => "otto", - course_name => "non existent course", - set_name => "HW #1" - } - ); -} "DB::Exception::CourseNotFound", "addUserSet: add a user set to a non-existent course"; - + $user_set_rs->addUserSet({ + username => "otto", + course_name => "non existent course", + set_name => "HW #1" + }); +} +"DB::Exception::CourseNotFound", "addUserSet: add a user set to a non-existent course"; # try to add a user set for a set that does not exist in a course throws_ok { - $user_set_rs->addUserSet( - { - username => "otto", - course_name => "Precalculus", - set_name => "HW #99" - } - ); -} "DB::Exception::SetNotInCourse", "addUserSet: try to add a user set to a non-existent set"; + $user_set_rs->addUserSet({ + username => "otto", + course_name => "Precalculus", + set_name => "HW #99" + }); +} +"DB::Exception::SetNotInCourse", "addUserSet: try to add a user set to a non-existent set"; # try to add a user set for a user that is not in a course throws_ok { - $user_set_rs->addUserSet( - { - username => "ralph", - course_name => "Precalculus", - set_name => "HW #1" - } - ); -} "DB::Exception::UserNotInCourse", "addUserSet: try to add a user set for a user who is not in the course"; + $user_set_rs->addUserSet({ + username => "ralph", + course_name => "Precalculus", + set_name => "HW #1" + }); +} +"DB::Exception::UserNotInCourse", "addUserSet: try to add a user set for a user who is not in the course"; # try to add a user set with bad fields throws_ok { $user_set_rs->addUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { bad_field => 1 } ); -} "DBIx::Class::Exception", "addUserSet: try to add a user set with a bad field"; +} +"DBIx::Class::Exception", "addUserSet: try to add a user set with a bad field"; # try to add a user_set that already exists throws_ok { - $user_set_rs->addUserSet( - { - username => "otto", - course_name => "Precalculus", - set_name => "HW #1" - } - ); -} "DB::Exception::UserSetExists", "addUserSet: try to add a user set that already exists"; + $user_set_rs->addUserSet({ + username => "otto", + course_name => "Precalculus", + set_name => "HW #1" + }); +} +"DB::Exception::UserSetExists", "addUserSet: try to add a user set that already exists"; ## add a user set with valid params @@ -316,12 +310,11 @@ throws_ok { # my $set2 = $user_set_rs->find({user_id=>12, set_id=>2}); # $set2->delete if defined($set2); - my $user_set2 = $user_set_rs->addUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { params => { @@ -334,25 +327,25 @@ $hw_sets = clone(\@hw_sets); my $set2_from_csv = firstval { $_->{course_name} eq "Precalculus" && $_->{set_name} eq $user_set2->{set_name} -} @$hw_sets; +} +@$hw_sets; removeIDs($user_set2); delete $set2_from_csv->{course_name}; delete $user_set2->{type}; -$set2_from_csv->{params} = $user_set2->{params}; +$set2_from_csv->{params} = $user_set2->{params}; $set2_from_csv->{username} = $user_set2->{username}; -is_deeply($user_set2,$set2_from_csv,"addUserSet: add a new user set with params"); - +is_deeply($user_set2, $set2_from_csv, "addUserSet: add a new user set with params"); ## try to add a user set with a bad field throws_ok { $user_set_rs->addUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #3" + set_name => "HW #3" }, { params => { @@ -360,89 +353,91 @@ throws_ok { } } ); -} "DB::Exception::UndefinedParameter", "addUserSet: try to add a new user set with an undefined parameter"; - - +} +"DB::Exception::UndefinedParameter", "addUserSet: try to add a new user set with an undefined parameter"; # delete the user set from from above -my $cu = $course_user_rs->find({user_id => 12},1); -my $set_to_delete = $user_set_rs->find({course_user_id => $cu->course_user_id, set_id => 2}); +my $cu = $course_user_rs->find({ user_id => 12 }, 1); +my $set_to_delete = $user_set_rs->find({ course_user_id => $cu->course_user_id, set_id => 2 }); $set_to_delete->delete if defined($set_to_delete); ## add a user set with a new date my $user_set3 = $user_set_rs->addUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { dates => { - open => 1, - due => 900, + open => 1, + due => 900, answer => 1000 } } ); -$hw_sets = clone(\@hw_sets); # make a copy +$hw_sets = clone(\@hw_sets); # make a copy my $set3_from_csv = firstval { $_->{course_name} eq "Precalculus" && $_->{set_name} eq $user_set3->{set_name} -} @$hw_sets; +} +@$hw_sets; removeIDs($user_set3); delete $set3_from_csv->{course_name}; -$set3_from_csv->{dates} = $user_set3->{dates}; +$set3_from_csv->{dates} = $user_set3->{dates}; $set3_from_csv->{username} = $user_set3->{username}; -is_deeply($user_set3,$set3_from_csv,"addUserSet: add a new user set with dates"); +is_deeply($user_set3, $set3_from_csv, "addUserSet: add a new user set with dates"); ## try to add a bad date throws_ok { $user_set_rs->addUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #3" + set_name => "HW #3" }, { dates => { - open => 100, - due => 9, + open => 100, + due => 9, answer => 1000 } } ); -} "DB::Exception::ImproperDateOrder", "addUserSet: dates are out of order"; +} +"DB::Exception::ImproperDateOrder", "addUserSet: dates are out of order"; throws_ok { $user_set_rs->addUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #3" + set_name => "HW #3" }, { dates => { - open => 100, - due => 900, + open => 100, + due => 900, answer => 800 } } ); -} "DB::Exception::ImproperDateOrder", "addUserSet: dates are out of order"; +} +"DB::Exception::ImproperDateOrder", "addUserSet: dates are out of order"; ## Update User Set # update the dates my $updated_dates = { - open => 1, - due => 10, + open => 1, + due => 10, answer => 20 }; @@ -450,24 +445,24 @@ $set3_from_csv->{dates} = $updated_dates; my $updated_user_set = $user_set_rs->updateUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, - {dates => $updated_dates} + { dates => $updated_dates } ); removeIDs($updated_user_set); -is_deeply($updated_user_set,$set3_from_csv,"updateUserSet: update the dates"); +is_deeply($updated_user_set, $set3_from_csv, "updateUserSet: update the dates"); # update the params my $updated_user_set2 = $user_set_rs->updateUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { params => { @@ -480,31 +475,32 @@ removeIDs($updated_user_set2); $set3_from_csv->{params}->{hide_hint} = 1; -is_deeply($updated_user_set2,$set3_from_csv,"updateUserSet: update the params"); +is_deeply($updated_user_set2, $set3_from_csv, "updateUserSet: update the params"); # try updating an invalid field throws_ok { $user_set_rs->updateUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { set_version => 2 } ); -} "DB::Exception::InvalidParameter", "updateUserSet: try setting a parameter that is not allowed to be updated"; +} +"DB::Exception::InvalidParameter", "updateUserSet: try setting a parameter that is not allowed to be updated"; # try updating an invalid field throws_ok { $user_set_rs->updateUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { params => { @@ -512,63 +508,65 @@ throws_ok { } } ); -} "DB::Exception::UndefinedParameter", "updateUserSet: try setting a parameter that is not allowed to be updated"; - +} +"DB::Exception::UndefinedParameter", "updateUserSet: try setting a parameter that is not allowed to be updated"; # try updating an invalid date throws_ok { $user_set_rs->updateUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { - dates => {open => 1, closed=>2} + dates => { open => 1, closed => 2 } } ); -} "DB::Exception::InvalidDateField", "updateUserSet: try to update an invalid date field"; +} +"DB::Exception::InvalidDateField", "updateUserSet: try to update an invalid date field"; # missing required dates throws_ok { $user_set_rs->updateUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { - dates => {open => 1, due=>2} + dates => { open => 1, due => 2 } } ); -} "DB::Exception::RequiredDateFields", "updateUserSet: try to update with missing required dates"; - +} +"DB::Exception::RequiredDateFields", "updateUserSet: try to update with missing required dates"; # out of order dates throws_ok { $user_set_rs->updateUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #2" + set_name => "HW #2" }, { - dates => {open => 100, due=>2, answer=>200} + dates => { open => 100, due => 2, answer => 200 } } ); -} "DB::Exception::ImproperDateOrder", "updateUserSet: try to update with out of order dates"; +} +"DB::Exception::ImproperDateOrder", "updateUserSet: try to update with out of order dates"; # update a user_set that doesn't exist; throws_ok { $user_set_rs->updateUserSet( { - username => "otto", + username => "otto", course_name => "Precalculus", - set_name => "HW #3" + set_name => "HW #3" }, { params => { @@ -576,35 +574,30 @@ throws_ok { } } ); -} "DB::Exception::UserSetNotInCourse", "updateUserSet: try to update a user set not the in the course"; - - +} +"DB::Exception::UserSetNotInCourse", "updateUserSet: try to update a user set not the in the course"; # delete a user set -my $deleted_user_set = $user_set_rs->deleteUserSet( - { - username => "otto", - course_name => "Precalculus", - set_name => "HW #2" - } -); +my $deleted_user_set = $user_set_rs->deleteUserSet({ + username => "otto", + course_name => "Precalculus", + set_name => "HW #2" +}); removeIDs($deleted_user_set); -is_deeply($deleted_user_set,$set3_from_csv,"deleteUserSet: successfully delete a user set"); +is_deeply($deleted_user_set, $set3_from_csv, "deleteUserSet: successfully delete a user set"); # delete a user_set that doesn't exist; throws_ok { - $user_set_rs->deleteUserSet( - { - username => "otto", - course_name => "Precalculus", - set_name => "HW #3" - } - ); -} "DB::Exception::UserSetNotInCourse", "deleteUserSet: try to delete a user set not the in the course"; - + $user_set_rs->deleteUserSet({ + username => "otto", + course_name => "Precalculus", + set_name => "HW #3" + }); +} +"DB::Exception::UserSetNotInCourse", "deleteUserSet: try to delete a user set not the in the course"; done_testing; diff --git a/t/db/008_problem_pools.t b/t/db/008_problem_pools.t index 6553cbf9..029a71f4 100644 --- a/t/db/008_problem_pools.t +++ b/t/db/008_problem_pools.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -58,15 +58,15 @@ for my $pool (@problem_pools_from_db) { my @precalc_pools_from_file = grep { $_->{course_name} eq "Precalculus" } @problem_pools_from_file; -is_deeply( \@problem_pools_from_file, \@problem_pools_from_db, "getAllProblemPools: find all problem pools" ); +is_deeply(\@problem_pools_from_file, \@problem_pools_from_db, "getAllProblemPools: find all problem pools"); -my @precalc_pools = $problem_pool_rs->getProblemPools( { course_name => "Precalculus" } ); +my @precalc_pools = $problem_pool_rs->getProblemPools({ course_name => "Precalculus" }); for my $pool (@precalc_pools) { removeIDs($pool); $pool->{course_name} = "Precalculus"; } -is_deeply( \@precalc_pools_from_file, \@precalc_pools, "getProblemPools: get all problem pools from a single course" ); +is_deeply(\@precalc_pools_from_file, \@precalc_pools, "getProblemPools: get all problem pools from a single course"); ## get a problem pool @@ -76,19 +76,19 @@ my $fetched_pool = $problem_pool_rs->getProblemPool($pool_to_fetch); removeIDs($fetched_pool); $fetched_pool->{course_name} = $problem_pools_from_file[0]->{course_name}; -is_deeply( $pool_to_fetch, $fetched_pool, "getProblemPool: get a single pool from a course" ); +is_deeply($pool_to_fetch, $fetched_pool, "getProblemPool: get a single pool from a course"); ## throws_ok to get a problem pool from a course that doesn't exist. throws_ok { - $problem_pool_rs->getProblemPool( { course_name => "not existent course", pool_name => "adding fractions" } ); + $problem_pool_rs->getProblemPool({ course_name => "not existent course", pool_name => "adding fractions" }); } "DB::Exception::CourseNotFound", "getProblemPool: get a problem pool from a non-existent course"; ## throws_ok to get a problem pool from a course, but the pool doesn't exist. throws_ok { - $problem_pool_rs->getProblemPool( { course_name => "Arithmetic", pool_name => "non_existent_pool" } ); + $problem_pool_rs->getProblemPool({ course_name => "Arithmetic", pool_name => "non_existent_pool" }); } "DB::Exception::PoolNotInCourse", "getProblemPool: get a problem pool from a non-existent course"; @@ -97,7 +97,7 @@ throws_ok { my $course_name = 'Arithmetic'; my $pool_name = 'subtracting fractions'; -my $pool2 = $problem_pool_rs->addProblemPool( { course_name => $course_name }, { pool_name => $pool_name } ); +my $pool2 = $problem_pool_rs->addProblemPool({ course_name => $course_name }, { pool_name => $pool_name }); removeIDs($pool2); is_deeply( @@ -112,15 +112,15 @@ is_deeply( ## addProblemPool to a pool that already exists throws_ok { - $problem_pool_rs->addProblemPool( { course_name => 'Arithmetic' }, { pool_name => "adding fractions" } ); + $problem_pool_rs->addProblemPool({ course_name => 'Arithmetic' }, { pool_name => "adding fractions" }); } "DB::Exception::PoolAlreadyInCourse", "addProblemPool: pool already exists"; ## addProblemPool with a pool with non-valid field throws_ok { - $problem_pool_rs->addProblemPool( { course_name => 'Arithmetic' }, - { pool_name => "multiplying fractions", other_field => "XXX" } ); + $problem_pool_rs->addProblemPool({ course_name => 'Arithmetic' }, + { pool_name => "multiplying fractions", other_field => "XXX" }); } "DBIx::Class::Exception", "addProblemPool: add a pool with non-valid field"; @@ -129,29 +129,29 @@ throws_ok { my $updated_pool = { pool_name => "subtracting fractions with like denominators", }; my $updated_pool_from_db = - $problem_pool_rs->updateProblemPool( { course_name => 'Arithmetic', pool_name => 'subtracting fractions' }, - $updated_pool ); + $problem_pool_rs->updateProblemPool({ course_name => 'Arithmetic', pool_name => 'subtracting fractions' }, + $updated_pool); $updated_pool_from_db->{course_name} = 'Arithmetic'; removeIDs($updated_pool_from_db); $updated_pool->{course_name} = 'Arithmetic'; -is_deeply( $updated_pool, $updated_pool_from_db, "updateProblemPool: update the name of a problem pool" ); +is_deeply($updated_pool, $updated_pool_from_db, "updateProblemPool: update the name of a problem pool"); ## throws_ok to update a pool that doesn't exist ## throws_ok to get a problem pool from a course that doesn't exist. throws_ok { - $problem_pool_rs->updateProblemPool( { course_name => 'non_existent_course', pool_name => 'XXXX' }, $updated_pool ); + $problem_pool_rs->updateProblemPool({ course_name => 'non_existent_course', pool_name => 'XXXX' }, $updated_pool); } "DB::Exception::CourseNotFound", "udpateProblemPool: update a problem pool from a non-existent course"; ## throws_ok to get a problem pool from a course, but the pool doesn't exist. throws_ok { - $problem_pool_rs->updateProblemPool( { course_name => "Arithmetic", pool_name => "non_existent_pool" }, - $updated_pool ); + $problem_pool_rs->updateProblemPool({ course_name => "Arithmetic", pool_name => "non_existent_pool" }, + $updated_pool); } "DB::Exception::PoolNotInCourse", "updateProblemPool: get a problem pool from a non-existent course"; @@ -161,33 +161,32 @@ my $prob2 = $pool_problems_from_file[0]; my $pool_problem2 = $problem_pool_rs->getPoolProblem($prob2); -is( $prob2->{library_id}, $pool_problem2->{library_id}, "getPoolProblem: get a single problem from a problem pool" ); +is($prob2->{library_id}, $pool_problem2->{library_id}, "getPoolProblem: get a single problem from a problem pool"); ## get a random PoolProblem -my $random_prob = $problem_pool_rs->getPoolProblem( - { - course_name => $prob2->{course_name}, - pool_name => $prob2->{pool_name} - } -); +my $random_prob = $problem_pool_rs->getPoolProblem({ + course_name => $prob2->{course_name}, + pool_name => $prob2->{pool_name} +}); # dd $random_prob; my @probs3 = grep { $_->{course_name} eq $prob2->{course_name} and $_->{pool_name} eq $prob2->{pool_name} } @pool_problems_from_file; -my @lib_ids = map { $_->{params}->{library_id} } @probs3; -my @arr = grep { $_ == $random_prob->{params}->{library_id} } @lib_ids; +my @lib_ids = map { $_->{params}->{library_id} } @probs3; +my @arr = grep { $_ == $random_prob->{params}->{library_id} } @lib_ids; -ok( scalar(@arr) == 1, "getPoolProblem: get a random problem from a problem pool" ); +ok(scalar(@arr) == 1, "getPoolProblem: get a random problem from a problem pool"); ## add a Problem to a pool my $prob_to_add->{params} = { library_id => 8332 }; -my $added_problem = $problem_pool_rs->addProblemToPool( $updated_pool, $prob_to_add ); +my $added_problem = $problem_pool_rs->addProblemToPool($updated_pool, $prob_to_add); -is( $prob_to_add->{params}->{library_id}, +is( + $prob_to_add->{params}->{library_id}, $added_problem->{params}->{library_id}, "addProblemToPool: adding a problem to an existing pool." ); @@ -209,7 +208,8 @@ throws_ok { throws_ok { $problem_pool_rs->addProblemToPool( - { course_name => $updated_pool->{course_name}, + { + course_name => $updated_pool->{course_name}, pool_name => "non_existent_pool_name" }, $prob_to_add @@ -225,9 +225,10 @@ $course_pool_problem_info->{pool_problem_id} = $added_problem->{pool_problem_id} my $updated_library_id = 2839; my $updated_pool_problem = - $problem_pool_rs->updatePoolProblem( $course_pool_problem_info, { params => {library_id => $updated_library_id }} ); + $problem_pool_rs->updatePoolProblem($course_pool_problem_info, { params => { library_id => $updated_library_id } }); -is( $updated_library_id, +is( + $updated_library_id, $updated_pool_problem->{params}->{library_id}, "updatePoolProblem: update an existing problem in an existing pool." ); @@ -236,12 +237,13 @@ is( $updated_library_id, throws_ok { $problem_pool_rs->updatePoolProblem( - { course_name => "non_existing_course", + { + course_name => "non_existing_course", pool_name => "adding fractions", pool_problem_id => $added_problem->{pool_problem_id} }, { - params=> { + params => { library_id => $updated_library_id } } @@ -253,7 +255,8 @@ throws_ok { throws_ok { $problem_pool_rs->updatePoolProblem( - { course_name => $updated_pool->{course_name}, + { + course_name => $updated_pool->{course_name}, pool_name => "non_existent_pool_name", pool_problem_id => $added_problem->{pool_problem_id} }, @@ -266,7 +269,8 @@ throws_ok { throws_ok { $problem_pool_rs->updatePoolProblem( - { course_name => $updated_pool->{course_name}, + { + course_name => $updated_pool->{course_name}, pool_name => $updated_pool->{pool_name}, pool_problem_id => -999 }, @@ -280,6 +284,6 @@ my $pool_to_delete = $problem_pool_rs->deleteProblemPool($updated_pool); removeIDs($pool_to_delete); $pool_to_delete->{course_name} = 'Arithmetic'; -is_deeply( $updated_pool, $pool_to_delete, "deleteProblemPool: delete an existing problem pool" ); +is_deeply($updated_pool, $pool_to_delete, "deleteProblemPool: delete an existing problem pool"); done_testing; diff --git a/t/db/009_problems.t b/t/db/009_problems.t index 7e2ba176..5f16c01e 100644 --- a/t/db/009_problems.t +++ b/t/db/009_problems.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -38,7 +38,7 @@ my $problem_rs = $schema->resultset("Problem"); # load all problems from the CVS files my @problems_from_csv = loadCSV("$main::test_dir/sample_data/problems.csv"); for my $problem (@problems_from_csv) { - $problem->{problem_version} = 1 unless defined( $problem->{problem_version} ); + $problem->{problem_version} = 1 unless defined($problem->{problem_version}); } # filter out precalc problems @@ -61,59 +61,58 @@ for my $problem (@problems_from_db) { removeIDs($problem); } -is_deeply( \@all_problems, \@problems_from_db, "getGlobalProblems: get all problems" ); +is_deeply(\@all_problems, \@problems_from_db, "getGlobalProblems: get all problems"); ## get all problems from one course -my @precalc_problems_from_db = $problem_rs->getProblems( { course_name => "Precalculus" } ); +my @precalc_problems_from_db = $problem_rs->getProblems({ course_name => "Precalculus" }); for my $problem (@precalc_problems_from_db) { removeIDs($problem); $problem->{course_name} = "Precalculus"; delete $problem->{dates}; } -is_deeply( \@precalc_problems, \@precalc_problems_from_db, "getProblems: get all problems from one course" ); +is_deeply(\@precalc_problems, \@precalc_problems_from_db, "getProblems: get all problems from one course"); ## get all problems in one course from one set. -my @set_problems1 = $problem_rs->getSetProblems( { course_name => "Precalculus", set_name => "HW #1" } ); +my @set_problems1 = $problem_rs->getSetProblems({ course_name => "Precalculus", set_name => "HW #1" }); for my $problem (@set_problems1) { removeIDs($problem); $problem->{set_name} = "HW #1"; $problem->{course_name} = "Precalculus"; } -is_deeply( \@precalc_problems1, \@set_problems1, "getSetProblems: get all problems from one set" ); +is_deeply(\@precalc_problems1, \@set_problems1, "getSetProblems: get all problems from one set"); ## try to get problems from a non-existing course throws_ok { - $problem_rs->getSetProblems( { course_name => "non_existing_course", set_name => "HW #1" } ); + $problem_rs->getSetProblems({ course_name => "non_existing_course", set_name => "HW #1" }); } "DB::Exception::CourseNotFound", "getSetProblem: get problems from non-existing course"; ## try to get problems from a non-existing set throws_ok { - $problem_rs->getSetProblems( { course_name => "Precalculus", set_name => "HW #999" } ); + $problem_rs->getSetProblems({ course_name => "Precalculus", set_name => "HW #999" }); } "DB::Exception::SetNotInCourse", "getSetProblems: get problems from non-existing set"; ## get a single problem from a course: -my $set_problem = $problem_rs->getSetProblem( - { course_name => $problems_from_csv[0]->{course_name}, - set_name => $problems_from_csv[0]->{set_name}, - problem_number => $problems_from_csv[0]->{problem_number} - } -); +my $set_problem = $problem_rs->getSetProblem({ + course_name => $problems_from_csv[0]->{course_name}, + set_name => $problems_from_csv[0]->{set_name}, + problem_number => $problems_from_csv[0]->{problem_number} +}); removeIDs($set_problem); my $expected_problem = { %{ $problems_from_csv[0] } }; # copy the first problem delete $expected_problem->{set_name}; delete $expected_problem->{course_name}; -is_deeply( $expected_problem, $set_problem, "getSetProblem: get a single problem from a set in a given course" ); +is_deeply($expected_problem, $set_problem, "getSetProblem: get a single problem from a set in a given course"); ## add a problem to an existing set @@ -128,25 +127,24 @@ my $new_problem = { my $prob1 = $problem_rs->addSetProblem( { course_name => "Precalculus", - set_name => "HW #1" + set_name => "HW #1" }, $new_problem ); removeIDs($prob1); -is_deeply( $new_problem, $prob1, "addProblem: add a valid problem to a set" ); +is_deeply($new_problem, $prob1, "addProblem: add a valid problem to a set"); ## delete a problem from a set -my $deleted_problem = $problem_rs->deleteSetProblem( - { course_name => "Precalculus", - set_name => "HW #1", - problem_number => 4, - } -); +my $deleted_problem = $problem_rs->deleteSetProblem({ + course_name => "Precalculus", + set_name => "HW #1", + problem_number => 4, +}); removeIDs($deleted_problem); -$new_problem->{problem_version} = 1 unless defined( $new_problem->{problem_version} ); +$new_problem->{problem_version} = 1 unless defined($new_problem->{problem_version}); -is_deeply( $new_problem, $deleted_problem, "deleteSetProblem: delete one problem in an existing set." ); +is_deeply($new_problem, $deleted_problem, "deleteSetProblem: delete one problem in an existing set."); done_testing; diff --git a/t/db/010_set_versions.t b/t/db/010_set_versions.t index aebe4982..320f8781 100644 --- a/t/db/010_set_versions.t +++ b/t/db/010_set_versions.t @@ -8,8 +8,8 @@ use strict; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -45,11 +45,11 @@ my @hw_sets = loadCSV("$main::test_dir/sample_data/hw_sets.csv"); for my $set (@hw_sets) { $set->{type} = 1; $set->{set_type} = "HW"; - $set->{set_version} = 1 unless defined( $set->{set_version} ); + $set->{set_version} = 1 unless defined($set->{set_version}); } -$problem_set_rs->newSetVersion( { course_id => 1, set_id => 1 } ); +$problem_set_rs->newSetVersion({ course_id => 1, set_id => 1 }); -is_deeply( { test => 1 }, { test => 1 }, 'fake test' ); +is_deeply({ test => 1 }, { test => 1 }, 'fake test'); done_testing; diff --git a/t/db/build_db.pl b/t/db/build_db.pl index fd25da64..c42404ac 100755 --- a/t/db/build_db.pl +++ b/t/db/build_db.pl @@ -8,10 +8,10 @@ use strict; BEGIN { - use File::Basename qw/dirname/; - use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + use File::Basename qw/dirname/; + use Cwd qw/abs_path/; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -36,20 +36,18 @@ BEGIN my $config = LoadFile("$main::lib_dir/../conf/webwork3.yml"); # load the database -my $schema = DB::Schema->connect($config->{database_dsn}, $config->{database_user}, $config->{database_password}); - +my $schema = DB::Schema->connect($config->{database_dsn}, $config->{database_user}, $config->{database_password}); # $schema->storage->debug(1); # print out the SQL commands. say "restoring the database with dbi: $config->{database_dsn}" if $verbose; -$schema->deploy({ add_drop_table => 1 }); ## create the database based on the schema - +$schema->deploy({ add_drop_table => 1 }); ## create the database based on the schema -my $course_rs = $schema->resultset('Course'); -my $user_rs = $schema->resultset('User'); -my $course_user_rs = $schema->resultset('CourseUser'); -my $problem_set_rs = $schema->resultset('ProblemSet'); +my $course_rs = $schema->resultset('Course'); +my $user_rs = $schema->resultset('User'); +my $course_user_rs = $schema->resultset('CourseUser'); +my $problem_set_rs = $schema->resultset('ProblemSet'); my $problem_pool_rs = $schema->resultset('ProblemPool'); sub addCourses { @@ -57,9 +55,9 @@ sub addCourses { my @courses = loadCSV("$main::test_dir/sample_data/courses.csv"); for my $course (@courses) { $course->{course_settings} = {}; - for my $key (keys %{$course->{params}}) { + for my $key (keys %{ $course->{params} }) { my @fields = split(/:/, $key); - $course->{course_settings}->{$fields[0]} = {$fields[1] => $course->{params}->{$key}}; + $course->{course_settings}->{ $fields[0] } = { $fields[1] => $course->{params}->{$key} }; } delete $course->{params}; $course->{course_dates} = $course->{dates}; @@ -77,31 +75,29 @@ sub addUsers { # add an admin user my $admin = { - username => "admin", - email => 'admin@google.com', - first_name => "Andrea", - last_name => "Administrator", - is_admin => 1, - login_params => { password => "admin"} + username => "admin", + email => 'admin@google.com', + first_name => "Andrea", + last_name => "Administrator", + is_admin => 1, + login_params => { password => "admin" } }; $user_rs->create($admin); for my $student (@all_students) { # dd $student; - my $course = $course_rs->find({course_name => $student->{course_name}}); + my $course = $course_rs->find({ course_name => $student->{course_name} }); my $stud_info = {}; for my $key (qw/username first_name last_name email student_id/) { $stud_info->{$key} = $student->{$key}; } - $stud_info->{login_params} = { - password => $student->{username} - }; + $stud_info->{login_params} = { password => $student->{username} }; $course->add_to_users($stud_info); - my $user = $user_rs->find({username => $student->{username}}); + my $user = $user_rs->find({ username => $student->{username} }); my $params = { - user_id=> $user->user_id, - course_id=> $course->course_id, + user_id => $user->user_id, + course_id => $course->course_id, }; my $course_user = $course_user_rs->find($params); @@ -113,13 +109,13 @@ sub addUsers { return; } -my @hw_dates = @DB::Schema::Result::ProblemSet::HWSet::VALID_DATES; +my @hw_dates = @DB::Schema::Result::ProblemSet::HWSet::VALID_DATES; my @hw_params = @DB::Schema::Result::ProblemSet::HWSet::VALID_PARAMS; -my @quiz_dates = @DB::Schema::Result::ProblemSet::HWSet::VALID_DATES; +my @quiz_dates = @DB::Schema::Result::ProblemSet::HWSet::VALID_DATES; my @quiz_params = @DB::Schema::Result::ProblemSet::HWSet::VALID_PARAMS; -my $strp = DateTime::Format::Strptime->new( pattern => '%FT%T',on_error => 'croak' ); +my $strp = DateTime::Format::Strptime->new(pattern => '%FT%T', on_error => 'croak'); sub addSets { ## add some problem sets @@ -127,12 +123,12 @@ sub addSets { my @hw_sets = loadCSV("$main::test_dir/sample_data/hw_sets.csv"); for my $set (@hw_sets) { - my $course = $course_rs->find({course_name => $set->{course_name}}); - if (! defined($course)){ - croak "The course ". $set->{course_name} ." does not exist"; + my $course = $course_rs->find({ course_name => $set->{course_name} }); + if (!defined($course)) { + croak "The course " . $set->{course_name} . " does not exist"; } - for my $date (keys %{$set->{dates}}) { - my $dt = $strp->parse_datetime( $set->{dates}->{$date}); + for my $date (keys %{ $set->{dates} }) { + my $dt = $strp->parse_datetime($set->{dates}->{$date}); $set->{dates}->{$date} = $dt->epoch; } @@ -145,12 +141,12 @@ sub addSets { my @quizzes = loadCSV("$main::test_dir/sample_data/quizzes.csv"); for my $quiz (@quizzes) { - my $course = $course_rs->search({course_name => $quiz->{course_name}})->single; - if (! defined($course)){ - croak "The course ". $quiz->{course_name} ." does not exist"; + my $course = $course_rs->search({ course_name => $quiz->{course_name} })->single; + if (!defined($course)) { + croak "The course " . $quiz->{course_name} . " does not exist"; } - for my $date (keys %{$quiz->{dates}}) { - my $dt = $strp->parse_datetime( $quiz->{dates}->{$date}); + for my $date (keys %{ $quiz->{dates} }) { + my $dt = $strp->parse_datetime($quiz->{dates}->{$date}); $quiz->{dates}->{$date} = $dt->epoch; } @@ -163,10 +159,10 @@ sub addSets { my @review_sets = loadCSV("$main::test_dir/sample_data/review_sets.csv"); for my $set (@review_sets) { - my $course = $course_rs->find({course_name => $set->{course_name}}); + my $course = $course_rs->find({ course_name => $set->{course_name} }); croak "The course |$set->{course_name}| does not exist" unless defined($course); - for my $date (keys %{$set->{dates}}) { - my $dt = $strp->parse_datetime( $set->{dates}->{$date}); + for my $date (keys %{ $set->{dates} }) { + my $dt = $strp->parse_datetime($set->{dates}->{$date}); $set->{dates}->{$date} = $dt->epoch; } @@ -175,7 +171,6 @@ sub addSets { $course->add_to_problem_sets($set); } - return; } @@ -183,17 +178,17 @@ sub addProblems { ## add some problems say "adding problems" if $verbose; my @problems = loadCSV("$main::test_dir/sample_data/problems.csv"); - for my $prob (@problems){ + for my $prob (@problems) { # check if the course_name/set_name exists my $set = $problem_set_rs->search( - { - 'me.set_name' => $prob->{set_name}, - 'courses.course_name' => $prob->{course_name} - }, - { - join => 'courses' - } - )->single; + { + 'me.set_name' => $prob->{set_name}, + 'courses.course_name' => $prob->{course_name} + }, + { + join => 'courses' + } + )->single; croak "The course |$set->{course_name}| with set name |$set->{name}| is not defined" unless defined($set); delete $prob->{course_name}; delete $prob->{set_name}; @@ -202,7 +197,7 @@ sub addProblems { ## the following isn't working. Perhaps because it is the result of a join # $sets[0]->add_to_problems->($prob); - my $problem_set = $problem_set_rs->search({set_id => $set->set_id})->single; + my $problem_set = $problem_set_rs->search({ set_id => $set->set_id })->single; $problem_set->add_to_problems($prob); @@ -214,26 +209,24 @@ sub addUserSets { ## add some users to problem sets say "adding user sets" if $verbose; my @user_sets = loadCSV("$main::test_dir/sample_data/user_sets.csv"); - for my $user_set (@user_sets){ + for my $user_set (@user_sets) { # check if the course_name/set_name/user_name exists - my $course = $course_rs->find({ course_name=>$user_set->{course_name}}); - my $user_in_course = $course->users->find({username=>$user_set->{username}}); - my $course_user = $course_user_rs->find({ - user_id => $user_in_course->user_id, + my $course = $course_rs->find({ course_name => $user_set->{course_name} }); + my $user_in_course = $course->users->find({ username => $user_set->{username} }); + my $course_user = $course_user_rs->find({ + user_id => $user_in_course->user_id, course_id => $course->course_id }); - if( defined $course_user) { - my $problem_set = $schema->resultset('ProblemSet')->find( - { - course_id => $course->course_id, - set_name => $user_set->{set_name} - } - ); + if (defined $course_user) { + my $problem_set = $schema->resultset('ProblemSet')->find({ + course_id => $course->course_id, + set_name => $user_set->{set_name} + }); for my $key (qw/course_name set_name type username/) { delete $user_set->{$key}; } $user_set->{course_user_id} = $course_user->course_user_id; - $user_set->{set_id} = $problem_set->set_id; + $user_set->{set_id} = $problem_set->set_id; $problem_set->add_to_user_sets($user_set); } } @@ -245,12 +238,12 @@ sub addProblemPools { my @problem_pools = loadCSV("$main::test_dir/sample_data/pool_problems.csv"); for my $pool (@problem_pools) { - my $course = $course_rs->find({ course_name=>$pool->{course_name}}); + my $course = $course_rs->find({ course_name => $pool->{course_name} }); croak "The course |$pool->{course_name}| does not exist" unless defined($course); - my $prob_pool = $problem_pool_rs->find_or_create({course_id => $course->course_id, pool_name => $pool->{pool_name}}); - $prob_pool->add_to_pool_problems({params => {library_id => $pool->{params}->{library_id}}}); - + my $prob_pool = + $problem_pool_rs->find_or_create({ course_id => $course->course_id, pool_name => $pool->{pool_name} }); + $prob_pool->add_to_pool_problems({ params => { library_id => $pool->{params}->{library_id} } }); } return; diff --git a/t/db/run_all_tests.pl b/t/db/run_all_tests.pl index 53aad9d1..157f50de 100755 --- a/t/db/run_all_tests.pl +++ b/t/db/run_all_tests.pl @@ -15,11 +15,9 @@ my @test_files = glob("$test_dir/*.t"); - -my %args = ( verbosity => 0, lib => [ '.',]); -my $harness = TAP::Harness->new( \%args ); +my %args = (verbosity => 0, lib => [ '.', ]); +my $harness = TAP::Harness->new(\%args); $harness->runtests(@test_files); - 1; diff --git a/t/db/test_course_user.pl b/t/db/test_course_user.pl index 48e903c5..d4dcea89 100755 --- a/t/db/test_course_user.pl +++ b/t/db/test_course_user.pl @@ -6,8 +6,8 @@ BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use lib "$main::lib_dir"; @@ -30,7 +30,7 @@ BEGIN my $course_user_rs = $schema->resultset("CourseUser"); -my $u = $course_user_rs->find({course_id=>1,user_id=>1}); +my $u = $course_user_rs->find({ course_id => 1, user_id => 1 }); my $u2 = $u->get_inflated_columns; diff --git a/t/mojolicious/001_login.t b/t/mojolicious/001_login.t index e3191a88..fd385688 100644 --- a/t/mojolicious/001_login.t +++ b/t/mojolicious/001_login.t @@ -17,46 +17,50 @@ use lib "$main::lib_dir"; my $t = Test::Mojo->new('WeBWorK3'); # Test missing credentials -$t->post_ok('/webwork3/api/login')->status_is(250, 'error status') - ->content_type_is('application/json;charset=UTF-8') - ->json_is('' => { +$t->post_ok('/webwork3/api/login')->status_is(250, 'error status')->content_type_is('application/json;charset=UTF-8') + ->json_is( + '' => { exception => 'DB::Exception::ParametersNeeded', - message => 'You must pass exactly one of user_id, username, email.' - }, 'no credentials'); + message => 'You must pass exactly one of user_id, username, email.' + }, + 'no credentials' + ); # Test valid username and password -$t->post_ok('/webwork3/api/login' => json => { username => 'lisa', password => 'lisa' }) - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is('' => { +$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, - user => { - email => 'lisa@google.com', + user => { + email => 'lisa@google.com', first_name => 'Lisa', - is_admin => 0, - last_name => 'Simpson', + is_admin => 0, + last_name => 'Simpson', student_id => '23', - user_id => 3, - username => 'lisa' + user_id => 3, + username => 'lisa' } - }, 'valid credentials'); + }, + 'valid credentials' + ); # Test logout -$t->post_ok('/webwork3/api/logout') - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is('' => { +$t->post_ok('/webwork3/api/logout')->status_is(200)->content_type_is('application/json;charset=UTF-8')->json_is( + '' => { logged_in => 0, - message => 'Successfully logged out.' - }, 'logout'); + message => 'Successfully logged out.' + }, + 'logout' +); # Test for a bad password -$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('' => { +$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, - message => 'Incorrect username or password.' - }, 'invalid credentials'); + message => 'Incorrect username or password.' + }, + 'invalid credentials' + ); done_testing; diff --git a/t/mojolicious/002_courses.t b/t/mojolicious/002_courses.t index c628c41a..d073bb9b 100644 --- a/t/mojolicious/002_courses.t +++ b/t/mojolicious/002_courses.t @@ -10,13 +10,13 @@ use Data::Dumper; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use Getopt::Long; my $TEST_PERMISSIONS; -GetOptions ("perm" => \$TEST_PERMISSIONS); # check for the flag --perm when running this. +GetOptions("perm" => \$TEST_PERMISSIONS); # check for the flag --perm when running this. use lib "$main::lib_dir"; @@ -35,69 +35,58 @@ my $t; if ($TEST_PERMISSIONS) { $config->{ignore_permissions} = 0; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); # and login - $t->post_ok( '/api/login' => json => { email => 'admin@google.com', password => 'admin' } ) - ->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 ); + $t->post_ok('/api/login' => json => { email => 'admin@google.com', password => 'admin' }) + ->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); } else { $config->{ignore_permissions} = 1; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); } -$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 ); +$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); -$t->get_ok('/webwork3/api/courses/1') - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/course_name' => "Precalculus" ) - ->json_is( '/visible' => 1); +$t->get_ok('/webwork3/api/courses/1')->content_type_is('application/json;charset=UTF-8') + ->json_is('/course_name' => "Precalculus")->json_is('/visible' => 1); ## add a new course my $new_course = { - course_name => "Linear Algebra", - course_dates => { start => "2021-05-31", end => "2021-07-01" } + course_name => "Linear Algebra", + course_dates => { start => "2021-05-31", end => "2021-07-01" } }; -$t->post_ok( '/webwork3/api/courses' => json => $new_course ) - ->status_is(200) - ->json_is( '/course_name' => $new_course->{course_name} ); +$t->post_ok('/webwork3/api/courses' => json => $new_course)->status_is(200) + ->json_is('/course_name' => $new_course->{course_name}); # Pull out the id from the response my $new_course_id = $t->tx->res->json('/course_id'); $new_course->{course_id} = $new_course_id; -is_deeply( $new_course, $t->tx->res->json, "addCourse: courses match" ); +is_deeply($new_course, $t->tx->res->json, "addCourse: courses match"); ## update the course $new_course->{visible} = 0; -$t->put_ok( "/webwork3/api/courses/$new_course_id" => json => $new_course ) - ->status_is(200) - ->json_is( '/course_name' => $new_course->{course_name} ); +$t->put_ok("/webwork3/api/courses/$new_course_id" => json => $new_course)->status_is(200) + ->json_is('/course_name' => $new_course->{course_name}); -is_deeply( $new_course, $t->tx->res->json, "updateCourse: courses match" ); +is_deeply($new_course, $t->tx->res->json, "updateCourse: courses match"); ## test for exceptions # a set that is not in a course -$t->get_ok("/webwork3/api/courses/99999") - ->status_is(250,'error status') - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::CourseNotFound' ); +$t->get_ok("/webwork3/api/courses/99999")->status_is(250, 'error status') + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::CourseNotFound'); # try to update a non-existant course -$t->put_ok( "/webwork3/api/courses/999999" => json => { course_name => 'new course name' } ) - ->status_is(250,'error status') - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::CourseNotFound' ); +$t->put_ok("/webwork3/api/courses/999999" => json => { course_name => 'new course name' }) + ->status_is(250, 'error status')->content_type_is('application/json;charset=UTF-8') + ->json_is('/exception' => 'DB::Exception::CourseNotFound'); # print Dumper($t->tx->res); @@ -105,56 +94,40 @@ $t->put_ok( "/webwork3/api/courses/999999" => json => { course_name => 'new cour my $another_new_course = { name => "this is the wrong field" }; -$t->post_ok( "/webwork3/api/courses/" => json => $another_new_course ) - ->status_is(250,'error status') - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::ParametersNeeded' ); +$t->post_ok("/webwork3/api/courses/" => json => $another_new_course)->status_is(250, 'error status') + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::ParametersNeeded'); # try to delete a non-existent course. -$t->delete_ok("/webwork3/api/courses/9999999") - ->status_is(250,'error status') - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::CourseNotFound' ); +$t->delete_ok("/webwork3/api/courses/9999999")->status_is(250, 'error status') + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::CourseNotFound'); # delete the added course -$t->delete_ok("/webwork3/api/courses/$new_course_id") -->status_is(200) -->json_is( '/course_name' => $new_course->{course_name} ); +$t->delete_ok("/webwork3/api/courses/$new_course_id")->status_is(200) + ->json_is('/course_name' => $new_course->{course_name}); ## login a non admin user -if ($TEST_PERMISSIONS){ +if ($TEST_PERMISSIONS) { - $t->post_ok( '/webwork3/api/login' => json => { email => 'lisa@google.com', password => 'lisa' } ) - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/logged_in' => 1 ) - ->json_is( '/user/login' => "lisa" ) - ->json_is( '/user/is_admin' => 0 ); + $t->post_ok('/webwork3/api/login' => json => { email => 'lisa@google.com', password => 'lisa' }) + ->content_type_is('application/json;charset=UTF-8')->json_is('/logged_in' => 1) + ->json_is('/user/login' => "lisa")->json_is('/user/is_admin' => 0); - $t->get_ok('/webwork3/api/courses') - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/0/course_name' => "Precalculus" ) - ->json_is( '/0/course_params/institution' => "Springfield CC" ); + $t->get_ok('/webwork3/api/courses')->content_type_is('application/json;charset=UTF-8') + ->json_is('/0/course_name' => "Precalculus")->json_is('/0/course_params/institution' => "Springfield CC"); - $t->get_ok('/webwork3/api/courses/1') - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/course_name' => "Precalculus" ) - ->json_is( '/course_params/institution' => "Springfield CC" ); + $t->get_ok('/webwork3/api/courses/1')->content_type_is('application/json;charset=UTF-8') + ->json_is('/course_name' => "Precalculus")->json_is('/course_params/institution' => "Springfield CC"); # the following shouldn't have permissions for these routes. - $t->post_ok( '/webwork3/api/courses' => json => $new_course ) - ->status_is(200) - ->json_is( '/has_permission' => 0 ); + $t->post_ok('/webwork3/api/courses' => json => $new_course)->status_is(200)->json_is('/has_permission' => 0); - $t->put_ok( "/webwork3/api/courses/1" => json => { course_name => "XXX" } ) - ->status_is(200) - ->json_is( '/has_permission' => 0 ); + $t->put_ok("/webwork3/api/courses/1" => json => { course_name => "XXX" })->status_is(200) + ->json_is('/has_permission' => 0); - $t->delete_ok("/webwork3/api/courses/1") - ->status_is(200) - ->json_is( '/has_permission' => 0 ); + $t->delete_ok("/webwork3/api/courses/1")->status_is(200)->json_is('/has_permission' => 0); } done_testing; diff --git a/t/mojolicious/003_users.t b/t/mojolicious/003_users.t index 5438400d..dccddd2a 100644 --- a/t/mojolicious/003_users.t +++ b/t/mojolicious/003_users.t @@ -8,13 +8,13 @@ use Test::Mojo; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use Getopt::Long; my $TEST_PERMISSIONS; -GetOptions( "perm" => \$TEST_PERMISSIONS ); # check for the flag --perm when running this. +GetOptions("perm" => \$TEST_PERMISSIONS); # check for the flag --perm when running this. use lib "$main::lib_dir"; use DB::Schema; @@ -26,7 +26,7 @@ use Clone qw/clone/; my $schema = loadSchema(); # remove the maggie user if exists in the database -my $maggie = $schema->resultset("User")->find({username => "maggie"}); +my $maggie = $schema->resultset("User")->find({ username => "maggie" }); $maggie->delete if defined($maggie); use YAML::XS qw/LoadFile/; @@ -36,30 +36,24 @@ my $t; if ($TEST_PERMISSIONS) { $config->{ignore_permissions} = 0; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); # and username - $t->post_ok( '/webwork3/api/username' => json => { email => 'admin@google.com', password => 'admin' } ) - ->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 ); + $t->post_ok('/webwork3/api/username' => json => { email => 'admin@google.com', password => 'admin' }) + ->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); } else { $config->{ignore_permissions} = 1; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); } my @all_users = $schema->resultset("User")->getAllGlobalUsers(); -$t->get_ok('/webwork3/api/users') - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/1/first_name' => $all_users[1]->{first_name} ) - ->json_is( '/1/email' => $all_users[1]->{email} ); +$t->get_ok('/webwork3/api/users')->status_is(200)->content_type_is('application/json;charset=UTF-8') + ->json_is('/1/first_name' => $all_users[1]->{first_name})->json_is('/1/email' => $all_users[1]->{email}); - -$t->get_ok('/webwork3/api/users/3') - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/username' => "lisa" ) - ->json_is( '/email' => 'lisa@google.com' ); +$t->get_ok('/webwork3/api/users/3')->status_is(200)->content_type_is('application/json;charset=UTF-8') + ->json_is('/username' => "lisa")->json_is('/email' => 'lisa@google.com'); ## add a new user @@ -67,36 +61,34 @@ my $new_user = { email => 'maggie@abc.com', first_name => "Maggie", last_name => "Simpson", - username => "maggie", + username => "maggie", student_id => "1234123423", is_admin => 0 }; -$t->post_ok( '/webwork3/api/users' => json => $new_user )->status_is(200) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/username' => $new_user->{username} ); +$t->post_ok('/webwork3/api/users' => json => $new_user)->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/username' => $new_user->{username}); # Pull out the id from the response $new_user->{user_id} = $t->tx->res->json('/user_id'); -is_deeply( $new_user, $t->tx->res->json, "addUser: global user added." ); +is_deeply($new_user, $t->tx->res->json, "addUser: global user added."); ## update the user $new_user->{email} = 'maggie@juno.com'; -$t->put_ok( "/webwork3/api/users/" . $new_user->{user_id} => json => $new_user ) - ->status_is(200); -is_deeply( $new_user, $t->tx->res->json, "updateUser: global user updated" ); +$t->put_ok("/webwork3/api/users/" . $new_user->{user_id} => json => $new_user)->status_is(200); +is_deeply($new_user, $t->tx->res->json, "updateUser: global user updated"); ## add the user to the course my $added_user_to_course = { user_id => $new_user->{user_id}, - role => "student" + role => "student" }; -$t->post_ok( "/webwork3/api/courses/4/users" => json => $added_user_to_course) - ->status_is(200) +$t->post_ok("/webwork3/api/courses/4/users" => json => $added_user_to_course)->status_is(200) ->content_type_is('application/json;charset=UTF-8'); - # ->json_is( '/username' => 'maggie') - # ->json_is( '/role' => 'student'); +# ->json_is( '/username' => 'maggie') +# ->json_is( '/role' => 'student'); # warn Dumper $t->tx->res->json; @@ -104,94 +96,78 @@ $t->post_ok( "/webwork3/api/courses/4/users" => json => $added_user_to_course) # try to get a non-existent user $t->get_ok("/webwork3/api/users/99999")->content_type_is('application/json;charset=UTF-8') - ->status_is(250,"exception status") - ->status_is(250, 'internal exception') - ->json_is( '/exception' => 'DB::Exception::UserNotFound' ); + ->status_is(250, "exception status")->status_is(250, 'internal exception') + ->json_is('/exception' => 'DB::Exception::UserNotFound'); # try to update a user not in a course -$t->put_ok( "/webwork3/api/users/99999" => json => { email => 'fred@happy.com' } ) - ->status_is(250,"exception status") - ->content_type_is('application/json;charset=UTF-8')->json_is( '/exception' => 'DB::Exception::UserNotFound' ); +$t->put_ok("/webwork3/api/users/99999" => json => { email => 'fred@happy.com' })->status_is(250, "exception status") + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::UserNotFound'); # try to add a user without a username my $another_new_user = { username_name => "this is the wrong field" }; -$t->post_ok( "/webwork3/api/users" => json => $another_new_user ) - ->content_type_is('application/json;charset=UTF-8') - ->status_is(250,"exception status") - ->json_is( '/exception' => 'DB::Exception::ParametersNeeded' ); +$t->post_ok("/webwork3/api/users" => json => $another_new_user)->content_type_is('application/json;charset=UTF-8') + ->status_is(250, "exception status")->json_is('/exception' => 'DB::Exception::ParametersNeeded'); # try to delete a user not in a course $t->delete_ok("/webwork3/api/users/99999")->content_type_is('application/json;charset=UTF-8') - ->status_is(250,"exception status") - ->json_is( '/exception' => 'DB::Exception::UserNotFound' ); + ->status_is(250, "exception status")->json_is('/exception' => 'DB::Exception::UserNotFound'); # add another user to a course that is not a global user my $another_user = { - username => "bob", + username => "bob", first_name => "Sideshow", - last_name => "Bob", + last_name => "Bob", student_id => "933723", - email => 'bob@sideshow.net' + email => 'bob@sideshow.net' }; -$t->post_ok("/webwork3/api/users" => json => $another_user ) - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is('/username' => $another_user->{username}); +$t->post_ok("/webwork3/api/users" => json => $another_user)->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/username' => $another_user->{username}); my $another_user_id = $t->tx->res->json("/user_id"); -$t->post_ok("/webwork3/api/courses/4/users" => json => { +$t->post_ok( + "/webwork3/api/courses/4/users" => json => { user_id => $another_user_id, - role => "student" - }) - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8'); - + role => "student" + } +)->status_is(200)->content_type_is('application/json;charset=UTF-8'); my $another_new_user_id = $t->tx->res->json('/user_id'); # delete the added users -$t->delete_ok("/webwork3/api/users/$new_user->{user_id}") - ->status_is(200) - ->json_is( '/username' => $new_user->{username} ); +$t->delete_ok("/webwork3/api/users/$new_user->{user_id}")->status_is(200) + ->json_is('/username' => $new_user->{username}); -$t->delete_ok("/webwork3/api/users/$another_new_user_id") - ->status_is(200) - ->json_is( '/username' => $another_user->{username} ); +$t->delete_ok("/webwork3/api/users/$another_new_user_id")->status_is(200) + ->json_is('/username' => $another_user->{username}); ## test that a non-admin user cannot access all of the routes if ($TEST_PERMISSIONS) { - $t->post_ok( '/webwork3/api/username' => json => { email => 'lisa@google.com', password => 'lisa' } ) - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/logged_in' => 1 ) - ->json_is( '/user/username' => "lisa" )->json_is( '/user/is_admin' => 0 ); - - $t->get_ok('/webwork3/api/users')->content_type_is('application/json;charset=UTF-8') - ->status_is(200) - ->json_is( '/has_permission' => 0 ); - - $t->get_ok('/webwork3/api/users/1')->content_type_is('application/json;charset=UTF-8') - ->status_is(200) - ->json_is( '/has_permission' => 0 ); - - $t->post_ok( '/webwork3/api/users' => json => $new_user )->content_type_is('application/json;charset=UTF-8') - ->status_is(200) - ->json_is( '/has_permission' => 0 ); - - $t->put_ok( '/webwork3/api/users/1' => json => { email => 'lisa@aol.com' } ) - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/has_permission' => 0 ); - - $t->delete_ok('/webwork3/api/users/1')->content_type_is('application/json;charset=UTF-8') - ->status_is(200) - ->json_is( '/has_permission' => 0 ); + $t->post_ok('/webwork3/api/username' => json => { email => 'lisa@google.com', password => 'lisa' })->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/logged_in' => 1) + ->json_is('/user/username' => "lisa")->json_is('/user/is_admin' => 0); + + $t->get_ok('/webwork3/api/users')->content_type_is('application/json;charset=UTF-8')->status_is(200) + ->json_is('/has_permission' => 0); + + $t->get_ok('/webwork3/api/users/1')->content_type_is('application/json;charset=UTF-8')->status_is(200) + ->json_is('/has_permission' => 0); + + $t->post_ok('/webwork3/api/users' => json => $new_user)->content_type_is('application/json;charset=UTF-8') + ->status_is(200)->json_is('/has_permission' => 0); + + $t->put_ok('/webwork3/api/users/1' => json => { email => 'lisa@aol.com' })->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/has_permission' => 0); + + $t->delete_ok('/webwork3/api/users/1')->content_type_is('application/json;charset=UTF-8')->status_is(200) + ->json_is('/has_permission' => 0); } diff --git a/t/mojolicious/004_course_users.t b/t/mojolicious/004_course_users.t index 67dcd1d8..34a7b87e 100644 --- a/t/mojolicious/004_course_users.t +++ b/t/mojolicious/004_course_users.t @@ -10,13 +10,13 @@ use Data::Dumper; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use Getopt::Long; my $TEST_PERMISSIONS; -GetOptions( "perm" => \$TEST_PERMISSIONS ); # check for the flag --perm when running this. +GetOptions("perm" => \$TEST_PERMISSIONS); # check for the flag --perm when running this. use lib "$main::lib_dir"; use DB::Schema; @@ -24,10 +24,8 @@ use DB::TestUtils qw/loadSchema/; use Clone qw/clone/; use YAML::XS qw/LoadFile/; - my $config = clone(LoadFile("$main::lib_dir/../conf/webwork3.yml")); - # Test the api with common "courses" routes my $schema = loadSchema(); @@ -36,33 +34,28 @@ my $t; if ($TEST_PERMISSIONS) { $config->{ignore_permissions} = 0; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); # username an admin - $t->post_ok( '/webwork3/api/username' => json => { email => 'admin@google.com', 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 ); + $t->post_ok('/webwork3/api/username' => json => { email => 'admin@google.com', 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); -} -else { +} else { $config->{ignore_permissions} = 1; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); } # remove the maggie user if exists in the database -my $maggie = $schema->resultset("User")->find({username => "maggie"}); +my $maggie = $schema->resultset("User")->find({ username => "maggie" }); if (defined($maggie)) { - my $maggie_cu = $schema->resultset("CourseUser")->search({user_id => $maggie->user_id}); + my $maggie_cu = $schema->resultset("CourseUser")->search({ user_id => $maggie->user_id }); $maggie_cu->delete_all if defined($maggie_cu); - $maggie->delete if defined($maggie); + $maggie->delete if defined($maggie); } - -$t->get_ok('/webwork3/api/courses/4/users') - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/0/role' => "instructor" ) - ->json_is( '/1/role' => 'student' ); +$t->get_ok('/webwork3/api/courses/4/users')->status_is(200)->content_type_is('application/json;charset=UTF-8') + ->json_is('/0/role' => "instructor")->json_is('/1/role' => 'student'); print Dumper($t->tx->res->json); @@ -70,8 +63,7 @@ print Dumper($t->tx->res->json); my $user_id = $t->tx->res->json('/0/user_id'); $t->get_ok("/webwork3/api/courses/2/users/$user_id")->status_is(200)->content_type_is('application/json;charset=UTF-8') - ->json_is( '/user_id' => $user_id ) - ->json_is( '/role' => "student" ); + ->json_is('/user_id' => $user_id)->json_is('/role' => "student"); ## add a new global user @@ -79,15 +71,13 @@ my $new_user = { email => 'maggie@abc.com', first_name => "Maggie", last_name => "Simpson", - username => "maggie", + username => "maggie", student_id => "1234123423" }; -$t->post_ok( "/webwork3/api/users" => json => $new_user) - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/first_name' => $new_user->{first_name} ) - ->json_is( '/email' => $new_user->{email}); +$t->post_ok("/webwork3/api/users" => json => $new_user)->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/first_name' => $new_user->{first_name}) + ->json_is('/email' => $new_user->{email}); # then add the user to a course @@ -95,86 +85,72 @@ my $new_user_id = $t->tx->res->json('/user_id'); my $course_user_params = { user_id => $new_user_id, - role => "student", - params => { + role => "student", + params => { comment => "I love my big sister" } }; -$t->post_ok( "/webwork3/api/courses/2/users" => json => $course_user_params ) - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/role' => $course_user_params->{role} ) - ->json_is( '/params/comment' => $course_user_params->{params}->{comment}); +$t->post_ok("/webwork3/api/courses/2/users" => json => $course_user_params)->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/role' => $course_user_params->{role}) + ->json_is('/params/comment' => $course_user_params->{params}->{comment}); # update the new user $new_user->{recitation} = 2; -$t->put_ok( "/webwork3/api/courses/2/users/$new_user_id" => json => { recitation => 2 } )->status_is(200) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/recitation' => 2 ); +$t->put_ok("/webwork3/api/courses/2/users/$new_user_id" => json => { recitation => 2 })->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/recitation' => 2); ## test for exceptions # a non-existent user -$t->get_ok("/webwork3/api/courses/1/users/99999") - ->status_is(250,"status for exception") - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::UserNotFound' ); +$t->get_ok("/webwork3/api/courses/1/users/99999")->status_is(250, "status for exception") + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::UserNotFound'); # check that a new is not in a course -$t->get_ok("/webwork3/api/courses/1/users/$new_user_id") - ->status_is(250,"status for exception") - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::UserNotInCourse' ); - +$t->get_ok("/webwork3/api/courses/1/users/$new_user_id")->status_is(250, "status for exception") + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::UserNotInCourse'); # try to update a user not in a course -$t->put_ok( "/webwork3/api/courses/1/users/$new_user_id" => json => { recitation => '2' } ) - ->status_is(250,"status for exception") - ->content_type_is('application/json;charset=UTF-8')->json_is( '/exception' => 'DB::Exception::UserNotInCourse' ); +$t->put_ok("/webwork3/api/courses/1/users/$new_user_id" => json => { recitation => '2' }) + ->status_is(250, "status for exception")->content_type_is('application/json;charset=UTF-8') + ->json_is('/exception' => 'DB::Exception::UserNotInCourse'); # try to add a user without a username my $another_new_user = { username_name => "this is the wrong field" }; -$t->post_ok( "/webwork3/api/courses/1/users" => json => $another_new_user ) - ->status_is(250,"status for exception") - ->content_type_is('application/json;charset=UTF-8')->json_is( '/exception' => 'DB::Exception::ParametersNeeded' ); +$t->post_ok("/webwork3/api/courses/1/users" => json => $another_new_user)->status_is(250, "status for exception") + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::ParametersNeeded'); # try to delete a user not found -$t->delete_ok("/webwork3/api/courses/1/users/99") - ->status_is(250,"status for exception") - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::UserNotFound' ); +$t->delete_ok("/webwork3/api/courses/1/users/99")->status_is(250, "status for exception") + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::UserNotFound'); # try to delete a user not in a course -$t->delete_ok("/webwork3/api/courses/1/users/$new_user_id") - ->status_is(250,"status for exception") - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::UserNotInCourse' ); - +$t->delete_ok("/webwork3/api/courses/1/users/$new_user_id")->status_is(250, "status for exception") + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::UserNotInCourse'); -$t->delete_ok("/webwork3/api/courses/2/users/$new_user_id") - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/user_id' => $new_user_id ); +$t->delete_ok("/webwork3/api/courses/2/users/$new_user_id")->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/user_id' => $new_user_id); if ($TEST_PERMISSIONS) { - $t->post_ok("/webwork3/api/logout")->status_is(200)->json_is( '/logged_in' => 0 ); + $t->post_ok("/webwork3/api/logout")->status_is(200)->json_is('/logged_in' => 0); } ## check that a non_admin user has proper access. -my @all_users = $schema->resultset("User")->getCourseUsers( { course_id => 1 } ); +my @all_users = $schema->resultset("User")->getCourseUsers({ course_id => 1 }); my @instructors = grep { $_->{role} eq 'instructor' } @all_users; if ($TEST_PERMISSIONS) { - $t->post_ok( "/webwork3/api/username" => json => - { - email => $instructors[0]->{email}, + $t->post_ok( + "/webwork3/api/username" => json => { + email => $instructors[0]->{email}, password => $instructors[0]->{username} - })->status_is(200) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/logged_in' => 1 ); + } + )->status_is(200)->content_type_is('application/json;charset=UTF-8')->json_is('/logged_in' => 1); $t->get_ok('/webwork3/api/courses/1/users')->status_is(200)->content_type_is('application/json;charset=UTF-8'); diff --git a/t/mojolicious/005_problem_sets.t b/t/mojolicious/005_problem_sets.t index 15fff83d..a1e66421 100644 --- a/t/mojolicious/005_problem_sets.t +++ b/t/mojolicious/005_problem_sets.t @@ -10,13 +10,13 @@ use DateTime::Format::Strptime; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use Getopt::Long; my $TEST_PERMISSIONS; -GetOptions( "perm" => \$TEST_PERMISSIONS ); # check for the flag --perm when running this. +GetOptions("perm" => \$TEST_PERMISSIONS); # check for the flag --perm when running this. use lib "$main::lib_dir"; use DB::Schema; @@ -26,8 +26,7 @@ use YAML::XS qw/LoadFile/; my $config = clone(LoadFile("$main::lib_dir/../conf/webwork3.yml")); -my $strp = DateTime::Format::Strptime->new( pattern => '%FT%T',on_error => 'croak' ); - +my $strp = DateTime::Format::Strptime->new(pattern => '%FT%T', on_error => 'croak'); # Test the api with common "sets" routes @@ -38,16 +37,15 @@ my $t; if ($TEST_PERMISSIONS) { $config->{ignore_permissions} = 1; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); # username an admin - $t->post_ok( '/webwork3/api/username' => json => { email => 'admin@google.com', 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 ); -} -else { + $t->post_ok('/webwork3/api/username' => json => { email => 'admin@google.com', 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); +} else { $config->{ignore_permissions} = 0; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); } # load the homework sets @@ -55,28 +53,22 @@ else { my @hw_sets = loadCSV("$main::lib_dir/../t/db/sample_data/hw_sets.csv"); for my $set (@hw_sets) { $set->{set_type} = "HW"; - for my $date (keys %{$set->{dates}}) { - my $dt = $strp->parse_datetime( $set->{dates}->{$date}); + for my $date (keys %{ $set->{dates} }) { + my $dt = $strp->parse_datetime($set->{dates}->{$date}); $set->{dates}->{$date} = $dt->epoch; } } -$t->get_ok('/webwork3/api/courses/2/sets') - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/1/set_name' => $hw_sets[1]->{set_name} ) - ->json_is( '/1/dates/open' => $hw_sets[1]->{dates}->{open} ); +$t->get_ok('/webwork3/api/courses/2/sets')->status_is(200)->content_type_is('application/json;charset=UTF-8') + ->json_is('/1/set_name' => $hw_sets[1]->{set_name})->json_is('/1/dates/open' => $hw_sets[1]->{dates}->{open}); # Pull out the id from the response my $set_id = $t->tx->res->json('/2/set_id'); # Disabled for now until this is fixed. -$t->get_ok("/webwork3/api/courses/2/sets/$set_id") - ->status_is(200) - ->content_type_is('application/json;charset=UTF-8') - ->json_is( '/set_name' => $hw_sets[2]->{set_name} ) - ->json_is( '/set_type' => $hw_sets[2]->{set_type} ) - ->json_is( '/dates/open' => $hw_sets[2]->{dates}->{open} ); +$t->get_ok("/webwork3/api/courses/2/sets/$set_id")->status_is(200)->content_type_is('application/json;charset=UTF-8') + ->json_is('/set_name' => $hw_sets[2]->{set_name})->json_is('/set_type' => $hw_sets[2]->{set_type}) + ->json_is('/dates/open' => $hw_sets[2]->{dates}->{open}); # new problem set @@ -89,54 +81,54 @@ my $new_set = { }, }; -$t->post_ok( "/webwork3/api/courses/2/sets" => json => $new_set )->content_type_is('application/json;charset=UTF-8') - ->json_is( '/set_name' => 'HW #9' )->json_is( '/set_type' => 'HW' )->json_is( '/dates/answer' => 500 ); +$t->post_ok("/webwork3/api/courses/2/sets" => json => $new_set)->content_type_is('application/json;charset=UTF-8') + ->json_is('/set_name' => 'HW #9')->json_is('/set_type' => 'HW')->json_is('/dates/answer' => 500); my $new_set_id = $t->tx->res->json('/set_id'); -$t->put_ok( "/webwork3/api/courses/2/sets/$new_set_id" => json => { set_name => 'HW #11' } ) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/set_name' => 'HW #11' ); +$t->put_ok("/webwork3/api/courses/2/sets/$new_set_id" => json => { set_name => 'HW #11' }) + ->content_type_is('application/json;charset=UTF-8')->json_is('/set_name' => 'HW #11'); ## test for exceptions # a set that is not in a course $t->get_ok("/webwork3/api/courses/1/sets/6")->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::SetNotInCourse' ); + ->json_is('/exception' => 'DB::Exception::SetNotInCourse'); # try to update a set not in a course -$t->put_ok( "/webwork3/api/courses/1/sets/6" => json => { set_name => 'HW #99' } ) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/exception' => 'DB::Exception::SetNotInCourse' ); +$t->put_ok("/webwork3/api/courses/1/sets/6" => json => { set_name => 'HW #99' }) + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::SetNotInCourse'); # try to add a set without a setname my $another_new_set = { name => "this is the wrong field" }; -$t->post_ok( "/webwork3/api/courses/2/sets" => json => $another_new_set ) - ->content_type_is('application/json;charset=UTF-8')->json_is( '/exception' => 'DB::Exception::ParametersNeeded' ); +$t->post_ok("/webwork3/api/courses/2/sets" => json => $another_new_set) + ->content_type_is('application/json;charset=UTF-8')->json_is('/exception' => 'DB::Exception::ParametersNeeded'); # delete an existing set $t->delete_ok("/webwork3/api/courses/2/sets/$new_set_id")->content_type_is('application/json;charset=UTF-8') - ->json_is( '/set_name' => 'HW #11' ); + ->json_is('/set_name' => 'HW #11'); # try to delete a set not in a course $t->delete_ok("/webwork3/api/courses/1/sets/6")->content_type_is('application/json;charset=UTF-8') - ->json_is( '/exception' => 'DB::Exception::SetNotInCourse' ); + ->json_is('/exception' => 'DB::Exception::SetNotInCourse'); if ($TEST_PERMISSIONS) { - $t->post_ok("/webwork3/api/logout")->status_is(200)->json_is( '/logged_in' => 0 ); + $t->post_ok("/webwork3/api/logout")->status_is(200)->json_is('/logged_in' => 0); } ## check that a non_admin user has proper access. -my @all_users = $schema->resultset("User")->getCourseUsers( { course_id => 1 } ); +my @all_users = $schema->resultset("User")->getCourseUsers({ course_id => 1 }); my @instructors = grep { $_->{role} eq 'instructor' } @all_users; if ($TEST_PERMISSIONS) { - $t->post_ok( - "/webwork3/api/username" => json => { email => $instructors[0]->{email}, password => $instructors[0]->{username} } ) - ->status_is(200)->content_type_is('application/json;charset=UTF-8')->json_is( '/logged_in' => 1 ); + $t->post_ok("/webwork3/api/username" => json => + { email => $instructors[0]->{email}, password => $instructors[0]->{username} })->status_is(200) + ->content_type_is('application/json;charset=UTF-8')->json_is('/logged_in' => 1); $t->get_ok('/webwork3/api/courses/1/sets')->status_is(200)->content_type_is('application/json;charset=UTF-8'); diff --git a/t/mojolicious/006_quizzes.t b/t/mojolicious/006_quizzes.t index 409b33ea..8b284e31 100644 --- a/t/mojolicious/006_quizzes.t +++ b/t/mojolicious/006_quizzes.t @@ -11,13 +11,13 @@ use DateTime::Format::Strptime; BEGIN { use File::Basename qw/dirname/; use Cwd qw/abs_path/; - $main::test_dir = abs_path( dirname(__FILE__) ); - $main::lib_dir = dirname( dirname($main::test_dir) ) . '/lib'; + $main::test_dir = abs_path(dirname(__FILE__)); + $main::lib_dir = dirname(dirname($main::test_dir)) . '/lib'; } use Getopt::Long; my $TEST_PERMISSIONS; -GetOptions( "perm" => \$TEST_PERMISSIONS ); # check for the flag --perm when running this. +GetOptions("perm" => \$TEST_PERMISSIONS); # check for the flag --perm when running this. use lib "$main::lib_dir"; @@ -27,7 +27,7 @@ use Clone qw/clone/; use YAML::XS qw/LoadFile/; my $config = clone(LoadFile("$main::lib_dir/../conf/webwork3.yml")); -my $strp = DateTime::Format::Strptime->new( pattern => '%FT%T',on_error => 'croak' ); +my $strp = DateTime::Format::Strptime->new(pattern => '%FT%T', on_error => 'croak'); # this tests the api with common courses routes @@ -38,17 +38,16 @@ my $t; if ($TEST_PERMISSIONS) { $config->{ignore_permissions} = 1; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); # username an admin - $t->post_ok( '/webwork3/api/username' => json => { email => 'admin@google.com', 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 ); + $t->post_ok('/webwork3/api/username' => json => { email => 'admin@google.com', 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); -} -else { +} else { $config->{ignore_permissions} = 0; - $t = Test::Mojo->new( WeBWorK3 => $config ); + $t = Test::Mojo->new(WeBWorK3 => $config); } # load the quizzes @@ -56,14 +55,13 @@ else { my @quizzes = loadCSV("$main::lib_dir/../t/db/sample_data/quizzes.csv"); for my $quiz (@quizzes) { $quiz->{set_type} = "QUIZ"; - for my $date (keys %{$quiz->{dates}}) { - my $dt = $strp->parse_datetime( $quiz->{dates}->{$date}); + for my $date (keys %{ $quiz->{dates} }) { + my $dt = $strp->parse_datetime($quiz->{dates}->{$date}); $quiz->{dates}->{$date} = $dt->epoch; } } - $t->get_ok('/webwork3/api/courses/2/sets')->content_type_is('application/json;charset=UTF-8') - ->json_is( '/3/set_name' => "Quiz #1" ); + ->json_is('/3/set_name' => "Quiz #1"); done_testing();