mumuki-laboratory 9.17.0 → 9.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/mumuki_laboratory/application/discussions.js +1 -0
  3. data/app/assets/javascripts/mumuki_laboratory/application/timer.js +2 -5
  4. data/app/assets/stylesheets/mumuki_laboratory/application/_layout.scss +0 -8
  5. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_user_profile.scss +1 -9
  6. data/app/assets/stylesheets/mumuki_laboratory/application.scss +0 -1
  7. data/app/controllers/application_controller.rb +1 -2
  8. data/app/controllers/exam_authorization_requests_controller.rb +22 -17
  9. data/app/controllers/exam_registrations_controller.rb +1 -1
  10. data/app/controllers/exercises_controller.rb +0 -1
  11. data/app/helpers/exams_helper.rb +16 -6
  12. data/app/helpers/profile_helper.rb +1 -1
  13. data/app/views/discussions/_message.html.erb +4 -0
  14. data/app/views/exam_registrations/show.html.erb +1 -1
  15. data/app/views/exercises/show.html.erb +1 -1
  16. data/app/views/guides/_guide.html.erb +1 -1
  17. data/app/views/layouts/_timer.html.erb +1 -1
  18. data/app/views/users/_basic_profile_fields.html.erb +20 -16
  19. data/app/views/users/_edit_user_form.html.erb +9 -7
  20. data/lib/mumuki/laboratory/controllers/validate_access_mode.rb +5 -0
  21. data/lib/mumuki/laboratory/locales/en.yml +3 -2
  22. data/lib/mumuki/laboratory/locales/es-CL.yml +3 -2
  23. data/lib/mumuki/laboratory/locales/es.yml +3 -2
  24. data/lib/mumuki/laboratory/locales/pt.yml +3 -2
  25. data/lib/mumuki/laboratory/version.rb +1 -1
  26. data/spec/controllers/exam_authorization_requests_controller_spec.rb +16 -2
  27. data/spec/controllers/exercises_controller_spec.rb +32 -0
  28. data/spec/dummy/db/schema.rb +2 -1
  29. data/spec/dummy/db/seeds.rb +16 -8
  30. data/spec/features/read_only_flow_spec.rb +14 -16
  31. metadata +104 -103
  32. data/app/assets/stylesheets/mumuki_laboratory/application/_alerts.scss +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d420aa36a1219b0a8984fa03062704f55b6227b0f8009ec7fa08b8c67d0780d6
4
- data.tar.gz: 0e0d9d6aab2633b8081464b447a90db3be572ab5ec3f9dad92d77e3824c71ade
3
+ metadata.gz: de7e211f8a772b15e0018a75d15c69f1fd455bf4794362235e236c06bc125d06
4
+ data.tar.gz: 91b6b7564068e6fac29130c62639a17c277d0954fbf3900e07e947ae3cdc6da0
5
5
  SHA512:
