mumuki-laboratory 5.13.0 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +674 -0
- data/app/assets/stylesheets/application/_modules.scss +1 -0
- data/app/assets/stylesheets/application/modules/_chapter_show.scss +3 -0
- data/app/controllers/api/organizations_controller.rb +3 -3
- data/app/controllers/api/users_controller.rb +2 -2
- data/app/controllers/application_controller.rb +6 -0
- data/app/controllers/discussions_controller.rb +2 -2
- data/app/controllers/exercises_controller.rb +1 -1
- data/app/controllers/guide_container_controller.rb +1 -1
- data/app/controllers/guide_progress_controller.rb +1 -1
- data/app/controllers/guides_controller.rb +1 -1
- data/app/controllers/users_controller.rb +1 -1
- data/app/helpers/discussions_helper.rb +1 -1
- data/app/views/chapters/show.html.erb +1 -1
- data/lib/events.rb +10 -6
- data/lib/mumuki/laboratory.rb +30 -14
- data/lib/mumuki/laboratory/controllers/content.rb +1 -1
- data/lib/mumuki/laboratory/controllers/dynamic_errors.rb +5 -5
- data/lib/mumuki/laboratory/engine.rb +0 -8
- data/lib/mumuki/laboratory/extensions.rb +0 -2
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/lib/tasks/messages.rake +1 -1
- data/public/compass_rose.svg +1272 -1262
- data/spec/api_helper.rb +7 -0
- data/spec/controllers/confirmations_controller_spec.rb +1 -1
- data/spec/controllers/organizations_api_controller_spec.rb +8 -8
- data/spec/controllers/users_api_controller_spec.rb +7 -7
- data/spec/dummy/config/application.rb +4 -0
- data/spec/dummy/db/schema.rb +8 -3
- data/spec/dummy/db/seeds.rb +7 -3
- data/spec/evaluation_helper.rb +1 -1
- data/spec/features/home_private_flow_spec.rb +8 -6
- data/spec/features/home_public_flow_spec.rb +8 -7
- data/spec/features/profile_flow_spec.rb +2 -1
- data/spec/login_helper.rb +20 -0
- data/spec/models/book_import_spec.rb +5 -5
- data/spec/models/course_spec.rb +1 -1
- data/spec/models/event_generation_spec.rb +4 -4
- data/spec/models/exam_spec.rb +14 -14
- data/spec/models/exercise_spec.rb +26 -3
- data/spec/models/guide_import_spec.rb +15 -15
- data/spec/models/guide_spec.rb +54 -4
- data/spec/models/language_spec.rb +48 -46
- data/spec/models/message_spec.rb +5 -5
- data/spec/models/query_spec.rb +2 -2
- data/spec/models/question_spec.rb +1 -1
- data/spec/models/solution_spec.rb +2 -2
- data/spec/models/topic_import_spec.rb +3 -3
- data/spec/models/user_changed_spec.rb +3 -3
- data/spec/spec_helper.rb +2 -37
- metadata +18 -497
- data/app/models/api_client.rb +0 -31
- data/app/models/application_record.rb +0 -92
- data/app/models/assignment.rb +0 -204
- data/app/models/book.rb +0 -47
- data/app/models/chapter.rb +0 -29
- data/app/models/complement.rb +0 -15
- data/app/models/concerns/assistable.rb +0 -17
- data/app/models/concerns/contextualization.rb +0 -82
- data/app/models/concerns/friendly_name.rb +0 -10
- data/app/models/concerns/guide_container.rb +0 -53
- data/app/models/concerns/navigation/parent_navigation.rb +0 -27
- data/app/models/concerns/navigation/siblings_navigation.rb +0 -19
- data/app/models/concerns/navigation/terminal_navigation.rb +0 -13
- data/app/models/concerns/submittable/confirmable.rb +0 -5
- data/app/models/concerns/submittable/queriable.rb +0 -9
- data/app/models/concerns/submittable/questionable.rb +0 -6
- data/app/models/concerns/submittable/solvable.rb +0 -32
- data/app/models/concerns/submittable/submittable.rb +0 -11
- data/app/models/concerns/submittable/triable.rb +0 -9
- data/app/models/concerns/with_assignments.rb +0 -32
- data/app/models/concerns/with_case_insensitive_search.rb +0 -7
- data/app/models/concerns/with_description.rb +0 -12
- data/app/models/concerns/with_discussion_creation.rb +0 -9
- data/app/models/concerns/with_discussion_creation/subscription.rb +0 -33
- data/app/models/concerns/with_discussion_creation/upvote.rb +0 -28
- data/app/models/concerns/with_discussion_status.rb +0 -11
- data/app/models/concerns/with_discussions.rb +0 -23
- data/app/models/concerns/with_editor.rb +0 -39
- data/app/models/concerns/with_expectations.rb +0 -19
- data/app/models/concerns/with_language.rb +0 -14
- data/app/models/concerns/with_layout.rb +0 -7
- data/app/models/concerns/with_locale.rb +0 -7
- data/app/models/concerns/with_messages.rb +0 -22
- data/app/models/concerns/with_number.rb +0 -9
- data/app/models/concerns/with_profile.rb +0 -12
- data/app/models/concerns/with_randomizations.rb +0 -34
- data/app/models/concerns/with_reminders.rb +0 -74
- data/app/models/concerns/with_scoped_queries.rb +0 -47
- data/app/models/concerns/with_scoped_queries/filter.rb +0 -15
- data/app/models/concerns/with_scoped_queries/page.rb +0 -10
- data/app/models/concerns/with_scoped_queries/sort.rb +0 -47
- data/app/models/concerns/with_slug.rb +0 -32
- data/app/models/concerns/with_usages.rb +0 -16
- data/app/models/concerns/with_user_navigation.rb +0 -9
- data/app/models/content.rb +0 -10
- data/app/models/course.rb +0 -20
- data/app/models/discussion.rb +0 -136
- data/app/models/event.rb +0 -2
- data/app/models/exam.rb +0 -147
- data/app/models/exam_authorization.rb +0 -10
- data/app/models/exercise.rb +0 -190
- data/app/models/exercise/challenge.rb +0 -25
- data/app/models/exercise/interactive.rb +0 -41
- data/app/models/exercise/playground.rb +0 -23
- data/app/models/exercise/problem.rb +0 -41
- data/app/models/exercise/queriable_challenge.rb +0 -5
- data/app/models/exercise/reading.rb +0 -17
- data/app/models/guide.rb +0 -92
- data/app/models/invitation.rb +0 -36
- data/app/models/language.rb +0 -106
- data/app/models/lesson.rb +0 -25
- data/app/models/message.rb +0 -68
- data/app/models/organization.rb +0 -118
- data/app/models/stats.rb +0 -24
- data/app/models/submission/confirmation.rb +0 -9
- data/app/models/submission/console_submission.rb +0 -13
- data/app/models/submission/persistent_submission.rb +0 -7
- data/app/models/submission/query.rb +0 -19
- data/app/models/submission/question.rb +0 -14
- data/app/models/submission/solution.rb +0 -7
- data/app/models/submission/submission.rb +0 -56
- data/app/models/submission/try.rb +0 -20
- data/app/models/subscription.rb +0 -12
- data/app/models/topic.rb +0 -46
- data/app/models/topic_container.rb +0 -21
- data/app/models/upvote.rb +0 -4
- data/app/models/usage.rb +0 -20
- data/app/models/user.rb +0 -153
- data/app/models/with_stats.rb +0 -9
- data/db/migrate/20141120231135_create_exercises.rb +0 -11
- data/db/migrate/20141120231735_create_submissions.rb +0 -9
- data/db/migrate/20141121001134_add_status_to_submission.rb +0 -5
- data/db/migrate/20141121013100_add_result_to_submission.rb +0 -5
- data/db/migrate/20141121122921_add_language_to_exercise.rb +0 -5
- data/db/migrate/20141124023403_create_users.rb +0 -13
- data/db/migrate/20141124032114_add_user_to_submission.rb +0 -5
- data/db/migrate/20141207235356_add_submissions_count_to_exercise.rb +0 -5
- data/db/migrate/20141208005050_add_author_to_exercise.rb +0 -5
- data/db/migrate/20141208005125_rename_user_to_submitter.rb +0 -5
- data/db/migrate/20141212044717_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +0 -31
- data/db/migrate/20141212044718_add_missing_unique_indices.acts_as_taggable_on_engine.rb +0 -20
- data/db/migrate/20141212044719_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +0 -10
- data/db/migrate/20141212044720_add_missing_taggable_index.acts_as_taggable_on_engine.rb +0 -10
- data/db/migrate/20141221213109_create_exercise_repos.rb +0 -11
- data/db/migrate/20141221215035_add_origin_to_exercise.rb +0 -6
- data/db/migrate/20141225034553_rename_exercise_repo_to_guide.rb +0 -6
- data/db/migrate/20141225143218_rename_github_url_to_github_repository.rb +0 -5
- data/db/migrate/20141225195510_create_imports.rb +0 -9
- data/db/migrate/20141225211350_add_status_to_import.rb +0 -6
- data/db/migrate/20141226010922_add_result_to_import.rb +0 -5
- data/db/migrate/20141228151351_change_exercise_description_to_text.rb +0 -5
- data/db/migrate/20141231074400_create_languages.rb +0 -13
- data/db/migrate/20141231191842_change_language_column_type.rb +0 -6
- data/db/migrate/20141231192030_rename_author_to_plugin_author.rb +0 -5
- data/db/migrate/20141231234940_increment_language_id.rb +0 -5
- data/db/migrate/20150108014005_add_locale_to_exercise.rb +0 -5
- data/db/migrate/20150111160450_add_uniques_to_languages.rb +0 -6
- data/db/migrate/20150125042217_add_test_syntax_hint_to_language.rb +0 -5
- data/db/migrate/20150125051529_add_hint_to_exercise.rb +0 -5
- data/db/migrate/20150126213310_devise_create_admin_users.rb +0 -42
- data/db/migrate/20150126213316_create_active_admin_comments.rb +0 -19
- data/db/migrate/20150315072037_add_description_to_guide.rb +0 -6
- data/db/migrate/20150317052723_remove_language_author.rb +0 -5
- data/db/migrate/20150317053307_remove_language_hint.rb +0 -5
- data/db/migrate/20150321150030_add_extra_code_to_exercise.rb +0 -5
- data/db/migrate/20150328211331_create_expectations.rb +0 -11
- data/db/migrate/20150329163753_add_email_to_user.rb +0 -5
- data/db/migrate/20150330020553_add_expectation_results_to_submission.rb +0 -5
- data/db/migrate/20150405231013_create_exports.rb +0 -9
- data/db/migrate/20150405232603_add_default_guide_to_user.rb +0 -5
- data/db/migrate/20150406020152_add_last_submission_date_to_user.rb +0 -5
- data/db/migrate/20150407225356_add_unique_index_to_users.rb +0 -5
- data/db/migrate/20150408020712_add_status_to_export.rb +0 -6
- data/db/migrate/20150408022654_add_commiter_to_export.rb +0 -5
- data/db/migrate/20150411215351_change_guide_description_to_text.rb +0 -5
- data/db/migrate/20150412042959_add_committer_to_import.rb +0 -5
- data/db/migrate/20150412201651_remove_default_guide_from_user.rb +0 -5
- data/db/migrate/20150415053559_add_image_url_to_user.rb +0 -5
- data/db/migrate/20150415211341_add_position_to_exercise.rb +0 -5
- data/db/migrate/20150415234515_create_relationships.rb +0 -10
- data/db/migrate/20150417052238_add_original_id_format_to_guide.rb +0 -5
- data/db/migrate/20150418055334_add_locale_and_language_to_guide.rb +0 -6
- data/db/migrate/20150424180136_add_guides_users_association_tables.rb +0 -14
- data/db/migrate/20150428195229_add_guides_suggestions.rb +0 -8
- data/db/migrate/20150507215646_remove_relationship.rb +0 -5
- data/db/migrate/20150508015148_create_api_tokens.rb +0 -10
- data/db/migrate/20150509191428_add_name_to_token.rb +0 -5
- data/db/migrate/20150512235847_add_feedback_to_submission.rb +0 -5
- data/db/migrate/20150513203636_create_categories.rb +0 -12
- data/db/migrate/20150513204102_create_starting_points.rb +0 -11
- data/db/migrate/20150517074730_add_extra_code_to_guide.rb +0 -5
- data/db/migrate/20150518174912_add_language_output_visibility_flag.rb +0 -5
- data/db/migrate/20150518185508_add_content_type_to_language.rb +0 -5
- data/db/migrate/20150519131033_set_default_locale_for_guide.rb +0 -5
- data/db/migrate/20150519174628_remove_language_name_uniq.rb +0 -6
- data/db/migrate/20150519220307_rename_api_token_columns.rb +0 -6
- data/db/migrate/20150520011404_convert_starting_point_into_path.rb +0 -12
- data/db/migrate/20150529135324_add_corollary_to_guide.rb +0 -5
- data/db/migrate/20150529141430_add_corollary_to_exercise.rb +0 -5
- data/db/migrate/20150531164450_add_test_extension_to_language.rb +0 -5
- data/db/migrate/20150603003459_remove_language_extension_uniq.rb +0 -6
- data/db/migrate/20150603020457_remove_guide_name_uniq.rb +0 -6
- data/db/migrate/20150605065543_add_highlight_mode.rb +0 -5
- data/db/migrate/20150614173852_add_learning_flag.rb +0 -5
- data/db/migrate/20150614180512_add_beta_flag.rb +0 -5
- data/db/migrate/20150614191257_add_last_exercise.rb +0 -5
- data/db/migrate/20150620181839_add_layout_to_exercise.rb +0 -5
- data/db/migrate/20150701030644_add_unique_to_language_name_index.rb +0 -6
- data/db/migrate/20150701212609_add_test_results_to_submission.rb +0 -5
- data/db/migrate/20150708212022_add_position_to_category.rb +0 -5
- data/db/migrate/20150708212836_change_category_description_to_text.rb +0 -5
- data/db/migrate/20150713120916_add_expectations_column_to_exercise.rb +0 -5
- data/db/migrate/20150714000532_remove_expectations_relation.rb +0 -5
- data/db/migrate/20150722003532_create_event_subscribers.rb +0 -10
- data/db/migrate/20150722030820_create_solutions.rb +0 -16
- data/db/migrate/20150722142019_add_submissions_count_to_solution.rb +0 -5
- data/db/migrate/20150723052640_add_submission_id_to_solution.rb +0 -5
- data/db/migrate/20150724062215_add_language_description.rb +0 -5
- data/db/migrate/20150724062233_add_category_links.rb +0 -5
- data/db/migrate/20150724062249_add_category_long_description.rb +0 -5
- data/db/migrate/20150819194207_convert_submissions_into_solutions.rb +0 -34
- data/db/migrate/20150819202310_remove_submissions.rb +0 -5
- data/db/migrate/20150826023647_create_friendly_id_slugs.rb +0 -15
- data/db/migrate/20150826023757_add_slug_to_guides.rb +0 -6
- data/db/migrate/20150826024859_add_slug_to_exercises.rb +0 -6
- data/db/migrate/20150828013106_add_remember_me_token_to_user.rb +0 -5
- data/db/migrate/20150829211550_add_queriable_to_language.rb +0 -5
- data/db/migrate/20150829215524_add_expectations_column_to_guide.rb +0 -5
- data/db/migrate/20150905214532_rename_exercise_title_to_name.rb +0 -5
- data/db/migrate/20151001143118_rename_solution_to_assignment.rb +0 -5
- data/db/migrate/20151001183858_rename_assignment_content_to_solution.rb +0 -5
- data/db/migrate/20151003003856_add_type_to_exercise.rb +0 -5
- data/db/migrate/20151020145904_remove_guide_git_information.rb +0 -7
- data/db/migrate/20151104163433_create_tenants.rb +0 -9
- data/db/migrate/20151104172241_create_path_rules.rb +0 -11
- data/db/migrate/20151104173956_remove_guide_position.rb +0 -5
- data/db/migrate/20151104220859_remove_path_from_guide.rb +0 -5
- data/db/migrate/20151107232242_move_slug_to_path_rule.rb +0 -6
- data/db/migrate/20151108173838_remove_slugs.rb +0 -5
- data/db/migrate/20151108182857_remove_act_as_taggable_taggings.rb +0 -6
- data/db/migrate/20151108183319_add_tags_array.rb +0 -5
- data/db/migrate/20151206072741_rename_guide_extra_code_to_extra.rb +0 -5
- data/db/migrate/20151208224736_rename_path_rule_to_chapter_guide.rb +0 -5
- data/db/migrate/20151208224907_rename_category_to_chapter.rb +0 -5
- data/db/migrate/20151208225503_rename_chapter_position_to_number.rb +0 -5
- data/db/migrate/20151208231749_rename_chapter_guide_path_to_chapter.rb +0 -5
- data/db/migrate/20151208233707_rename_url_to_slug.rb +0 -5
- data/db/migrate/20151209021925_add_locale_to_tenant.rb +0 -5
- data/db/migrate/20151210204646_remove_language_extensions.rb +0 -6
- data/db/migrate/20151211032811_drop_collaborators.rb +0 -5
- data/db/migrate/20151211033000_drop_contributors.rb +0 -5
- data/db/migrate/20151211034943_remove_authors.rb +0 -6
- data/db/migrate/20151211035206_add_contact_email_to_tenant.rb +0 -5
- data/db/migrate/20151218172557_drop_import.rb +0 -6
- data/db/migrate/20151222153838_add_default_content_to_exercise.rb +0 -5
- data/db/migrate/20151223014138_change_language_icon_url_into_devicon_id.rb +0 -5
- data/db/migrate/20151224174248_remove_original_id.rb +0 -5
- data/db/migrate/20151229153839_replace_learning_with_type_in_guides.rb +0 -6
- data/db/migrate/20160108191156_rename_extra_code.rb +0 -5
- data/db/migrate/20160108215313_remove_unique_index_from_users.rb +0 -5
- data/db/migrate/20160119024542_add_preface_to_tenant.rb +0 -5
- data/db/migrate/20160119040351_rename_tenant_to_book.rb +0 -5
- data/db/migrate/20160119191508_rename_position_to_number.rb +0 -6
- data/db/migrate/20160120171336_add_type_to_event_suscriber.rb +0 -5
- data/db/migrate/20160205184243_add_bibliotheca_id_to_exercise.rb +0 -5
- data/db/migrate/20160214191548_required_bibliotheca_id.rb +0 -5
- data/db/migrate/20160222165337_add_hidden_flag_to_extra_code.rb +0 -5
- data/db/migrate/20160222192958_rename_chapter_guide_to_lesson.rb +0 -5
- data/db/migrate/20160307184203_add_prompt_to_language.rb +0 -5
- data/db/migrate/20160331210507_add_comment_model.rb +0 -13
- data/db/migrate/20160401142104_add_readed_to_comment.rb +0 -5
- data/db/migrate/20160404214826_change_readed_to_read.rb +0 -5
- data/db/migrate/20160405184624_change_submission_id_to_string.rb +0 -5
- data/db/migrate/20160412193123_change_content_comment_to_text.rb +0 -5
- data/db/migrate/20160414150800_remove_tenant_subscriber.rb +0 -5
- data/db/migrate/20160426171156_add_new_expectations_to_exercise.rb +0 -5
- data/db/migrate/20160427195306_create_organizations.rb +0 -12
- data/db/migrate/20160427223805_add_chapter_book.rb +0 -5
- data/db/migrate/20160427234538_create_topics.rb +0 -11
- data/db/migrate/20160427235605_add_topic_to_chapter.rb +0 -5
- data/db/migrate/20160428162753_add_topic_id_to_lesson.rb +0 -5
- data/db/migrate/20160428175230_create_exams.rb +0 -10
- data/db/migrate/20160428224823_add_duration_to_exam.rb +0 -5
- data/db/migrate/20160429174901_add_start_end_time_to_exam.rb +0 -6
- data/db/migrate/20160429181825_add_exam_user.rb +0 -8
- data/db/migrate/20160430225048_create_complements.rb +0 -10
- data/db/migrate/20160430231035_remove_chapter_lesson.rb +0 -5
- data/db/migrate/20160430235331_remove_chapter_name_description.rb +0 -6
- data/db/migrate/20160430235656_remove_chapter_locale_image_url.rb +0 -6
- data/db/migrate/20160501003355_add_long_description_to_topic.rb +0 -5
- data/db/migrate/20160501071847_create_usages.rb +0 -11
- data/db/migrate/20160506012945_add_slug_to_topic_and_book.rb +0 -9
- data/db/migrate/20160506035230_remove_slug_from_lesson.rb +0 -5
- data/db/migrate/20160506041446_rename_preface_to_description.rb +0 -5
- data/db/migrate/20160506172239_remove_event_subscriber.rb +0 -5
- data/db/migrate/20160506175610_remove_api_tokens.rb +0 -5
- data/db/migrate/20160506181152_remove_admin_user.rb +0 -5
- data/db/migrate/20160506182333_remove_admin_comments.rb +0 -5
- data/db/migrate/20160510183137_add_private_to_organization.rb +0 -5
- data/db/migrate/20160512134321_add_organization_image.rb +0 -5
- data/db/migrate/20160516191936_add_stateful_console_to_language.rb +0 -5
- data/db/migrate/20160517215229_add_classroom_idto_exams.rb +0 -6
- data/db/migrate/20160518212552_rename_exam_users_to_exam_authorization.rb +0 -5
- data/db/migrate/20160518213912_add_user_start_data_in_exam.rb +0 -6
- data/db/migrate/20160519045220_add_id_to_exam_authorizations.rb +0 -5
- data/db/migrate/20160520141716_remove_chapter_links_and_long_description.rb +0 -6
- data/db/migrate/20160520153115_change_exam_classroom_id_to_string.rb +0 -5
- data/db/migrate/20160526172026_remove_not_null_constraint_exam_duration.rb +0 -6
- data/db/migrate/20160526182119_add_metadata_to_user.rb +0 -5
- data/db/migrate/20160617175235_add_last_organization_to_user.rb +0 -5
- data/db/migrate/20160617195350_change_metadata_to_text.rb +0 -5
- data/db/migrate/20160701195105_add_login_methods_to_organization.rb +0 -5
- data/db/migrate/20160705160244_add_manual_evaluation_to_exercise.rb +0 -5
- data/db/migrate/20160715001254_rename_test_runner_url.rb +0 -5
- data/db/migrate/20160729194600_change_default_content_to_text.rb +0 -5
- data/db/migrate/20160812003350_change_default_login_methods.rb +0 -5
- data/db/migrate/20160815225314_rename_long_description_to_appendix.rb +0 -5
- data/db/migrate/20160819181024_make_organization_private_by_default.rb +0 -5
- data/db/migrate/20160830160937_add_authoring_information_to_guide.rb +0 -6
- data/db/migrate/20160907010315_remove_exercise_slug.rb +0 -5
- data/db/migrate/20161004202742_add_editor_to_problem.rb +0 -6
- data/db/migrate/20161018142147_add_language_extension.rb +0 -5
- data/db/migrate/20161107171305_remove_devicon_column_from_language.rb +0 -5
- data/db/migrate/20161222182015_rename_uid_to_social_id.rb +0 -5
- data/db/migrate/20161222182724_add_uid_to_user.rb +0 -5
- data/db/migrate/20161226181932_remove_metadata_from_users.rb +0 -5
- data/db/migrate/20161230055953_add_not_null_constraint_to_uid_in_user.rb +0 -5
- data/db/migrate/20161231224116_add_permissions_to_user.rb +0 -5
- data/db/migrate/20170125185012_add_new_fields_on_organization.rb +0 -15
- data/db/migrate/20170207154702_add_index_to_uid.rb +0 -5
- data/db/migrate/20170224040846_create_invitations.rb +0 -11
- data/db/migrate/20170224061531_make_tos_type_text.rb +0 -5
- data/db/migrate/20170301160253_rename_invitation_slug_to_code.rb +0 -5
- data/db/migrate/20170330145157_rename_comment_to_messages.rb +0 -6
- data/db/migrate/20170407190910_add_has_messages_flag_to_assignment.rb +0 -5
- data/db/migrate/20170526191251_add_community_link_to_organizations.rb +0 -5
- data/db/migrate/20170526204944_add_has_messages_to_organizations.rb +0 -5
- data/db/migrate/20170601181759_rename_has_messages_to_raise_hand_enabled_in_organization.rb +0 -5
- data/db/migrate/20170608033403_remove_has_messages_from_assignment.rb +0 -5
- data/db/migrate/20170608044038_remove_messages_exercise_id.rb +0 -5
- data/db/migrate/20170608154055_remove_message_type_column.rb +0 -5
- data/db/migrate/20170612173212_add_first_name_and_last_name_to_user.rb +0 -6
- data/db/migrate/20170621222902_introduce_settings_and_themes.rb +0 -40
- data/db/migrate/20170818185127_add_guide_slug_constraint.rb +0 -5
- data/db/migrate/20170830020507_change_invitation_expiration_date_type.rb +0 -5
- data/db/migrate/20171003204152_add_goal_to_exercise.rb +0 -5
- data/db/migrate/20171003204209_add_queries_to_assignment.rb +0 -6
- data/db/migrate/20171004134607_add_triable_to_language.rb +0 -5
- data/db/migrate/20171024182244_add_devicon_and_comment_type_to_language.rb +0 -6
- data/db/migrate/20171109181818_add_manual_evaluation_commend_and_submission_id_index_in_assignment.rb +0 -6
- data/db/migrate/20171229042201_add_assets_to_language.rb +0 -9
- data/db/migrate/20180117014110_add_custom_editor_assets_to_language.rb +0 -13
- data/db/migrate/20180123174410_add_initial_and_final_states_to_exercises.rb +0 -6
- data/db/migrate/20180123180836_add_accepts_reminders_to_users.rb +0 -5
- data/db/migrate/20180129142749_add_api_client.rb +0 -11
- data/db/migrate/20180130194923_add_last_reminded_date_to_users.rb +0 -5
- data/db/migrate/20180130204935_add_course.rb +0 -16
- data/db/migrate/20180307150148_add_failed_submissions_count_to_assignments.rb +0 -5
- data/db/migrate/20180323125804_remove_user_name.rb +0 -5
- data/db/migrate/20180323140943_remove_unused_omniauth_fields.rb +0 -7
- data/db/migrate/20180326224511_remove_book_ids.rb +0 -5
- data/db/migrate/20180402015405_remove_course_uid.rb +0 -5
- data/db/migrate/20180504173548_create_discussions.rb +0 -12
- data/db/migrate/20180504185845_add_discussion_id_to_message.rb +0 -5
- data/db/migrate/20180526141344_add_tips_rules_to_exercise.rb +0 -5
- data/db/migrate/20180605143727_add_submission_to_discussion.rb +0 -16
- data/db/migrate/20180611190239_add_randomizations_to_exercises.rb +0 -5
- data/db/migrate/20180619182555_create_subscriptions.rb +0 -9
- data/db/migrate/20180702153442_create_upvotes.rb +0 -8
- data/db/migrate/20180702175220_add_upvotes_count_to_discussions.rb +0 -5
- data/db/migrate/20180704150839_rename_assignment_status_to_submission_status.rb +0 -5
- data/db/migrate/20180725145801_add_submissions_caps_to_exams.rb +0 -6
- data/db/migrate/20180802190437_add_approved_to_messages.rb +0 -5
- data/db/migrate/20181004173216_add_free_form_editor_to_exercises.rb +0 -5
- data/db/migrate/20181014233438_remove_non_null_constraint_from_permissions.rb +0 -5
- data/db/migrate/20181101180652_add_unique_index_to_organizations_name.rb +0 -5
- data/db/seeds/users.rb +0 -3
- data/lib/mumuki/laboratory/evaluation.rb +0 -5
- data/lib/mumuki/laboratory/evaluation/automated.rb +0 -5
- data/lib/mumuki/laboratory/evaluation/manual.rb +0 -5
- data/lib/mumuki/laboratory/exceptions.rb +0 -5
- data/lib/mumuki/laboratory/exceptions/blocked_forum_error.rb +0 -2
- data/lib/mumuki/laboratory/exceptions/forbidden_error.rb +0 -2
- data/lib/mumuki/laboratory/exceptions/gone_error.rb +0 -2
- data/lib/mumuki/laboratory/exceptions/not_found_error.rb +0 -2
- data/lib/mumuki/laboratory/exceptions/unauthorized_error.rb +0 -2
- data/lib/mumuki/laboratory/extensions/array.rb +0 -11
- data/lib/mumuki/laboratory/extensions/string.rb +0 -29
- data/lib/mumuki/laboratory/file.rb +0 -18
- data/lib/mumuki/laboratory/locales/activerecord.en.yml +0 -13
- data/lib/mumuki/laboratory/locales/activerecord.es.yml +0 -42
- data/lib/mumuki/laboratory/locales/narrator.en.yml +0 -14
- data/lib/mumuki/laboratory/locales/narrator.es.yml +0 -14
- data/lib/mumuki/laboratory/locales/narrator.pt.yml +0 -14
- data/lib/mumuki/laboratory/mumukit/auth.rb +0 -6
- data/lib/mumuki/laboratory/mumukit/login.rb +0 -4
- data/lib/mumuki/laboratory/mumukit/nuntius.rb +0 -6
- data/lib/mumuki/laboratory/mumukit/platform.rb +0 -34
- data/lib/mumuki/laboratory/seed.rb +0 -33
- data/lib/mumuki/laboratory/status.rb +0 -72
- data/lib/mumuki/laboratory/status/discussion/closed.rb +0 -15
- data/lib/mumuki/laboratory/status/discussion/discussion.rb +0 -44
- data/lib/mumuki/laboratory/status/discussion/opened.rb +0 -31
- data/lib/mumuki/laboratory/status/discussion/pending_review.rb +0 -15
- data/lib/mumuki/laboratory/status/discussion/solved.rb +0 -19
- data/lib/mumuki/laboratory/status/submission/aborted.rb +0 -11
- data/lib/mumuki/laboratory/status/submission/errored.rb +0 -19
- data/lib/mumuki/laboratory/status/submission/failed.rb +0 -15
- data/lib/mumuki/laboratory/status/submission/manual_evaluation_pending.rb +0 -15
- data/lib/mumuki/laboratory/status/submission/passed.rb +0 -11
- data/lib/mumuki/laboratory/status/submission/passed_with_warnings.rb +0 -15
- data/lib/mumuki/laboratory/status/submission/pending.rb +0 -11
- data/lib/mumuki/laboratory/status/submission/running.rb +0 -15
- data/lib/mumuki/laboratory/status/submission/submission.rb +0 -38
- data/lib/tasks/guides.rake +0 -11
- data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -8
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/inflections.rb +0 -16
- data/spec/dummy/config/initializers/mime_types.rb +0 -4
data/spec/api_helper.rb
ADDED
@@ -15,6 +15,6 @@ describe ExerciseConfirmationsController, organization_workspace: :test do
|
|
15
15
|
before { post :create, params: { exercise_id: reading.id } }
|
16
16
|
|
17
17
|
it { expect(response.status).to eq 200 }
|
18
|
-
it { expect(response.body
|
18
|
+
it { expect(response.body).to json_like(guide_finished_by_solution: true, class_for_progress_list_item: 'progress-list-item text-center success active') }
|
19
19
|
end
|
20
20
|
end
|
@@ -30,23 +30,23 @@ describe Api::OrganizationsController, type: :controller, organization_workspace
|
|
30
30
|
let!(:another_private_organization) { create :organization, name: 'another_private', public: false }
|
31
31
|
|
32
32
|
context 'GET /organizations' do
|
33
|
+
let(:organization_names) { JSON.parse(response.body)['organizations'].map { |it| it['name'] } }
|
34
|
+
|
33
35
|
context 'with wildcard permissions' do
|
34
36
|
before { get :index }
|
35
37
|
let(:api_client) { create :api_client, role: :janitor, grant: '*' }
|
36
|
-
let!(:body) { response.body.parse_json }
|
37
38
|
|
38
39
|
it { check_status! 200 }
|
39
40
|
|
40
|
-
it { expect(
|
41
|
+
it { expect(organization_names).to contain_exactly 'base', 'public', 'dot.org', 'private', 'another_private' }
|
41
42
|
end
|
42
43
|
context 'with non-wildcard permissions' do
|
43
44
|
before { get :index }
|
44
45
|
let(:api_client) { create :api_client, role: :janitor, grant: 'public/*:private/*' }
|
45
|
-
let!(:body) { response.body.parse_json }
|
46
46
|
|
47
47
|
it { check_status! 200 }
|
48
48
|
|
49
|
-
it { expect(
|
49
|
+
it { expect(organization_names).to contain_exactly 'public', 'private' }
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -87,7 +87,7 @@ describe Api::OrganizationsController, type: :controller, organization_workspace
|
|
87
87
|
let(:api_client) { create :api_client, role: :janitor, grant: 'private/*' }
|
88
88
|
|
89
89
|
it { check_status! 200 }
|
90
|
-
it { expect(response.body
|
90
|
+
it { expect(response.body).to json_like(private_organization.to_resource_h) }
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -115,7 +115,7 @@ describe Api::OrganizationsController, type: :controller, organization_workspace
|
|
115
115
|
let(:organization) { Organization.find_by name: 'a-name' }
|
116
116
|
|
117
117
|
it { check_status! 200 }
|
118
|
-
it { expect(response.body
|
118
|
+
it { expect(response.body).to json_like(organization.to_resource_h) }
|
119
119
|
it { expect(Organization.count).to eq 2 }
|
120
120
|
it { expect(organization.name).to eq 'a-name' }
|
121
121
|
it { expect(organization.contact_email).to eq 'an_email@gmail.com' }
|
@@ -170,7 +170,7 @@ describe Api::OrganizationsController, type: :controller, organization_workspace
|
|
170
170
|
end
|
171
171
|
|
172
172
|
it { check_status! 400 }
|
173
|
-
it { expect(response.body
|
173
|
+
it { expect(response.body).to json_eq expected_errors }
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
@@ -205,7 +205,7 @@ describe Api::OrganizationsController, type: :controller, organization_workspace
|
|
205
205
|
before { put :update, params: {id: organization.name, organization: update_json} }
|
206
206
|
|
207
207
|
it { check_status! 200 }
|
208
|
-
it { expect(response.body
|
208
|
+
it { expect(response.body).to json_like(
|
209
209
|
book: book.slug,
|
210
210
|
name: "existing-organization",
|
211
211
|
profile: {
|
@@ -25,13 +25,13 @@ describe Api::UsersController, type: :controller, organization_workspace: :base
|
|
25
25
|
before { post :create, params: {user: user_json} }
|
26
26
|
|
27
27
|
it { expect(response.status).to eq 200 }
|
28
|
-
it { expect(response.body
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
it { expect(response.body).to json_like({uid: 'foo@bar.com',
|
29
|
+
first_name: 'foo',
|
30
|
+
last_name: 'bar',
|
31
|
+
email: 'foo@bar.com',
|
32
|
+
permissions: {'student' => 'test/bar'},
|
33
|
+
image_url: 'user_shape.png'},
|
34
|
+
except: [:id, :created_at, :updated_at]) }
|
35
35
|
it { expect(User.count).to eq 2 }
|
36
36
|
it { expect(User.last.student? 'test/_').to be true }
|
37
37
|
it { expect(User.last.uid).to eq 'foo@bar.com' }
|
@@ -8,6 +8,10 @@ require "mumuki/laboratory"
|
|
8
8
|
module Dummy
|
9
9
|
class Application < Rails::Application
|
10
10
|
config.load_defaults 5.1
|
11
|
+
|
12
|
+
Mumuki::Domain::Engine.paths['db/migrate'].expanded.each do |expanded_path|
|
13
|
+
config.paths['db/migrate'] << expanded_path
|
14
|
+
end
|
11
15
|
end
|
12
16
|
end
|
13
17
|
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 20181114201620) do
|
14
14
|
|
15
15
|
# These are extensions that must be enabled in order to support this database
|
16
16
|
enable_extension "plpgsql"
|
@@ -51,7 +51,6 @@ ActiveRecord::Schema.define(version: 20181101180652) do
|
|
51
51
|
t.datetime "created_at"
|
52
52
|
t.datetime "updated_at"
|
53
53
|
t.string "locale", default: "en"
|
54
|
-
t.string "contact_email", default: "info@mumuki.org", null: false
|
55
54
|
t.text "description"
|
56
55
|
t.string "slug"
|
57
56
|
t.index ["slug"], name: "index_books_on_slug", unique: true
|
@@ -166,6 +165,7 @@ ActiveRecord::Schema.define(version: 20181101180652) do
|
|
166
165
|
t.text "assistance_rules"
|
167
166
|
t.text "randomizations"
|
168
167
|
t.text "free_form_editor_source"
|
168
|
+
t.text "teacher_info"
|
169
169
|
t.index ["guide_id"], name: "index_exercises_on_guide_id"
|
170
170
|
t.index ["language_id"], name: "index_exercises_on_language_id"
|
171
171
|
end
|
@@ -184,7 +184,10 @@ ActiveRecord::Schema.define(version: 20181101180652) do
|
|
184
184
|
t.string "slug", default: "", null: false
|
185
185
|
t.integer "type", default: 0, null: false
|
186
186
|
t.text "authors"
|
187
|
-
t.text "
|
187
|
+
t.text "collaborators"
|
188
|
+
t.string "id_format", default: "%05d"
|
189
|
+
t.boolean "private", default: false
|
190
|
+
t.text "teacher_info"
|
188
191
|
t.index ["name"], name: "index_guides_on_name"
|
189
192
|
t.index ["slug"], name: "index_guides_on_slug", unique: true
|
190
193
|
end
|
@@ -218,6 +221,8 @@ ActiveRecord::Schema.define(version: 20181101180652) do
|
|
218
221
|
t.string "editor_js_urls", default: [], array: true
|
219
222
|
t.string "editor_html_urls", default: [], array: true
|
220
223
|
t.string "editor_css_urls", default: [], array: true
|
224
|
+
t.string "test_extension"
|
225
|
+
t.text "test_template"
|
221
226
|
t.index ["name"], name: "index_languages_on_name", unique: true
|
222
227
|
end
|
223
228
|
|
data/spec/dummy/db/seeds.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'mumuki/
|
1
|
+
require 'mumuki/domain/seed'
|
2
2
|
|
3
|
-
Mumuki::
|
4
|
-
Mumuki::
|
3
|
+
Mumuki::Domain::Seed.import_languages!
|
4
|
+
Mumuki::Domain::Seed.import_main_contents!
|
5
5
|
|
6
6
|
Organization.find_or_create_by!(name: 'base') do |org|
|
7
7
|
org.contact_email = 'issues@mumuki.org'
|
@@ -17,3 +17,7 @@ Organization.find_or_create_by!(name: 'private') do |org|
|
|
17
17
|
end
|
18
18
|
|
19
19
|
Organization.find_or_create_by!(name: 'central')
|
20
|
+
|
21
|
+
User.find_or_create_by!(uid: 'dev.student@mumuki.org') { |org| org.permissions = {student: 'central/*'} }
|
22
|
+
User.find_or_create_by!(uid: 'dev.teacher@mumuki.org') { |org| org.permissions = {teacher: 'private/*'} }
|
23
|
+
User.find_or_create_by!(uid: 'dev.owner@mumuki.org') { |org| org.permissions = {owner: '*/*'} }
|
data/spec/evaluation_helper.rb
CHANGED
@@ -18,6 +18,8 @@ feature 'private org' do
|
|
18
18
|
])
|
19
19
|
]) }
|
20
20
|
|
21
|
+
let!(:current_organization) { Organization.current }
|
22
|
+
|
21
23
|
before { reindex_current_organization! }
|
22
24
|
|
23
25
|
|
@@ -56,10 +58,10 @@ feature 'private org' do
|
|
56
58
|
|
57
59
|
visit '/'
|
58
60
|
|
59
|
-
expect(student.reload.last_organization).to eq
|
61
|
+
expect(student.reload.last_organization).to eq current_organization
|
60
62
|
expect(page).to have_text('powered by mumuki')
|
61
|
-
expect(page).to have_text(
|
62
|
-
expect(page).to have_text(
|
63
|
+
expect(page).to have_text(current_organization.description)
|
64
|
+
expect(page).to have_text(current_organization.book.description)
|
63
65
|
end
|
64
66
|
|
65
67
|
scenario 'teacher should access' do
|
@@ -67,10 +69,10 @@ feature 'private org' do
|
|
67
69
|
|
68
70
|
visit '/'
|
69
71
|
|
70
|
-
expect(teacher.reload.last_organization).to eq
|
72
|
+
expect(teacher.reload.last_organization).to eq current_organization
|
71
73
|
expect(page).to have_text('powered by mumuki')
|
72
|
-
expect(page).to have_text(
|
73
|
-
expect(page).to have_text(
|
74
|
+
expect(page).to have_text(current_organization.description)
|
75
|
+
expect(page).to have_text(current_organization.book.description)
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
@@ -7,7 +7,8 @@ feature 'public org', organization_workspace: :test do
|
|
7
7
|
let!(:chapter) {
|
8
8
|
create(:chapter, lessons: [
|
9
9
|
create(:lesson, guide: guide)]) }
|
10
|
-
let(:
|
10
|
+
let!(:current_organization) { Organization.current }
|
11
|
+
let(:book) { current_organization.book }
|
11
12
|
|
12
13
|
before { reindex_current_organization! }
|
13
14
|
|
@@ -18,7 +19,7 @@ feature 'public org', organization_workspace: :test do
|
|
18
19
|
visit '/'
|
19
20
|
|
20
21
|
expect(page).to have_text('ム mumuki')
|
21
|
-
expect(page).to have_text(
|
22
|
+
expect(page).to have_text(current_organization.book.name)
|
22
23
|
expect(page).not_to have_text('Exams')
|
23
24
|
end
|
24
25
|
|
@@ -28,7 +29,7 @@ feature 'public org', organization_workspace: :test do
|
|
28
29
|
visit '/'
|
29
30
|
|
30
31
|
expect(page).to have_text('ム mumuki')
|
31
|
-
expect(page).to have_text(
|
32
|
+
expect(page).to have_text(current_organization.book.name)
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
@@ -43,8 +44,8 @@ feature 'public org', organization_workspace: :test do
|
|
43
44
|
visit '/'
|
44
45
|
|
45
46
|
expect(page).to have_text('ム mumuki')
|
46
|
-
expect(page).to have_text(
|
47
|
-
expect(user.reload.last_organization).to eq
|
47
|
+
expect(page).to have_text(current_organization.book.name)
|
48
|
+
expect(user.reload.last_organization).to eq current_organization
|
48
49
|
expect(page).to have_text('Exams')
|
49
50
|
end
|
50
51
|
|
@@ -54,8 +55,8 @@ feature 'public org', organization_workspace: :test do
|
|
54
55
|
visit '/'
|
55
56
|
|
56
57
|
expect(page).to have_text('ム mumuki')
|
57
|
-
expect(page).to have_text(
|
58
|
-
expect(user.reload.last_organization).to eq
|
58
|
+
expect(page).to have_text(current_organization.book.name)
|
59
|
+
expect(user.reload.last_organization).to eq current_organization
|
59
60
|
end
|
60
61
|
end
|
61
62
|
end
|
@@ -84,8 +84,9 @@ feature 'Standard Flow', organization_workspace: :test do
|
|
84
84
|
end
|
85
85
|
|
86
86
|
scenario 'visit messages tab' do
|
87
|
+
Organization.find_by_name('test').switch!
|
87
88
|
problem.submit_solution! user, {content: 'something'}
|
88
|
-
Message.
|
89
|
+
Message.import_from_resource_h! message
|
89
90
|
visit "/user#messages"
|
90
91
|
|
91
92
|
expect(page).to_not have_text('It seems you don\'t have any messages yet!')
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Mumukit::Login.configure do |config|
|
2
|
+
config.auth0 = struct
|
3
|
+
config.saml = struct
|
4
|
+
|
5
|
+
config.mucookie_domain = '.localmumuki.io'
|
6
|
+
config.mucookie_secret_key = 'abcde1213456123456'
|
7
|
+
config.mucookie_secret_salt = 'mucookie test secret salt'
|
8
|
+
config.mucookie_sign_salt = 'mucookie test sign salt'
|
9
|
+
end
|
10
|
+
|
11
|
+
OmniAuth.config.test_mode = true
|
12
|
+
OmniAuth.config.mock_auth[:developer] =
|
13
|
+
OmniAuth::AuthHash.new provider: 'developer',
|
14
|
+
uid: 'johndoe@test.com',
|
15
|
+
credentials: {},
|
16
|
+
info: {first_name: 'John', last_name: 'Doe', name: 'John Doe', nickname: 'johndoe'}
|
17
|
+
|
18
|
+
def set_current_user!(user)
|
19
|
+
allow_any_instance_of(ApplicationController).to receive(:current_user_uid).and_return(user.uid)
|
20
|
+
end
|
@@ -12,21 +12,21 @@ describe Book, organization_workspace: :test do
|
|
12
12
|
|
13
13
|
let(:book) { Organization.current.book }
|
14
14
|
|
15
|
-
let(:
|
15
|
+
let(:book_resource_h) do
|
16
16
|
{name: 'sample book',
|
17
17
|
description: 'a sample book description',
|
18
18
|
slug: 'mumuki/mumuki-sample-book',
|
19
19
|
locale: 'en',
|
20
20
|
chapters: [topic_1.slug, topic_2.slug],
|
21
21
|
complements: complement_slugs,
|
22
|
-
}
|
22
|
+
}
|
23
23
|
end
|
24
24
|
|
25
|
-
describe '#
|
25
|
+
describe '#import_from_resource_h!' do
|
26
26
|
context 'when complements are present' do
|
27
27
|
let(:complement_slugs) { [guide_2.slug, guide_1.slug] }
|
28
28
|
|
29
|
-
before { book.
|
29
|
+
before { book.import_from_resource_h!(book_resource_h) }
|
30
30
|
|
31
31
|
it { expect(book.name).to eq 'sample book' }
|
32
32
|
it { expect(book.description).to eq 'a sample book description' }
|
@@ -41,7 +41,7 @@ describe Book, organization_workspace: :test do
|
|
41
41
|
context 'when complements are not present' do
|
42
42
|
let(:complement_slugs) { ['foo/bar', guide_1.slug] }
|
43
43
|
|
44
|
-
before { book.
|
44
|
+
before { book.import_from_resource_h!(book_resource_h) }
|
45
45
|
|
46
46
|
it { expect(book.complements.count).to eq 1 }
|
47
47
|
end
|
data/spec/models/course_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe 'CourseChanged', organization_workspace: :test do
|
|
10
10
|
description: 'test course'}
|
11
11
|
end
|
12
12
|
|
13
|
-
let!(:course) { Course.
|
13
|
+
let!(:course) { Course.import_from_resource_h! course_json }
|
14
14
|
|
15
15
|
it { expect(course.organization.courses).to include course }
|
16
16
|
it { expect(course.organization.name).to eq 'test' }
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe '#
|
3
|
+
describe '#to_resource_h', organization_workspace: :test do
|
4
4
|
describe Assignment do
|
5
5
|
let(:user) {
|
6
6
|
create(:user,
|
@@ -30,7 +30,7 @@ describe '#as_platform_json', organization_workspace: :test do
|
|
30
30
|
|
31
31
|
it { expect(lesson.number).to eq 4 }
|
32
32
|
it do
|
33
|
-
expect(assignment.
|
33
|
+
expect(assignment.to_resource_h).to json_like(
|
34
34
|
status: :passed,
|
35
35
|
result: nil,
|
36
36
|
expectation_results: [],
|
@@ -89,7 +89,7 @@ describe '#as_platform_json', organization_workspace: :test do
|
|
89
89
|
submission_id: 'abcd1234',
|
90
90
|
exercise: exercise) }
|
91
91
|
it do
|
92
|
-
expect(assignment.
|
92
|
+
expect(assignment.to_resource_h).to json_like(
|
93
93
|
status: :passed,
|
94
94
|
result: nil,
|
95
95
|
expectation_results: [],
|
@@ -144,7 +144,7 @@ describe '#as_platform_json', organization_workspace: :test do
|
|
144
144
|
exercise: exercise) }
|
145
145
|
|
146
146
|
it do
|
147
|
-
expect(assignment.
|
147
|
+
expect(assignment.to_resource_h).to json_like(
|
148
148
|
status: :passed,
|
149
149
|
result: nil,
|
150
150
|
expectation_results: [],
|
data/spec/models/exam_spec.rb
CHANGED
@@ -7,11 +7,11 @@ describe Exam, organization_workspace: :test do
|
|
7
7
|
describe '#upsert' do
|
8
8
|
let(:guide) { create(:guide) }
|
9
9
|
let(:exam_json) { {eid: '1', slug: guide.slug, start_time: 5.minutes.ago, end_time: 10.minutes.since, duration: 150, language: 'haskell', name: 'foo', uids: [], organization: 'test'} }
|
10
|
-
let!(:exam) { Exam.
|
10
|
+
let!(:exam) { Exam.import_from_resource_h! exam_json }
|
11
11
|
context 'when new exam and the guide is the same' do
|
12
12
|
let(:guide2) { create(:guide) }
|
13
13
|
let(:exam_json2) { {eid: '2', slug: guide.slug, start_time: 5.minutes.ago, end_time: 10.minutes.since, duration: 150, language: 'haskell', name: 'foo', uids: [], organization: 'test'} }
|
14
|
-
let!(:exam2) { Exam.
|
14
|
+
let!(:exam2) { Exam.import_from_resource_h! exam_json2 }
|
15
15
|
context 'and the organization is the same' do
|
16
16
|
it { expect(Exam.count).to eq 1 }
|
17
17
|
it { expect(Usage.where(item_id: guide.id, parent_item_id: exam.id).count).to eq 0 }
|
@@ -28,7 +28,7 @@ describe Exam, organization_workspace: :test do
|
|
28
28
|
it { expect(exam.enabled?).to be false }
|
29
29
|
|
30
30
|
context 'not authorized' do
|
31
|
-
it { expect { exam.validate_accessible_for! user }.to raise_error(Mumuki::
|
31
|
+
it { expect { exam.validate_accessible_for! user }.to raise_error(Mumuki::Domain::ForbiddenError) }
|
32
32
|
end
|
33
33
|
|
34
34
|
context 'authorized' do
|
@@ -42,14 +42,14 @@ describe Exam, organization_workspace: :test do
|
|
42
42
|
it { expect(exam.enabled?).to be true }
|
43
43
|
|
44
44
|
context 'not authorized' do
|
45
|
-
it { expect { exam.validate_accessible_for! user }.to raise_error(Mumuki::
|
45
|
+
it { expect { exam.validate_accessible_for! user }.to raise_error(Mumuki::Domain::ForbiddenError) }
|
46
46
|
end
|
47
47
|
|
48
48
|
context 'authorized' do
|
49
49
|
before { exam.authorize! user }
|
50
50
|
|
51
51
|
it { expect { exam.validate_accessible_for! user }.to_not raise_error }
|
52
|
-
it { expect { exam.validate_accessible_for! other_user }.to raise_error(Mumuki::
|
52
|
+
it { expect { exam.validate_accessible_for! other_user }.to raise_error(Mumuki::Domain::ForbiddenError) }
|
53
53
|
end
|
54
54
|
|
55
55
|
context 'import_from_json' do
|
@@ -58,7 +58,7 @@ describe Exam, organization_workspace: :test do
|
|
58
58
|
let(:guide) { create(:guide) }
|
59
59
|
let(:duration) { 150 }
|
60
60
|
let(:exam_json) { {eid: '1', slug: guide.slug, start_time: 5.minutes.ago, end_time: 10.minutes.since, duration: duration, language: 'haskell', name: 'foo', uids: [user.uid], organization: 'test'} }
|
61
|
-
before { Exam.
|
61
|
+
before { Exam.import_from_resource_h! exam_json }
|
62
62
|
|
63
63
|
context 'new exam' do
|
64
64
|
it { expect(Exam.count).to eq 1 }
|
@@ -73,10 +73,10 @@ describe Exam, organization_workspace: :test do
|
|
73
73
|
|
74
74
|
context 'existing exam' do
|
75
75
|
let(:exam_json2) { {eid: '1', slug: guide.slug, start_time: 5.minutes.ago, end_time: 10.minutes.since, duration: 150, language: 'haskell', name: 'foo', uids: [user2.uid], organization: 'test'} }
|
76
|
-
before { Exam.
|
76
|
+
before { Exam.import_from_resource_h! exam_json2 }
|
77
77
|
|
78
78
|
it { expect(Exam.count).to eq 1 }
|
79
|
-
it { expect { Exam.find_by(classroom_id: '1').validate_accessible_for! user }.to raise_error(Mumuki::
|
79
|
+
it { expect { Exam.find_by(classroom_id: '1').validate_accessible_for! user }.to raise_error(Mumuki::Domain::ForbiddenError) }
|
80
80
|
it { expect { Exam.find_by(classroom_id: '1').validate_accessible_for! user2 }.to_not raise_error }
|
81
81
|
end
|
82
82
|
end
|
@@ -85,7 +85,7 @@ describe Exam, organization_workspace: :test do
|
|
85
85
|
let(:user) { create(:user, uid: 'auth0|1') }
|
86
86
|
let(:guide) { create(:guide) }
|
87
87
|
let(:exam_json) { {eid: '1', slug: guide.slug, start_time: 5.minutes.ago, end_time: 10.minutes.since, duration: duration, language: 'haskell', name: 'foo', uids: [user.uid], organization: 'test'} }
|
88
|
-
let(:exam) { Exam.
|
88
|
+
let(:exam) { Exam.import_from_resource_h! exam_json }
|
89
89
|
before { exam.start! user }
|
90
90
|
|
91
91
|
context 'with duration' do
|
@@ -111,9 +111,9 @@ describe Exam, organization_workspace: :test do
|
|
111
111
|
let(:user) { create(:user, uid: 'auth0|1') }
|
112
112
|
let(:guide) { create(:guide) }
|
113
113
|
let(:exam_json) { {eid: '1', slug: guide.slug, start_time: 5.minutes.ago, end_time: 10.minutes.since, duration: 150, language: 'haskell', name: 'foo', uids: [user.uid], organization: 'test'} }
|
114
|
-
let(:exam) { Exam.
|
114
|
+
let(:exam) { Exam.import_from_resource_h! exam_json }
|
115
115
|
before { exam.start! user }
|
116
|
-
before { Exam.
|
116
|
+
before { Exam.import_from_resource_h! exam_json.merge(organization: 'test') }
|
117
117
|
|
118
118
|
it { expect(exam.started?(user)).to be true }
|
119
119
|
|
@@ -122,9 +122,9 @@ describe Exam, organization_workspace: :test do
|
|
122
122
|
context 'create exam with non existing user' do
|
123
123
|
let(:guide) { create(:guide) }
|
124
124
|
let(:exam_json) { {eid: '1', slug: guide.slug, start_time: 5.minutes.ago, end_time: 10.minutes.since, duration: 150, language: 'haskell', name: 'foo', uids: [user.uid], organization: 'test'} }
|
125
|
-
let(:exam) { Exam.
|
125
|
+
let(:exam) { Exam.import_from_resource_h! exam_json }
|
126
126
|
|
127
|
-
it { expect { Exam.
|
127
|
+
it { expect { Exam.import_from_resource_h! exam_json.merge(organization: 'test') }.not_to raise_error }
|
128
128
|
|
129
129
|
end
|
130
130
|
|
@@ -132,7 +132,7 @@ describe Exam, organization_workspace: :test do
|
|
132
132
|
let(:teacher) { create(:user, uid: 'auth0|1') }
|
133
133
|
let(:guide) { create(:guide) }
|
134
134
|
let(:exam_json) { {eid: '1', slug: guide.slug, start_time: 5.minutes.ago, end_time: 10.minutes.since, duration: 150, language: 'haskell', name: 'foo', uids: [], organization: 'test'} }
|
135
|
-
let(:exam) { Exam.
|
135
|
+
let(:exam) { Exam.import_from_resource_h! exam_json }
|
136
136
|
|
137
137
|
context 'exam_authorization do not receive start method' do
|
138
138
|
before { expect(teacher).to receive(:teacher_here?).and_return(true) }
|