6
- metadata.gz: '084ffe85c17ed01338fa6ad45bfb6a24b92ec85c838432626436b216c9486b49babac048883ce1a40dd20336ebdb745bf3182d82c681c2d29b7306f6b9a9e783'
7
- data.tar.gz: bfb035582b7227797d88fc2f66dd9912d6366f32d5b4428cee0e90a9d2c698f3b2989d2c60cf75d51570e3709f10bafb47fcc32db4cc819fd891c29a0a37167c
6
+ metadata.gz: 63dc960e1d91bd05a534d8ded2bfb9cfd13801ee2d3dfcb44da781642bcfa626f0bf80c7df642216bb7915a1ff2f32515668c6bb81b7615221e23ae44a3cd627
7
+ data.tar.gz: 7011fe8f2abadae8c93ac60192c0caa200a475a229183c257ccd74c0818291c9ced49507a75fc15f092405d9c10d8cad269b6723be45eac41dc022a120c7bd6e
@@ -70,6 +70,7 @@ mumuki.load(() => {
70
70
  discussionMessageToggleApprove: function (url, elem) {
71
71
  Forum.discussionPost(url).done(function () {
72
72
  elem.toggleClass("selected");
73
+ elem.attr('data-bs-original-title', '');
73
74
  });
74
75
  },
75
76
  discussionMessageToggleNotActuallyAQuestion: function (url, elem) {
@@ -1,9 +1,6 @@
1
1
  mumuki.startTimer = (() => {
2
- function startTimer(endDate) {
3
- var endTime = new Date(endDate).getTime();
4
- var currentTime = Date.now();
5
- var diffTime = endTime - currentTime;
6
- var duration = moment.duration(diffTime, 'milliseconds');
2
+ function startTimer(seconds) {
3
+ var duration = moment.duration(seconds, 'seconds');
7
4
  var intervalDuration = 1000;
8
5
 
9
6
  var interval = mumuki.setInterval(function () {
@@ -34,14 +34,6 @@
34
34
  background-image: none;
35
35
  }
36
36
 
37
- .alert {
38
- margin: 10px 50px 10px 15px;
39
- }
40
-
41
- .alert-danger a {
42
- color: greenyellow;
43
- }
44
-
45
37
  .exercise-search-box {
46
38
  width: 263px;
47
39
  position: fixed
@@ -7,6 +7,7 @@
7
7
 
8
8
  .mu-profile-actions {
9
9
  margin-left: auto;
10
+ text-align: center;
10
11
 
11
12
  .btn {
12
13
  width: 150px;
@@ -18,15 +19,6 @@
18
19
  border-color: lighten($mu-color-complementary, 15%);
19
20
  }
20
21
  }
21
-
22
- &.mobile {
23
- text-align: center;
24
- margin: 20px 5px -20px -10px;
25
-
26
- .btn {
27
- width: calc(50% - 20px);
28
- }
29
- }
30
22
  }
31
23
 
32
24
  .mu-profile-info {
@@ -13,5 +13,4 @@ $da-font-path: asset-path('assets');
13
13
  @import "application/invitations";
14
14
  @import "application/modules";
15
15
  @import "application/errors";
16
- @import "application/alerts";
17
16
  @import "application/codemirror-themes";
@@ -68,7 +68,7 @@ class ApplicationController < ActionController::Base
68
68
  # ensures contents are accessible to current user
69
69
  def validate_accessible!
70
70
  return if current_user&.teacher_here?
71
- accessible_subject.validate_accessible_for! current_user
71
+ accessible_subject&.validate_accessible_for! current_user
72
72
  end
73
73
 
74
74
  def validate_active_organization!
@@ -129,7 +129,6 @@ class ApplicationController < ActionController::Base
129
129
  def validate_user_profile!
130
130
  unless current_user.profile_completed?
131
131
  save_location_before! :profile_completion
132
- flash[:info] = I18n.t :please_fill_profile_data
133
132
  redirect_to edit_user_path
134
133
  end
135
134
  end
@@ -1,36 +1,41 @@
1
1
  class ExamAuthorizationRequestsController < ApplicationController
2
2
 
3
- before_action :verify_registration_opened!, on: [:create, :update]
3
+ before_action :set_registration!
4
+ before_action :set_exam!
5
+ before_action :verify_registration_opened!
4
6
 
5
7
  def create
6
- authorization_request = ExamAuthorizationRequest.find_or_create_by! create_authorization_request_params do |it|
7
- it.assign_attributes authorization_request_params
8
- end
9
- current_user.read_notification! authorization_request.exam_registration
10
- flash.notice = I18n.t :exam_authorization_request_created
11
- redirect_to root_path
8
+ authorization_request = @registration.request_authorization! current_user, @exam
9
+ current_user.read_notification! @registration
10
+ flash.notice = friendly_flash_notice(:exam_authorization_request_created)
11
+ redirect_to exam_authorizations_user_path
12
12
  end
13
13
 
14
14
  def update
15
- ExamAuthorizationRequest.update params[:id], authorization_request_params
16
- flash.notice = I18n.t :exam_authorization_request_saved
17
- redirect_to root_path
15
+ @registration.update_authorization_request_by_id! params[:id], @exam
16
+ flash.notice = friendly_flash_notice(:exam_authorization_request_saved)
17
+ redirect_to exam_authorizations_user_path
18
18
  end
19
19
 
20
20
  private
21
21
 
22
- def create_authorization_request_params
23
- authorization_request_params.slice :exam_registration_id, :user, :organization
22
+ def friendly_flash_notice(key)
23
+ I18n.t key, friendly_date: helpers.local_time(@exam.start_time)
24
24
  end
25
25
 
26
26
  def authorization_request_params
27
- params
28
- .require(:exam_authorization_request).permit(:exam_id, :exam_registration_id)
29
- .merge(user: current_user, organization: Organization.current)
27
+ params.require(:exam_authorization_request).permit(:exam_id, :exam_registration_id)
28
+ end
29
+
30
+ def set_registration!
31
+ @registration = Organization.current.exam_registrations.find(authorization_request_params[:exam_registration_id])
32
+ end
33
+
34
+ def set_exam!
35
+ @exam = @registration.exams.find(authorization_request_params[:exam_id])
30
36
  end
31
37
 
32
38
  def verify_registration_opened!
33
- exam_registration = ExamRegistration.find(authorization_request_params[:exam_registration_id])
34
- raise Mumuki::Domain::GoneError if exam_registration.ended?
39
+ raise Mumuki::Domain::GoneError if @registration.ended?
35
40
  end
36
41
  end
@@ -1,6 +1,6 @@
1
1
  class ExamRegistrationsController < ApplicationController
2
2
  def show
3
- @registration = ExamRegistration.find(params[:id])
3
+ @registration = Organization.current.exam_registrations.find(params[:id])
4
4
  @authorization_request = @registration.authorization_request_for(current_user)
5
5
  end
6
6
  end
@@ -6,7 +6,6 @@ class ExercisesController < ApplicationController
6
6
 
7
7
  before_action :set_guide!, only: :show
8
8
  before_action :set_assignment!, only: :show, if: :current_user?
9
- before_action :validate_accessible!, only: :show
10
9
  before_action :start!, only: :show
11
10
 
12
11
  def show
@@ -2,12 +2,8 @@ module ExamsHelper
2
2
  def exam_information_for(user, exam)
3
3
  %Q{
4
4
  #{course_information_for(user, exam)}
5
- #{fa_icon('calendar-alt', class: 'fa-fw',
6
- text: "<strong>#{t :date_and_time}:</strong> #{local_time_without_time_zone(exam.start_time)} - #{local_time(exam.end_time)}".html_safe)}
7
- <br>
8
- #{fa_icon(:stopwatch, class: 'fa-fw',
9
- text: "<strong>#{t :available_time}:</strong> #{t :time_in_minutes, time: exam.duration}".html_safe)}
10
- <br>
5
+ #{date_information_for(exam)}
6
+ #{duration_information_for(exam)}
11
7
  }.html_safe
12
8
  end
13
9
 
@@ -20,4 +16,18 @@ module ExamsHelper
20
16
  <br>"
21
17
  end
22
18
  end
19
+
20
+ def date_information_for(exam)
21
+ "#{fa_icon('calendar-alt', class: 'fa-fw',
22
+ text: "<strong>#{t :date_and_time}:</strong> #{local_time_without_time_zone(exam.start_time)} - #{local_time(exam.end_time)}".html_safe)}
23
+ <br>"
24
+ end
25
+
26
+ def duration_information_for(exam)
27
+ if exam.duration?
28
+ "#{fa_icon(:stopwatch, class: 'fa-fw',
29
+ text: "<strong>#{t :available_time}:</strong> #{t :time_in_minutes, time: exam.duration}".html_safe)}
30
+ <br>"
31
+ end
32
+ end
23
33
  end
@@ -4,7 +4,7 @@ module ProfileHelper
4
4
  end
5
5
 
6
6
  def cancel_edit_profile_button
7
- link_to t(:cancel), :user, class: 'btn btn-secondary' if current_user.profile_completed?
7
+ link_to t(:cancel), :user, class: 'btn btn-outline-complementary' if current_user.profile_completed?
8
8
  end
9
9
 
10
10
  def save_edit_profile_button(form)
@@ -13,6 +13,10 @@
13
13
  <% if message.authorized?(current_user) && !message.deleted? %>
14
14
  <% if current_user&.moderator_here? %>
15
15
  <a class="discussion-message-approved <%= 'selected' if message.approved? %>"
16
+ <% if message.approved? && current_user&.forum_supervisor_here? %>
17
+ data-bs-toggle="tooltip" data-bs-placement="left"
18
+ title="<%= t :approved_by, validator: message.approved_by.name, date: local_time(message.approved_at) %>"
19
+ <% end %>
16
20
  onclick="mumuki.Forum.discussionMessageToggleApprove('<%= approve_discussion_message_url(@discussion, message) %>', $(this))">
17
21
  <%= fa_icon(:check, class: 'fa-lg') %>
18
22
  </a>
@@ -25,7 +25,7 @@
25
25
  <%= f.hidden_field :exam_registration_id, value: @registration.id %>
26
26
  <div class="mb-4">
27
27
  <%= f.label :exam_id, t(:exam_registration_choose_exam) %>
28
- <% @registration.exams.each do |exam| %>
28
+ <% @registration.available_exams.each do |exam| %>
29
29
  <div class="form-check">
30
30
  <%= f.radio_button(:exam_id, exam.id, id: exam.id, required: true, class: 'form-check-input mu-read-only-input',
31
31
  checked: @authorization_request.exam_id == exam.id) %>
@@ -9,7 +9,7 @@
9
9
  <% @stats = @exercise.stats_for(current_user) %>
10
10
 
11
11
  <% if @exercise.navigable_parent.timed? && !current_user.teacher? %>
12
- <%= render partial: 'layouts/timer', locals: {end_time: @exercise.navigable_parent.real_end_time(current_user)} %>
12
+ <%= render partial: 'layouts/timer', locals: { duration: @exercise.navigable_parent.time_left(current_user) } %>
13
13
  <% end %>
14
14
 
15
15
  <% unless @exercise.input_kids? %>
@@ -3,7 +3,7 @@
3
3
  <%= render partial: 'layouts/authoring', locals: {guide: @guide} %>
4
4
 
5
5
  <% if subject.timed? && @stats.started? && !current_user.teacher? %>
6
- <%= render partial: 'layouts/timer', locals: {end_time: subject.real_end_time(current_user)} %>
6
+ <%= render partial: 'layouts/timer', locals: { duration: subject.time_left(current_user) } %>
7
7
  <% end %>
8
8
 
9
9
  <%= yield if block_given? %>
@@ -4,7 +4,7 @@
4
4
  <i class="timer timer-text text-center"><%= t :time_left %></i>
5
5
  <i id="timer" class="timer timer-text text-center"></i>
6
6
  <script>
7
- mumuki.startTimer('<%= end_time&.iso8601 %>');
7
+ mumuki.startTimer(<%= duration %>);
8
8
  </script>
9
9
  </div>
10
10
  </div>
@@ -1,19 +1,23 @@
1
- <fieldset>
2
- <div><%= form.label(t :first_name) %></div>
3
- <div><%= form.text_field :first_name, required: true, class: 'form-control' %></div>
4
- </fieldset>
5
- <fieldset>
6
- <div><%= form.label(t :last_name) %></div>
7
- <div><%= form.text_field :last_name, required: true, class: 'form-control' %></div>
8
- </fieldset>
9
- <fieldset>
10
- <div><%= form.label(t :gender) %></div>
11
- <div><%= form.select :gender, options_for_select(User.genders.map { |gender, _| [t(gender), gender] }, @user.gender), {}, required: true, class: 'form-control form-select' %></div>
12
- </fieldset>
13
- <fieldset>
14
- <div><%= form.label(t :birthdate) %></div>
15
- <div><%= form.date_field :birthdate, min: Date.new(1900), max: 3.years.ago.end_of_year, required: true, class: 'form-control' %></div>
16
- </fieldset>
1
+ <div class="row">
2
+ <fieldset class="col-lg-6">
3
+ <div><%= form.label(t :first_name) %></div>
4
+ <div><%= form.text_field :first_name, required: true, class: 'form-control' %></div>
5
+ </fieldset>
6
+ <fieldset class="col-lg-6">
7
+ <div><%= form.label(t :last_name) %></div>
8
+ <div><%= form.text_field :last_name, required: true, class: 'form-control' %></div>
9
+ </fieldset>
10
+ </div>
11
+ <div class="row">
12
+ <fieldset class="col-lg-4">
13
+ <div><%= form.label(t :birthdate) %></div>
14
+ <div><%= form.date_field :birthdate, min: Date.new(1900), max: 3.years.ago.end_of_year, required: true, class: 'form-control' %></div>
15
+ </fieldset>
16
+ <fieldset class="col-lg-4 offset-lg-2">
17
+ <div><%= form.label(t :gender) %></div>
18
+ <div><%= form.select :gender, options_for_select(User.genders.map { |gender, _| [t(gender), gender] }, @user.gender), {}, required: true, class: 'form-control form-select' %></div>
19
+ </fieldset>
20
+ </div>
17
21
  <fieldset>
18
22
  <div><%= form.label(t :email) %></div>
19
23
  <div><%= form.text_field :email, readonly: true, class: 'form-control' %></div>
@@ -1,22 +1,24 @@
1
1
  <%= form_for :user, url: user_path, :html => { id: 'mu-user-form', class: 'mu-form' }, method: :put do |f| %>
2
2
  <div class="mu-user-header">
3
3
  <h1><%= t(:edit_profile) %></h1>
4
- <div class="mu-profile-actions d-none d-md-block">
5
- <%= cancel_edit_profile_button %>
6
- <%= save_edit_profile_button f %>
7
- </div>
8
4
  </div>
9
5
  <div class="row mu-tab-body">
10
- <div class="col-md-6 col-lg-4 mu-user-avatar-container">
6
+ <div class="col-md-6 col-lg-4 mu-user-avatar-container mb-3">
11
7
  <%= profile_picture_for(@user, id: 'mu-user-avatar', class: 'mu-user-avatar') %>
12
8
  <button class="fas fa-pencil-alt fa-2x btn mu-edit-avatar" type="button" data-bs-toggle="modal" data-bs-target="#mu-avatar-picker" tabindex="0"></button>
13
9
  </div>
14
- <div class="col-md-6 col-lg-8">
10
+ <div class="col-md-6 col-lg-8 mb-4">
11
+ <% unless current_user.profile_completed? %>
12
+ <div class="alert alert-info alert-dismissible fade show" role="alert">
13
+ <%= fa_icon 'info-circle', class: 'fa-lg me-2 align-middle', text: t(:please_fill_profile_data) %>
14
+ <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
15
+ </div>
16
+ <% end %>
15
17
  <%= render partial: 'profile_fields', locals: {form: f} %>
16
18
  <%= render partial: 'layouts/terms_acceptance_disclaimer', locals: {user: @user} %>
17
19
  </div>
18
20
  </div>
19
- <div class="mu-profile-actions mobile d-block d-md-none">
21
+ <div class="mu-profile-actions">
20
22
  <%= cancel_edit_profile_button %>
21
23
  <%= save_edit_profile_button f %>
22
24
  </div>
@@ -7,9 +7,14 @@ module Mumuki::Laboratory::Controllers::ValidateAccessMode
7
7
 
8
8
  def validate_accessible!
9
9
  current_access_mode.validate_content_here! subject_container
10
+ super
10
11
  end
11
12
 
12
13
  def subject_container
13
14
  subject
14
15
  end
16
+
17
+ def accessible_subject
18
+ nil
19
+ end
15
20
  end
@@ -13,6 +13,7 @@ en:
13
13
  all: All
14
14
  appendix: Appendix
15
15
  appendix_teaser: Do you want to learn more? <a href="%{link}">Check this chapter's appendix</a>"
16
+ approved_by: Validated by %{validator} at %{date}
16
17
  approved_message: Validated by mentor
17
18
  approved_messages:
18
19
  other: validated
@@ -120,9 +121,9 @@ en:
120
121
  errored: Oops, your solution didn't work
121
122
  exam_authorization_pending_explanation_html: You have until <strong>%{end_time}</strong> (%{location} time) to register. After that date, your request will be processed and you will receive a confirmation. <br> Don't forget to check the notifications!
122
123
  exam_authorization_request_approved_html: Your request was approved, don't forget to log in at <strong>%{date}</strong> (%{location} time). Good luck!
123
- exam_authorization_request_created: Your registration to the exam has been saved!
124
+ exam_authorization_request_created: You registered for the exam on %{friendly_date}
124
125
  exam_authorization_request_rejected: Your request was rejected because you didn't meet the requirements.
125
- exam_authorization_request_saved: Your registration to the exam has been updated!
126
+ exam_authorization_request_saved: You've changed your registration to the exam to %{friendly_date}
126
127
  exam_authorization_request_updated: Your registration to %{description} has been updated
127
128
  exam_registration_choose_exam: Choose date and time to attend to the exam
128
129
  exam_registration_explanation_html: You have until <strong>%{date}</strong> (%{location} time) to register. After that date, your request will be processed and you will receive a confirmation. <br> Don't forget to check the notifications!
@@ -11,6 +11,7 @@ es-CL:
11
11
  and: y
12
12
  appendix: Apéndice
13
13
  appendix_teaser: ¿Quieres saber más? <a href="%{link}">Consulta el apéndice de este capítulo</a>
14
+ approved_by: Validado por %{validator} el %{date}
14
15
  approved_message: Validado por mentorías
15
16
  approved_messages:
16
17
  one: validado
@@ -123,9 +124,9 @@ es-CL:
123
124
  exam_authorization_pending_change_date_html: Tienes tiempo hasta el <strong>%{end_time}</strong> (hora de %{location}) para cambiar el turno haciendo click <strong><a href="%{edit_path}">aquí</a></strong>. Pasada esa fecha, tu solicitud será evaluada y recibirás una confirmación. <br> ¡No olvides revisar las notificaciones!
124
125
  exam_authorization_pending_done_html: Ya te inscribiste a este examen. Luego del <strong>%{end_time}</strong> (hora de %{location}) se evaluará tu solicitud y recibirás una confirmación. <br> ¡No olvides de revisar las notificaciones!
125
126
  exam_authorization_request_approved_html: Tu solicitud fue aprobada, no olvides conectarte el <strong>%{date}</strong> (hora de %{location}). ¡Buena suerte!
126
- exam_authorization_request_created: ¡Tu inscripción al examen se registró exitosamente!
127
+ exam_authorization_request_created: Te has inscripto al examen del día %{friendly_date}
127
128
  exam_authorization_request_rejected: Tu solicitud fue rechazada porque no cumpliste con los requisitos para rendir el examen.
128
- exam_authorization_request_saved: ¡Tu inscripción al examen se modificó exitosamente!
129
+ exam_authorization_request_saved: Has cambiado tu inscripción al examen al día %{friendly_date}
129
130
  exam_authorization_request_updated: Hay novedades sobre tu inscripción a %{description}
130
131
  exam_registration_choose_exam: Seleccioná día y horario en el que te gustaría rendir el examen
131
132
  exam_registration_explanation_html: Tienes tiempo hasta el <strong>%{date}</strong> (hora de %{location}) para inscribirte. Pasada esa fecha, tu solicitud será evaluada y recibirás una confirmación. <br> ¡No olvides revisar las notificaciones!
@@ -14,6 +14,7 @@ es:
14
14
  and: y
15
15
  appendix: Apéndice
16
16
  appendix_teaser: ¿Querés saber más? <a href="%{link}">Consultá el apéndice de este capítulo</a>
17
+ approved_by: Validado por %{validator} el %{date}
17
18
  approved_message: Validado por mentorías
18
19
  approved_messages:
19
20
  one: validado
@@ -130,9 +131,9 @@ es:
130
131
  exam_authorization_pending_change_date_html: Tenés tiempo hasta el <strong>%{end_time}</strong> (hora de %{location}) para cambiar el turno haciendo click <strong><a href="%{edit_path}">acá</a></strong>. Pasada esa fecha, tu solicitud será evaluada y recibirás una confirmación. <br> ¡No te olvides de revisar las notificaciones!
131
132
  exam_authorization_pending_done_html: Ya te inscribiste a este examen. Luego del <strong>%{end_time}</strong> (hora de %{location}) se evaluará tu solicitud y recibirás una confirmación. <br> ¡No te olvides de revisar las notificaciones!
132
133
  exam_authorization_request_approved_html: Tu solicitud fue aprobada, no olvides conectarte el <strong>%{date}</strong> (hora de %{location}). ¡Buena suerte!
133
- exam_authorization_request_created: ¡Tu inscripción al examen se registró exitosamente!
134
+ exam_authorization_request_created: Te inscribiste al examen del día %{friendly_date}
134
135
  exam_authorization_request_rejected: Tu solicitud fue rechazada porque no cumpliste con los requisitos para rendir el examen.
135
- exam_authorization_request_saved: ¡Tu inscripción al examen se modificó exitosamente!
136
+ exam_authorization_request_saved: Cambiaste tu inscripción al examen al día %{friendly_date}
136
137
  exam_authorization_request_updated: Hay novedades sobre tu inscripción a %{description}
137
138
  exam_registration_choose_exam: Seleccioná día y horario en el que te gustaría rendir el examen
138
139
  exam_registration_explanation_html: Tenés tiempo hasta el <strong>%{date}</strong> (hora de %{location}) para inscribirte. Pasada esa fecha, tu solicitud será evaluada y recibirás una confirmación. <br> ¡No te olvides de revisar las notificaciones!
@@ -13,6 +13,7 @@ pt:
13
13
  and: e
14
14
  appendix: Apêndice
15
15
  appendix_teaser: Você quer saber mais? <a href="%{link}"> Consulte o apêndice deste capítulo </a>
16
+ approved_by: Validado pelo %{validator} em %{date}
16
17
  approved_message: Validado pelo mentor
17
18
  approved_messages:
18
19
  one: validado
@@ -123,9 +124,9 @@ pt:
123
124
  errored: Opa! Sua solução não pode ser executada
124
125
  exam_authorization_pending_explanation_html: Você tem tempo até <strong>%{date}</strong> (horário de %{location}) para se inscrever. Após essa data, sua inscrição será avaliada e você receberá uma confirmação. <br> Não se esqueça de verificar as notificações!
125
126
  exam_authorization_request_approved_html: Sua solicitação foi aprovada, não se esqueça de conectar em <strong>%{date}</strong> (horário de %{location}). Boa sorte!
126
- exam_authorization_request_created: Seu registro de exame foi salvo com sucesso!
127
+ exam_authorization_request_created: Você se inscreveu para o exame do dia %{friendly_date}
127
128
  exam_authorization_request_rejected: Sua solicitação foi rejeitada porque você não atendeu aos requisitos.
128
- exam_authorization_request_saved: Seu registro de exame foi modificado com sucesso!
129
+ exam_authorization_request_saved: Você alterou seu registro de exame para o dia %{friendly_date}
129
130
  exam_authorization_request_updated: Há notícias sobre seu registro para %{description}
130
131
  exam_registration_choose_exam: Selecione o dia e a hora em que gostaria de fazer o exame
131
132
  exam_registration_explanation_html: Você tem tempo até <strong>%{date}</strong> (horário de %{location}) para se inscrever. Após essa data, sua inscrição será avaliada e você receberá uma confirmação. <br> Não se esqueça de verificar as notificações!
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Laboratory
3
- VERSION = '9.17.0'
3
+ VERSION = '9.20.0'
4
4
  end
5
5
  end
@@ -3,7 +3,9 @@ require 'spec_helper'
3
3
  describe ExamAuthorizationRequestsController, type: :controller, organization_workspace: :test do
4
4
  let(:user) { create(:user) }
5
5
  let(:exam) { create(:exam) }
6
- let(:exam_registration) { create(:exam_registration, exams: [exam]) }
6
+ let(:exam_id) { exam.id }
7
+ let(:organization) { Organization.current }
8
+ let(:exam_registration) { create(:exam_registration, exams: [exam], organization: organization) }
7
9
 
8
10
  before { set_current_user! user }
9
11
 
@@ -12,12 +14,24 @@ describe ExamAuthorizationRequestsController, type: :controller, organization_wo
12
14
 
13
15
  def do_post
14
16
  post :create, params: {
15
- exam_authorization_request: { exam_id: exam.id, exam_registration_id: exam_registration.id }
17
+ exam_authorization_request: { exam_id: exam_id, exam_registration_id: exam_registration.id }
16
18
  }
17
19
  end
18
20
 
19
21
  before { do_post }
20
22
 
23
+ describe 'called once in wrong organization' do
24
+ let(:organization) { create(:organization, name: 'other') }
25
+ it { expect(response.status).to eq 404 }
26
+ it { expect(exam_registration.authorization_requests.size).to be 0 }
27
+ end
28
+
29
+ describe 'called once with wrong exam' do
30
+ let(:exam_id) { create(:exam).id }
31
+ it { expect(response.status).to eq 404 }
32
+ it { expect(exam_registration.authorization_requests.size).to be 0 }
33
+ end
34
+
21
35
  describe 'called once' do
22
36
  it { expect(response.status).to eq 302 }
23
37
  it { expect(exam_registration.authorization_requests.size).to be 1 }
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe ExercisesController, organization_workspace: :test do
4
+ let(:user) { create(:user) }
5
+
6
+ let(:problem) { create(:problem) }
7
+ let!(:exam) { create :exam, exercises: [problem], duration: 10, start_time: 1.hour.ago, end_time: 1.hour.since }
8
+
9
+ before { reindex_current_organization! }
10
+ before { set_current_user! user }
11
+
12
+
13
+ describe 'show' do
14
+ context 'when user is in the middle of an exam' do
15
+
16
+ let!(:exam_authorization) { create :exam_authorization, exam: exam, user: user, started: true, started_at: started_at }
17
+ before { get :show, params: { id: problem.id } }
18
+
19
+ context 'when user is not out of time yet' do
20
+ let(:started_at) { 5.minutes.ago }
21
+
22
+ it { expect(response.status).to eq 200 }
23
+ end
24
+
25
+ context 'when user is out of time' do
26
+ let(:started_at) { 20.minutes.ago }
27
+
28
+ it { expect(response.status).to eq 410 }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -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: 20210803175124) do
13
+ ActiveRecord::Schema.define(version: 20210929223144) do
14
14
 
15
15
  # These are extensions that must be enabled in order to support this database
16
16
  enable_extension "plpgsql"
@@ -194,6 +194,7 @@ ActiveRecord::Schema.define(version: 20210803175124) do
194
194
  t.datetime "created_at", null: false
195
195
  t.datetime "updated_at", null: false
196
196
  t.boolean "processed", default: false
197
+ t.integer "authorization_requests_limit"
197
198
  t.index ["organization_id"], name: "index_exam_registrations_on_organization_id"
198
199
  end
199
200
 
@@ -9,22 +9,30 @@ Organization.find_or_create_by!(name: 'base') do |org|
9
9
  org.public = true
10
10
  org.login_methods = Mumukit::Login::Settings.login_methods
11
11
  org.locale = 'es'
12
+ org.time_zone = 'Buenos Aires'
12
13
  end
13
14
 
14
15
  Organization.find_or_create_by!(name: 'private') do |org|
15
- org.book = Book.find_by!(slug: 'mumukiproject/mumuki-libro-aprende-a-programar-recorrido-extendido')
16
+ org.book = Book.find_by!(slug: 'mumuki/mumuki-libro-programacion')
16
17
  org.public = false
18
+ org.time_zone = 'Buenos Aires'
17
19
  end
18
20
 
19
- Organization.find_or_create_by!(name: 'primaria') do |org|
20
- org.book = Book.find_by!(slug: 'mumukiproject/mumuki-libro-primaria')
21
- org.login_methods = Mumukit::Login::Settings.login_methods
22
- org.public = true
23
- end
21
+ Organization.find_or_create_by!(name: 'primaria') do |org|
22
+ org.book = Book.find_by!(slug: 'mumukiproject/mumuki-libro-primaria')
23
+ org.login_methods = Mumukit::Login::Settings.login_methods
24
+ org.public = true
25
+ org.time_zone = 'Buenos Aires'
26
+ end
24
27
 
25
- Organization.find_or_create_by!(name: 'central')
28
+ Organization.find_or_create_by!(name: 'central') do |org|
29
+ org.book = Book.find_by!(slug: 'mumuki/mumuki-libro-programacion')
30
+ org.login_methods = Mumukit::Login::Settings.login_methods
31
+ org.public = true
32
+ org.time_zone = 'Buenos Aires'
33
+ end
26
34
 
27
- User.find_or_create_by!(uid: 'dev.student@mumuki.org') { |org| org.permissions = {student: 'central/*'} }
35
+ User.find_or_create_by!(uid: 'dev.student@mumuki.org') { |org| org.permissions = {student: 'private/*'} }
28
36
  User.find_or_create_by!(uid: 'dev.teacher@mumuki.org') { |org| org.permissions = {teacher: 'private/*'} }
29
37
  User.find_or_create_by!(uid: 'dev.admin@mumuki.org') { |org| org.permissions = {admin: '*/*'} }
30
38
  User.find_or_create_by!(uid: 'dev.owner@mumuki.org') { |org| org.permissions = {owner: '*/*'} }
@@ -470,20 +470,22 @@ feature 'Read Only Flow' do
470
470
 
471
471
  context 'and user is ex student of organization' do
472
472
  before { user.update! permissions: { ex_student: slug } }
473
- scenario 'avatar dorpdown' do
473
+ scenario 'avatar dropdown' do
474
474
  visit "/"
475
475
  find('#profileDropdown').click
476
- expect(page).not_to have_text('My account')
477
- expect(page).not_to have_text('FAQs')
478
- expect(page).not_to have_text('Classroom')
479
- expect(page).not_to have_text('Solve other\'s doubts')
476
+ expect(page).to have_text('My account')
477
+ expect(page).to have_text('FAQs')
480
478
  expect(page).not_to have_text('My doubts')
479
+ expect(page).not_to have_text('Classroom')
481
480
  expect(page).not_to have_text('Bibliotheca')
481
+ expect(page).not_to have_text('Solve other\'s doubts')
482
482
  expect(page).to have_text('Sign Out')
483
483
  end
484
484
  scenario 'show book' do
485
485
  visit "/"
486
- expect(page).to have_text('You are not allowed to see this content')
486
+ expect(page).not_to have_text('Chapter 1')
487
+ expect(page).not_to have_text('Chapter 2')
488
+ expect(page).not_to have_text('Practicing!')
487
489
  end
488
490
  scenario 'show chapter' do
489
491
  visit "/chapters/#{chapter1.id}"
@@ -503,27 +505,23 @@ feature 'Read Only Flow' do
503
505
  end
504
506
  scenario 'show profile' do
505
507
  visit "/user"
506
- expect(page).to have_text('You are not allowed to see this content')
508
+ expect(page).to have_text('My profile')
507
509
  end
508
510
  scenario 'show faqs' do
509
511
  visit "/faqs"
510
- expect(page).to have_text('You are not allowed to see this content')
511
- end
512
- scenario 'show discussion' do
513
- visit "/discussions"
514
- expect(page).to have_text('You are not allowed to see this content')
512
+ expect(page).to have_text('FAQs')
515
513
  end
516
514
  scenario 'show discussion in existent exercise' do
517
515
  visit "/exercises/#{exercise111.id}/discussions/#{discussion111.id}"
518
- expect(page).to have_text('You are not allowed to see this content')
516
+ expect(page).to have_text('Page was not found')
519
517
  end
520
518
  scenario 'show discussion in existent exercise' do
521
519
  visit "/exercises/#{exercise112.id}/discussions/#{discussion112.id}"
522
- expect(page).to have_text('You are not allowed to see this content')
520
+ expect(page).to have_text('Page was not found')
523
521
  end
524
522
  scenario 'new discussion' do
525
523
  visit "/exercises/#{exercise112.id}/discussions/new"
526
- expect(page).to have_text('You are not allowed to see this content')
524
+ expect(page).to have_text('Page was not found')
527
525
  end
528
526
  end
529
527
 
@@ -740,7 +738,7 @@ feature 'Read Only Flow' do
740
738
 
741
739
  context 'and user is ex student of organization' do
742
740
  before { user.update! permissions: { ex_student: slug } }
743
- scenario 'avatar dorpdown' do
741
+ scenario 'avatar dorpdownz' do
744
742
  visit "/"
745
743
  find('#profileDropdown').click
746
744
  expect(page).to have_text('My account')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mumuki-laboratory
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.17.0
4
+ version: 9.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-23 00:00:00.000000000 Z
11
+ date: 2021-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 9.17.0
33
+ version: 9.19.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 9.17.0
40
+ version: 9.19.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mumukit-bridge
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -438,7 +438,6 @@ files:
438
438
  - app/assets/javascripts/mumuki_laboratory/application/upload.js
439
439
  - app/assets/javascripts/mumuki_laboratory/application/user.js
440
440
  - app/assets/stylesheets/mumuki_laboratory/application.scss
441
- - app/assets/stylesheets/mumuki_laboratory/application/_alerts.scss
442
441
  - app/assets/stylesheets/mumuki_laboratory/application/_codemirror-themes.scss
443
442
  - app/assets/stylesheets/mumuki_laboratory/application/_errors.scss
444
443
  - app/assets/stylesheets/mumuki_laboratory/application/_fonts.scss
@@ -800,6 +799,7 @@ files:
800
799
  - spec/controllers/exam_authorization_requests_controller_spec.rb
801
800
  - spec/controllers/exam_registrations_controller_spec.rb
802
801
  - spec/controllers/exercise_solutions_controller_spec.rb
802
+ - spec/controllers/exercises_controller_spec.rb
803
803
  - spec/controllers/guide_progress_controller_spec.rb
804
804
  - spec/controllers/invitations_controller_spec.rb
805
805
  - spec/controllers/messages_controller_spec.rb
@@ -984,135 +984,136 @@ signing_key:
984
984
  specification_version: 4
985
985
  summary: Code assement web application for the Mumuki Platform.
986
986
  test_files:
987
- - spec/features/disable_user_flow_spec.rb
988
- - spec/features/exercise_flow_spec.rb
989
- - spec/features/certificate_programs_flow_spec.rb
990
- - spec/features/progressive_tips_spec.rb
991
- - spec/features/runner_assets_spec.rb
992
- - spec/features/guide_reset_spec.rb
993
- - spec/features/home_public_flow_spec.rb
994
- - spec/features/links_flow_spec.rb
995
- - spec/features/not_found_private_flow_spec.rb
996
- - spec/features/dynamic_exam_spec.rb
997
- - spec/features/chapters_flow_spec.rb
998
- - spec/features/read_only_flow_spec.rb
999
- - spec/features/discussion_flow_spec.rb
1000
- - spec/features/complements_flow_spec.rb
1001
- - spec/features/standard_flow_spec.rb
1002
- - spec/features/user_activity_flow_spec.rb
1003
- - spec/features/invitations_flow_spec.rb
1004
- - spec/features/home_private_flow_spec.rb
1005
- - spec/features/exams_flow_spec.rb
1006
- - spec/features/topic_flow_spec.rb
1007
- - spec/features/login_flow_spec.rb
1008
- - spec/features/not_found_public_flow_spec.rb
1009
- - spec/features/immersive_redirection_spec.rb
1010
- - spec/features/disabled_organization_flow_spec.rb
1011
- - spec/features/lessons_flow_spec.rb
1012
- - spec/features/guides_flow_spec.rb
1013
- - spec/features/notifications_flow_spec.rb
1014
- - spec/features/menu_bar_spec.rb
1015
- - spec/features/profile_flow_spec.rb
1016
- - spec/features/terms_flow_spec.rb
1017
- - spec/javascripts/results-renderers-spec.js
987
+ - spec/evaluation_helper.rb
988
+ - spec/spec_helper.rb
989
+ - spec/capybara_helper.rb
990
+ - spec/login_helper.rb
991
+ - spec/javascripts/events-spec.js
1018
992
  - spec/javascripts/i18n-spec.js
1019
- - spec/javascripts/gamification-spec.js
1020
- - spec/javascripts/global-spec.js
1021
- - spec/javascripts/elipsis-spec.js
993
+ - spec/javascripts/bridge-spec.js
1022
994
  - spec/javascripts/kids-button-spec.js
1023
- - spec/javascripts/sync-mode-spec.js
1024
- - spec/javascripts/spec-helper.js
995
+ - spec/javascripts/gamification-spec.js
1025
996
  - spec/javascripts/timer-spec.js
1026
- - spec/javascripts/csrf-token-spec.js
1027
- - spec/javascripts/submissions-store-spec.js
1028
- - spec/javascripts/timeout-spec.js
1029
- - spec/javascripts/editors-spec.js
1030
997
  - spec/javascripts/speech-bubble-renderer-spec.js
998
+ - spec/javascripts/results-renderers-spec.js
1031
999
  - spec/javascripts/upload-spec.js
1000
+ - spec/javascripts/sync-mode-spec.js
1001
+ - spec/javascripts/submissions-store-spec.js
1002
+ - spec/javascripts/elipsis-spec.js
1032
1003
  - spec/javascripts/exercise-spec.js
1033
- - spec/javascripts/events-spec.js
1034
- - spec/javascripts/bridge-spec.js
1035
- - spec/spec_helper.rb
1036
- - spec/teaspoon_env.rb
1037
- - spec/evaluation_helper.rb
1038
- - spec/dummy/public/medal/outline.svg
1039
- - spec/dummy/public/error/404.svg
1040
- - spec/dummy/public/error/500.svg
1004
+ - spec/javascripts/csrf-token-spec.js
1005
+ - spec/javascripts/editors-spec.js
1006
+ - spec/javascripts/timeout-spec.js
1007
+ - spec/javascripts/global-spec.js
1008
+ - spec/javascripts/spec-helper.js
1009
+ - spec/helpers/avatar_helper_spec.rb
1010
+ - spec/helpers/email_helper_spec.rb
1011
+ - spec/helpers/certificate_helper_spec.rb
1012
+ - spec/helpers/authors_helper_spec.rb
1013
+ - spec/helpers/page_title_helper_spec.rb
1014
+ - spec/helpers/exercise_input_helper_spec.rb
1015
+ - spec/helpers/with_navigation_spec.rb
1016
+ - spec/helpers/with_choices_spec.rb
1017
+ - spec/helpers/breadcrumbs_helper_spec.rb
1018
+ - spec/helpers/icons_helper_spec.rb
1019
+ - spec/helpers/user_activity_helper_spec.rb
1020
+ - spec/helpers/test_results_rendering_spec.rb
1021
+ - spec/helpers/application_helper_spec.rb
1041
1022
  - spec/dummy/public/error/timeout_3.svg
1042
1023
  - spec/dummy/public/error/timeout_1.svg
1043
- - spec/dummy/public/error/timeout_2.svg
1024
+ - spec/dummy/public/error/500.svg
1044
1025
  - spec/dummy/public/error/401.svg
1045
- - spec/dummy/public/error/403.svg
1026
+ - spec/dummy/public/error/404.svg
1046
1027
  - spec/dummy/public/error/410.svg
1047
- - spec/dummy/public/character/animations.json
1048
- - spec/dummy/public/character/magnifying_glass/apparition.svg
1049
- - spec/dummy/public/character/magnifying_glass/loop.svg
1050
- - spec/dummy/public/character/kibi/failure.svg
1028
+ - spec/dummy/public/error/403.svg
1029
+ - spec/dummy/public/error/timeout_2.svg
1051
1030
  - spec/dummy/public/character/kibi/context.svg
1052
1031
  - spec/dummy/public/character/kibi/passed_with_warnings.svg
1053
- - spec/dummy/public/character/kibi/jump.svg
1054
1032
  - spec/dummy/public/character/kibi/success_l.svg
1033
+ - spec/dummy/public/character/kibi/failure.svg
1055
1034
  - spec/dummy/public/character/kibi/success2_l.svg
1035
+ - spec/dummy/public/character/kibi/jump.svg
1036
+ - spec/dummy/public/character/magnifying_glass/loop.svg
1037
+ - spec/dummy/public/character/magnifying_glass/apparition.svg
1038
+ - spec/dummy/public/character/animations.json
1039
+ - spec/dummy/public/medal/outline.svg
1056
1040
  - spec/dummy/Rakefile
1057
1041
  - spec/dummy/config/application.rb
1058
- - spec/dummy/config/puma.rb
1042
+ - spec/dummy/config/environment.rb
1059
1043
  - spec/dummy/config/spring.rb
1060
- - spec/dummy/config/routes.rb
1061
- - spec/dummy/config/environments/test.rb
1062
- - spec/dummy/config/environments/development.rb
1063
1044
  - spec/dummy/config/database.yml
1045
+ - spec/dummy/config/cable.yml
1046
+ - spec/dummy/config/routes.rb
1047
+ - spec/dummy/config/boot.rb
1048
+ - spec/dummy/config/puma.rb
1049
+ - spec/dummy/config/initializers/cookies_serializer.rb
1050
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
1064
1051
  - spec/dummy/config/initializers/assets.rb
1065
1052
  - spec/dummy/config/initializers/wrap_parameters.rb
1066
- - spec/dummy/config/initializers/filter_parameter_logging.rb
1067
- - spec/dummy/config/initializers/cookies_serializer.rb
1068
1053
  - spec/dummy/config/rabbit.yml
1069
- - spec/dummy/config/locales/en.yml
1070
- - spec/dummy/config/cable.yml
1071
- - spec/dummy/config/environment.rb
1054
+ - spec/dummy/config/environments/development.rb
1055
+ - spec/dummy/config/environments/test.rb
1072
1056
  - spec/dummy/config/secrets.yml
1073
- - spec/dummy/config/boot.rb
1074
- - spec/dummy/package.json
1075
- - spec/dummy/config.ru
1076
- - spec/dummy/db/seeds.rb
1077
- - spec/dummy/db/schema.rb
1078
- - spec/dummy/bin/yarn
1057
+ - spec/dummy/config/locales/en.yml
1079
1058
  - spec/dummy/bin/rails
1059
+ - spec/dummy/bin/yarn
1080
1060
  - spec/dummy/bin/rake
1081
- - spec/dummy/bin/bundle
1082
1061
  - spec/dummy/bin/setup
1083
1062
  - spec/dummy/bin/update
1084
- - spec/controllers/certificates_controller_spec.rb
1085
- - spec/controllers/students_api_controller_spec.rb
1063
+ - spec/dummy/bin/bundle
1064
+ - spec/dummy/package.json
1065
+ - spec/dummy/db/schema.rb
1066
+ - spec/dummy/db/seeds.rb
1067
+ - spec/dummy/config.ru
1068
+ - spec/controllers/discussions_controller_spec.rb
1086
1069
  - spec/controllers/api_clients_controller.rb
1087
- - spec/controllers/organizations_api_controller_spec.rb
1088
- - spec/controllers/exam_authorization_requests_controller_spec.rb
1070
+ - spec/controllers/messages_controller_spec.rb
1089
1071
  - spec/controllers/confirmations_controller_spec.rb
1090
- - spec/controllers/exam_registrations_controller_spec.rb
1072
+ - spec/controllers/invitations_controller_spec.rb
1091
1073
  - spec/controllers/users_controller_spec.rb
1092
- - spec/controllers/exercise_solutions_controller_spec.rb
1093
- - spec/controllers/discussions_controller_spec.rb
1094
1074
  - spec/controllers/courses_api_controller_spec.rb
1095
- - spec/controllers/discussions_messages_controller_spec.rb
1096
- - spec/controllers/users_api_controller_spec.rb
1097
- - spec/controllers/messages_controller_spec.rb
1098
- - spec/controllers/invitations_controller_spec.rb
1075
+ - spec/controllers/students_api_controller_spec.rb
1099
1076
  - spec/controllers/guide_progress_controller_spec.rb
1100
1077
  - spec/controllers/chapters_controller_spec.rb
1101
- - spec/login_helper.rb
1078
+ - spec/controllers/exercise_solutions_controller_spec.rb
1079
+ - spec/controllers/exercises_controller_spec.rb
1080
+ - spec/controllers/discussions_messages_controller_spec.rb
1081
+ - spec/controllers/organizations_api_controller_spec.rb
1082
+ - spec/controllers/exam_registrations_controller_spec.rb
1083
+ - spec/controllers/certificates_controller_spec.rb
1084
+ - spec/controllers/exam_authorization_requests_controller_spec.rb
1085
+ - spec/controllers/users_api_controller_spec.rb
1086
+ - spec/api_helper.rb
1102
1087
  - spec/mailers/previews/user_mailer_preview.rb
1103
1088
  - spec/mailers/user_mailer_spec.rb
1104
- - spec/capybara_helper.rb
1105
- - spec/helpers/icons_helper_spec.rb
1106
- - spec/helpers/certificate_helper_spec.rb
1107
- - spec/helpers/test_results_rendering_spec.rb
1108
- - spec/helpers/avatar_helper_spec.rb
1109
- - spec/helpers/exercise_input_helper_spec.rb
1110
- - spec/helpers/with_navigation_spec.rb
1111
- - spec/helpers/email_helper_spec.rb
1112
- - spec/helpers/user_activity_helper_spec.rb
1113
- - spec/helpers/with_choices_spec.rb
1114
- - spec/helpers/breadcrumbs_helper_spec.rb
1115
- - spec/helpers/page_title_helper_spec.rb
1116
- - spec/helpers/application_helper_spec.rb
1117
- - spec/helpers/authors_helper_spec.rb
1118
- - spec/api_helper.rb
1089
+ - spec/features/login_flow_spec.rb
1090
+ - spec/features/links_flow_spec.rb
1091
+ - spec/features/notifications_flow_spec.rb
1092
+ - spec/features/dynamic_exam_spec.rb
1093
+ - spec/features/immersive_redirection_spec.rb
1094
+ - spec/features/invitations_flow_spec.rb
1095
+ - spec/features/chapters_flow_spec.rb
1096
+ - spec/features/read_only_flow_spec.rb
1097
+ - spec/features/home_public_flow_spec.rb
1098
+ - spec/features/runner_assets_spec.rb
1099
+ - spec/features/disabled_organization_flow_spec.rb
1100
+ - spec/features/user_activity_flow_spec.rb
1101
+ - spec/features/guides_flow_spec.rb
1102
+ - spec/features/terms_flow_spec.rb
1103
+ - spec/features/home_private_flow_spec.rb
1104
+ - spec/features/progressive_tips_spec.rb
1105
+ - spec/features/not_found_private_flow_spec.rb
1106
+ - spec/features/exercise_flow_spec.rb
1107
+ - spec/features/profile_flow_spec.rb
1108
+ - spec/features/certificate_programs_flow_spec.rb
1109
+ - spec/features/guide_reset_spec.rb
1110
+ - spec/features/topic_flow_spec.rb
1111
+ - spec/features/not_found_public_flow_spec.rb
1112
+ - spec/features/disable_user_flow_spec.rb
1113
+ - spec/features/lessons_flow_spec.rb
1114
+ - spec/features/menu_bar_spec.rb
1115
+ - spec/features/standard_flow_spec.rb
1116
+ - spec/features/discussion_flow_spec.rb
1117
+ - spec/features/exams_flow_spec.rb
1118
+ - spec/features/complements_flow_spec.rb
1119
+ - spec/teaspoon_env.rb
@@ -1,3 +0,0 @@
1
- .alert {
2
- margin-right: 15px;
3
- }