mumuki-laboratory 7.0.2 → 7.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6244ecfced282fce6145606e3f17a11cd27e6423a8d38c9a59b7097930c0be2
4
- data.tar.gz: c83b047301e51cedfd5d3898e97facb34eb243a6ad0035da2097291d5f09240d
3
+ metadata.gz: d6896f137f401b7b8bb5dd0738e580438a7960eee6abb275b48391fe0a923241
4
+ data.tar.gz: eedc5012f387ccbd9ecfe02f4a5ff3a4395ee35b47a6a1ca6e1bee6902c37a71
5
5
  SHA512:
6
- metadata.gz: 759289d01db7f9121e1f5c4a7cb3048c494cd0b4f0a2fd6850664bd16f1fed0fe1a4ce4905bb591288e7d5572e892723f775135832c15bc6468724cf620fb0bf
7
- data.tar.gz: f02af3213865d817f212d87b2b0072dbf897deb5c29e13f72a742a55ef34606e4f710e90248ff644c14c1e393a80f6e6ea4a8ea316b3e76cd5a563143fada7ce
6
+ metadata.gz: 3ada54c64c5dd5322437da49812d4ff5b7559b6568a0a8812026018675e47b77f7d9c66bb8c16ff19103a7cd6fa93383a1c8ae62647ed548de79ce2dde080c40
7
+ data.tar.gz: 5a9ddca63b8d823111ce73dc5329b69c9a1a556b1427178afe6827e50209a22a38289b0f0c08679da7200c48b267e249393e534745e4eca4b638bb17716db12e
@@ -0,0 +1,26 @@
1
+ const assetsLoader = {
2
+ layout: {
3
+ onLoadingStarted: function () {
4
+
5
+ },
6
+ onLoadingFinished: function () {
7
+
8
+ }
9
+ },
10
+ editor: {
11
+ onLoadingStarted: function () {
12
+ mumuki.kids.disableContextModalButton();
13
+ },
14
+ onLoadingFinished: function () {
15
+ mumuki.kids.enableContextModalButton();
16
+ }
17
+ }
18
+ };
19
+
20
+ mumuki.assetsLoaderFor = function (kind) {
21
+ assetsLoader[kind].onLoadingStarted();
22
+ };
23
+
24
+ mumuki.assetsLoadedFor = function (kind) {
25
+ assetsLoader[kind].onLoadingFinished();
26
+ };
@@ -0,0 +1,36 @@
1
+ mumuki.Button = class {
2
+
3
+ constructor($button, $container) {
4
+ this.$button = $button;
5
+ this.$container = $container || $button;
6
+ this.originalContent = $button.html();
7
+ }
8
+
9
+ disable () {
10
+ this.$container.attr('disabled', 'disabled');
11
+ }
12
+
13
+ setWaiting () {
14
+ this.preventClick();
15
+ this.setWaitingText();
16
+ }
17
+
18
+ enable () {
19
+ this.setOriginalContent();
20
+ this.$container.removeAttr('disabled');
21
+ }
22
+
23
+ setWaitingText () {
24
+ this.$button.html('<i class="fa fa-refresh fa-spin"></i> ' + this.$button.attr('data-waiting'));
25
+ }
26
+
27
+ setOriginalContent () {
28
+ this.$button.html(this.originalContent);
29
+ }
30
+
31
+ preventClick () {
32
+ this.disable();
33
+ this.$button.on('click', (e) => e.preventDefault());
34
+ }
35
+ };
36
+
@@ -12,8 +12,9 @@ mumuki.load(function () {
12
12
  var $defaultSpeechTabName = 'description';
13
13
  var $texts = $bubble.children(availableTabs.join(", "));
14
14
  var $hint = $('.mu-kids-hint');
15
- var discussionsLinkHtml = $('#mu-kids-discussion-link-html').html();
16
15
  var $description = $('.mu-kids-description');
16
+ var discussionsLinkHtml = $('#mu-kids-discussion-link-html').html();
17
+ var contextModalButton = new mumuki.Button($('.mu-kids-context .modal-footer button'));
17
18
 
18
19
  function floatFromPx(value) {
19
20
  return parseFloat(value.substring(0, value.length - 2));
@@ -125,6 +126,14 @@ mumuki.load(function () {
125
126
  mumuki.presenterCharacter.playAnimation('talk', mumuki.kids._getCharacterImage());
126
127
  },
127
128
 
129
+ disableContextModalButton: function () {
130
+ contextModalButton.setWaiting();
131
+ },
132
+
133
+ enableContextModalButton: function () {
134
+ contextModalButton.enable();
135
+ },
136
+
128
137
  // ===========
129
138
  // Private API
130
139
  // ===========
@@ -28,45 +28,24 @@ var mumuki = mumuki || {};
28
28
  }
29
29
  };
30
30
 
31
- function SubmitButton(submitButton, submissionControls) {
32
- this.submitButton = submitButton;
33
- this.submissionControls = submissionControls;
34
- }
31
+ class SubmitButton extends mumuki.Button {
35
32
 
36
- SubmitButton.prototype = {
37
- disable: function () {
38
- this.submissionControls.attr('disabled', 'disabled');
39
- },
40
- setWaitingText: function () {
41
- document.prevSubmitState = this.submitButton.html();
42
- this.submitButton.html('<i class="fa fa-refresh fa-spin"></i> ' + this.submitButton.attr('data-waiting'));
43
- },
44
- setSendText: function () {
45
- this.submitButton.html(document.prevSubmitState);
46
- },
47
- enable: function () {
48
- this.setSendText();
49
- this.submissionControls.removeAttr('disabled');
50
- },
51
- reachedMaxAttempts: function () {
33
+ reachedMaxAttempts () {
52
34
  return $('#attempts-left-text').attr('data-disabled') === "true";
53
- },
54
- updateAttemptsLeft: function (data) {
35
+ }
36
+
37
+ updateAttemptsLeft (data) {
55
38
  $('#attempts-left-text').replaceWith(data['remaining_attempts_html']);
56
39
  this.checkAttemptsLeft();
57
- },
58
- preventSubmission: function () {
59
- this.disable();
60
- this.submitButton.on('click', function (e) {
61
- e.preventDefault();
62
- })
63
- },
64
- checkAttemptsLeft: function () {
40
+ }
41
+
42
+ checkAttemptsLeft () {
65
43
  if (this.reachedMaxAttempts()) {
66
- this.preventSubmission();
44
+ this.preventClick();
67
45
  }
68
46
  }
69
- };
47
+
48
+ }
70
49
 
71
50
  mumuki.load(function () {
72
51
  var submissionsResults = $('.submission-results');
@@ -119,7 +98,7 @@ var mumuki = mumuki || {};
119
98
 
120
99
  function animateTimeoutError(submitButton) {
121
100
  let scene = new muvment.Scene($('.submission-result-error-animation'));
122
- scene.addState(mumuki.errorState('timeout_1').onStart(submitButton.setSendText.bind(submitButton)).onEndSwitch(scene, 'timeout_2'))
101
+ scene.addState(mumuki.errorState('timeout_1').onStart(submitButton.setOriginalContent.bind(submitButton)).onEndSwitch(scene, 'timeout_2'))
123
102
  .addState(mumuki.errorState('timeout_2').onEndSwitch(scene, 'timeout_3'))
124
103
  .addState(mumuki.errorState('timeout_3').onStart(submitButton.enable.bind(submitButton)))
125
104
  .play();
@@ -2,6 +2,7 @@ class LoginController < ApplicationController
2
2
  Mumukit::Login.configure_login_controller! self
3
3
 
4
4
  skip_before_action :verify_authenticity_token, if: lambda { Rails.env.development? }
5
+ skip_before_action :validate_user_profile!
5
6
 
6
7
  private
7
8
 
@@ -1,6 +1,7 @@
1
1
  module MenuBarHelper
2
2
  def menu_bar_links
3
3
  [
4
+ link_to_profile,
4
5
  link_to_classroom,
5
6
  link_to_bibliotheca,
6
7
  solve_discussions_link,
@@ -9,7 +10,15 @@ module MenuBarHelper
9
10
  end
10
11
 
11
12
  def menu_bar_list_items
12
- menu_bar_links.compact.map { |link| "<li>#{link}<li>" }.join.html_safe
13
+ menu_bar_links.compact.map { |link| li_tag(link) }.join.html_safe
14
+ end
15
+
16
+ def li_tag(link)
17
+ content_tag :li, link
18
+ end
19
+
20
+ def link_to_profile
21
+ li_tag menu_item('user-o', :profile, user_path)
13
22
  end
14
23
 
15
24
  def link_to_classroom
@@ -1,5 +1,9 @@
1
1
  module RunnerAssetsHelper
2
- def render_runner_assets(language, assets_kind)
3
- render partial: 'layouts/runner_assets', locals: {language: language, assets_kind: assets_kind}
2
+ def render_runner_assets(language, assets_kind, loads_more_assets: false)
3
+ render partial: 'layouts/runner_assets', locals: {language: language, assets_kind: assets_kind, loads_more_assets: loads_more_assets}
4
+ end
5
+
6
+ def show_loading_for?(language, assets_kind)
7
+ language.send "#{assets_kind}_shows_loading_content"
4
8
  end
5
9
  end
@@ -1,4 +1,4 @@
1
- <%= render_runner_assets exercise.language, :layout %>
1
+ <%= render_runner_assets exercise.language, :layout, loads_more_assets: exercise.custom? %>
2
2
 
3
3
  <% if exercise.console? %>
4
4
  <%= hidden_field_tag(:stateful_console, exercise.stateful_console?) %>
@@ -1,4 +1,4 @@
1
- <%= render_runner_assets @exercise.language, :layout %>
1
+ <%= render_runner_assets @exercise.language, :layout, loads_more_assets: @exercise.custom? %>
2
2
 
3
3
  <%= content_for :breadcrumbs do %>
4
4
  <%= breadcrumbs @exercise %>
@@ -9,3 +9,11 @@
9
9
  <% language.assets_urls_for(assets_kind, :css).each do |css| %>
10
10
  <link rel="stylesheet" href="<%= css %>" />
11
11
  <% end %>
12
+
13
+ <% if !loads_more_assets && show_loading_for?(language, assets_kind) %>
14
+ <script id="<%= assets_kind %>-loading-script">
15
+ let assetsKind = '<%= assets_kind %>';
16
+ mumuki.load(() => mumuki.assetsLoaderFor(assetsKind));
17
+ </script>
18
+ <% end %>
19
+
@@ -31,7 +31,6 @@
31
31
  <%= profile_picture %>
32
32
  </span>
33
33
  <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="profileDropdown">
34
- <li><%= link_to fixed_fa_icon('user-o', text: t(:profile)), user_path, role: 'menuitem' %></li>
35
34
  <%= menu_bar_list_items %>
36
35
  <li class="divider"></li>
37
36
  <li><%= link_to(t(:sign_out), logout_path(origin: url_for), role: 'menuitem') %></li>
@@ -17,7 +17,7 @@
17
17
  </div>
18
18
  </div>
19
19
  <div class="modal-footer">
20
- <button class="btn btn-success btn-block" data-dismiss="modal" aria-label="<%= t :continue_exercise %>"> <%= t :continue_exercise %> </button>
20
+ <button class="btn btn-success btn-block" data-waiting="<%= t :loading %>" data-dismiss="modal" aria-label="<%= t :continue_exercise %>"> <%= t :continue_exercise %> </button>
21
21
  </div>
22
22
  </div>
23
23
  </div>
@@ -112,6 +112,7 @@ en:
112
112
  lesson: Lesson
113
113
  lesson_number: Lesson %{number}
114
114
  let_us_know: please let us know!
115
+ loading: Loading
115
116
  load_solution_into_console: Load your solution into the console
116
117
  male: Male
117
118
  manual_evaluation_pending: Thanks for submitting your solution! It will be revised by the course teachers soon
@@ -124,6 +124,7 @@ es:
124
124
  lesson: Lección
125
125
  lesson_number: Lección %{number}
126
126
  let_us_know: ¡Por favor avisanos!
127
+ loading: Cargando
127
128
  load_solution_into_console: Cargar la solución en la consola
128
129
  male: Hombre
129
130
  manual_evaluation_pending: ¡Gracias por enviar tu solución! Tus docentes la corregirán pronto
@@ -119,6 +119,7 @@ pt:
119
119
  lesson: Lição
120
120
  lesson_number: Lição %{number}
121
121
  let_us_know: Por favor, avise-nos!
122
+ loading: Carregando
122
123
  load_solution_into_console: Carregue a solução no console
123
124
  male: Masculino
124
125
  manual_evaluation_pending: Obrigado por enviar sua solução! Seus professores irão corrigi-lo em breve
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Laboratory
3
- VERSION = '7.0.2'
3
+ VERSION = '7.0.3'
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- feature 'Exercise Flow', organization_workspace: :test do
3
+ feature 'Guide Reset Flow', organization_workspace: :test do
4
4
  let(:user) { create(:user) }
5
5
 
6
6
  let!(:problem) { build(:problem) }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- feature 'Lessons Flow', organization_workspace: :test do
3
+ feature 'Links Flow', organization_workspace: :test do
4
4
  let(:exercise) { create(:exercise, name: 'E1') }
5
5
  let!(:complement) { create(:complement) }
6
6
  let!(:lesson) { create(:lesson, name: 'L1', exercises: [exercise]) }
@@ -9,7 +9,7 @@ feature 'Login Flow', organization_workspace: :test do
9
9
  ])
10
10
  end
11
11
 
12
- let!(:user) { create :user, first_name: 'John', last_name: 'Doe', uid: 'johndoe@test.com', gender: 1, birthdate: Date.today }
12
+ let!(:user) { create :user, first_name: 'John', last_name: 'Doe', uid: 'johndoe@test.com' }
13
13
 
14
14
  before { reindex_current_organization! }
15
15
 
@@ -9,11 +9,30 @@ feature 'menu bar' do
9
9
  before { private_organization.switch! }
10
10
 
11
11
  context 'anonymous user' do
12
- scenario 'should not see any app' do
13
- visit '/'
12
+ before { set_automatic_login! false }
14
13
 
15
- expect(page).not_to have_text('Classroom')
16
- expect(page).not_to have_text('Bibliotheca')
14
+ context 'on organization without permissions' do
15
+ scenario 'should not see menu bar' do
16
+ visit '/'
17
+
18
+ expect(page).not_to have_text('Profile')
19
+ expect(page).not_to have_text('Classroom')
20
+ expect(page).not_to have_text('Bibliotheca')
21
+ end
22
+ end
23
+
24
+ context 'on organization with permissions' do
25
+ let(:public_organization) { create(:public_organization, book: book) }
26
+ before { set_subdomain_host! public_organization.name }
27
+ before { public_organization.switch! }
28
+
29
+ scenario 'should not see menu bar' do
30
+ visit '/'
31
+
32
+ expect(page).not_to have_text('Profile')
33
+ expect(page).not_to have_text('Classroom')
34
+ expect(page).not_to have_text('Bibliotheca')
35
+ end
17
36
  end
18
37
  end
19
38
 
@@ -23,32 +42,75 @@ feature 'menu bar' do
23
42
  let(:teacher) { create(:user, permissions: {student: 'private/*', teacher: 'private/*'}) }
24
43
  let(:writer) { create(:user, permissions: {student: 'private/*', writer: 'private/*'}) }
25
44
  let(:janitor) { create(:user, permissions: {student: 'private/*', janitor: 'private/*'}) }
45
+ let(:admin) { create(:user, permissions: {student: 'private/*', admin: 'private/*'}) }
26
46
  let(:owner) { create(:user, permissions: {student: 'private/*', owner: 'private/*'}) }
27
47
 
28
- scenario 'visitor should not see any app' do
48
+ scenario 'visitor should only see profile' do
49
+ set_current_user! visitor
50
+
51
+ visit '/'
52
+ expect(page).to have_text('Profile')
53
+ expect(page).not_to have_text('Classroom')
54
+ expect(page).not_to have_text('Bibliotheca')
55
+ end
56
+
57
+ scenario 'student should only see profile' do
29
58
  set_current_user! visitor
30
59
 
31
60
  visit '/'
61
+ expect(page).to have_text('Profile')
32
62
  expect(page).not_to have_text('Classroom')
33
63
  expect(page).not_to have_text('Bibliotheca')
34
64
  end
35
65
 
36
- scenario 'teacher should see classroom' do
66
+ scenario 'teacher should see profile and classroom' do
37
67
  set_current_user! teacher
38
68
 
39
69
  visit '/'
40
70
 
71
+ expect(page).to have_text('Profile')
41
72
  expect(page).to have_text('Classroom')
42
73
  expect(page).not_to have_text('Bibliotheca')
43
74
  end
44
75
 
45
- scenario 'writer should see bibliotheca' do
76
+ scenario 'writer should see profile and bibliotheca' do
46
77
  set_current_user! writer
47
78
 
48
79
  visit '/'
49
80
 
81
+ expect(page).to have_text('Profile')
50
82
  expect(page).not_to have_text('Classroom')
51
83
  expect(page).to have_text('Bibliotheca')
52
84
  end
85
+
86
+ scenario 'janitor should see profile and classroom' do
87
+ set_current_user! janitor
88
+
89
+ visit '/'
90
+
91
+ expect(page).to have_text('Profile')
92
+ expect(page).to have_text('Classroom')
93
+ expect(page).not_to have_text('Bibliotheca')
94
+ end
95
+
96
+ scenario 'admin should see profile, classroom and bibliotheca' do
97
+ set_current_user! admin
98
+
99
+ visit '/'
100
+
101
+ expect(page).to have_text('Profile')
102
+ expect(page).to have_text('Classroom')
103
+ expect(page).to have_text('Bibliotheca')
104
+ end
105
+
106
+ scenario 'owner should see profile, classroom and bibliotheca' do
107
+ set_current_user! owner
108
+
109
+ visit '/'
110
+
111
+ expect(page).to have_text('Profile')
112
+ expect(page).to have_text('Classroom')
113
+ expect(page).to have_text('Bibliotheca')
114
+ end
53
115
  end
54
116
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- feature 'not found on app', organization_workspace: :base do
3
+ feature 'not found private on app', organization_workspace: :base do
4
4
  before { set_subdomain_host! Organization.base.name }
5
5
  before { Organization.base.switch! }
6
6
 
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- feature 'Choose organization Flow' do
3
+ feature 'not found public on app' do
4
4
  let!(:central) { create(:organization, name: 'central') }
5
5
  let!(:some_orga) { create(:public_organization, name: 'someorga', profile: profile) }
6
6
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- feature 'Standard Flow', organization_workspace: :test do
4
- let!(:user) { create(:user, uid: 'mumuki@test.com', first_name: nil) }
3
+ feature 'Profile Flow', organization_workspace: :test do
4
+ let!(:user) { create(:user, uid: 'mumuki@test.com', first_name: nil, last_name: nil) }
5
5
  let(:haskell) { create(:haskell) }
6
6
  let!(:chapter) {
7
7
  create(:chapter, name: 'Functional Programming', lessons: [
@@ -37,21 +37,35 @@ feature 'Standard Flow', organization_workspace: :test do
37
37
  visit '/'
38
38
  end
39
39
 
40
- scenario 'redirect to /user if profile uncompleted and has access to organizations' do
41
- user.update! permissions: {student: 'test/*'}
42
- click_on 'Sign in'
43
- expect(page).to have_text('Please complete your profile data to continue!')
44
- end
40
+ context 'user with uncompleted profile' do
41
+ scenario 'redirect to /user if user has access to organizations' do
42
+ user.update! permissions: {student: 'test/*'}
43
+ click_on 'Sign in'
44
+ expect(page).to have_text('Please complete your profile data to continue!')
45
+ end
46
+
47
+ scenario 'redirect to /user if user does not have access to organizations' do
48
+ click_on 'Sign in'
49
+ expect(page).to have_text('Please complete your profile data to continue!')
50
+ end
45
51
 
46
- scenario 'do not redirect to /user if profile is complete' do
47
- user.update! first_name: 'Mercedes', last_name: 'Sosa'
48
- click_on 'Sign in'
49
- expect(page).not_to have_text('Please complete your profile data to continue!')
52
+ scenario 'is able to log out' do
53
+ click_on 'Sign in'
54
+ set_automatic_login! false
55
+
56
+ click_on 'Sign Out'
57
+ expect(page).to_not have_text('Please complete your profile data to continue!')
58
+ expect(page).to_not have_text('Sign Out')
59
+ expect(page).to have_text('Sign In')
60
+ end
50
61
  end
51
62
 
52
- scenario 'does redirect to /user even if user does not have organizations' do
53
- click_on 'Sign in'
54
- expect(page).to have_text('Please complete your profile data to continue!')
63
+ context 'user with completed profile' do
64
+ scenario 'do not redirect to /user' do
65
+ user.update! first_name: 'Mercedes', last_name: 'Sosa', gender: 0, birthdate: Date.new(1935, 9, 7)
66
+ click_on 'Sign in'
67
+ expect(page).not_to have_text('Please complete your profile data to continue!')
68
+ end
55
69
  end
56
70
 
57
71
  context 'logged in user' do
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Runner Assets Flow', organization_workspace: :test do
4
+ let(:user) { create(:user) }
5
+
6
+ let(:haskell) { create(:haskell) }
7
+ let(:gobstones) { create(:gobstones, layout_shows_loading_content: true, editor_shows_loading_content: true) }
8
+ let(:bash) { create(:bash, layout_shows_loading_content: true) }
9
+
10
+ let(:problem) { build(:problem, name: 'Succ', description: 'Description of Succ', editor: :code, language: gobstones) }
11
+ let(:problem_2) { build(:problem, name: 'Succ2', description: 'Description of Succ2', editor: :custom, language: gobstones) }
12
+ let(:problem_3) { build(:problem, name: 'Succ3', description: 'Description of Succ3', editor: :code, language: haskell) }
13
+ let(:problem_4) { build(:problem, name: 'Succ4', description: 'Description of Succ4', editor: :code, language: bash) }
14
+
15
+ let!(:chapter) {
16
+ create(:chapter, name: 'Functional Programming', lessons: [
17
+ create(:lesson, name: 'getting-started', description: 'An awesome guide', language: haskell, exercises: [
18
+ problem, problem_2, problem_3, problem_4
19
+ ])
20
+ ]) }
21
+
22
+ before { reindex_current_organization! }
23
+ before { set_current_user! user }
24
+
25
+ context 'loading assets script' do
26
+ describe 'for language with both editor and layout loader' do
27
+ scenario 'for exercise with code editor' do
28
+ visit "/exercises/#{problem.id}"
29
+ expect(page).to have_selector('#layout-loading-script', visible: false)
30
+ expect(page).not_to have_selector('#editor-loading-script', visible: false)
31
+ end
32
+
33
+ scenario 'for exercise with custom editor' do
34
+ visit "/exercises/#{problem_2.id}"
35
+ expect(page).not_to have_selector('#layout-loading-script', visible: false)
36
+ expect(page).to have_selector('#editor-loading-script', visible: false)
37
+ end
38
+ end
39
+
40
+ describe 'for language without assets loader' do
41
+ scenario 'for exercise with code editor' do
42
+ visit "/exercises/#{problem_3.id}"
43
+ expect(page).not_to have_selector('#layout-loading-script', visible: false)
44
+ expect(page).not_to have_selector('#editor-loading-script', visible: false)
45
+ end
46
+ end
47
+
48
+ describe 'for language with layout loader' do
49
+ scenario 'for exercise with code editor' do
50
+ visit "/exercises/#{problem_4.id}"
51
+ expect(page).to have_selector('#layout-loading-script', visible: false)
52
+ expect(page).not_to have_selector('#editor-loading-script', visible: false)
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+
data/spec/login_helper.rb CHANGED
@@ -8,7 +8,6 @@ Mumukit::Login.configure do |config|
8
8
  config.mucookie_sign_salt = 'mucookie test sign salt'
9
9
  end
10
10
 
11
- OmniAuth.config.test_mode = true
12
11
  OmniAuth.config.mock_auth[:developer] =
13
12
  OmniAuth::AuthHash.new provider: 'developer',
14
13
  uid: 'johndoe@test.com',
@@ -18,3 +17,7 @@ OmniAuth.config.mock_auth[:developer] =
18
17
  def set_current_user!(user)
19
18
  allow_any_instance_of(ApplicationController).to receive(:current_user_uid).and_return(user.uid)
20
19
  end
20
+
21
+ def set_automatic_login!(test_mode)
22
+ OmniAuth.config.test_mode = test_mode
23
+ end
data/spec/spec_helper.rb CHANGED
@@ -32,6 +32,8 @@ require_relative './evaluation_helper'
32
32
  require_relative './login_helper'
33
33
 
34
34
  RSpec.configure do |config|
35
+ config.before(:each) { set_automatic_login! true }
36
+
35
37
  config.before(:each) { I18n.locale = :en }
36
38
 
37
39
  config.before(:each) do
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: 7.0.2
4
+ version: 7.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-02 00:00:00.000000000 Z
11
+ date: 2019-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -193,7 +193,9 @@ files:
193
193
  - app/assets/images/user_shape.png
194
194
  - app/assets/javascripts/mumuki_laboratory/application.js
195
195
  - app/assets/javascripts/mumuki_laboratory/application/alias-modes.js
196
+ - app/assets/javascripts/mumuki_laboratory/application/assets-loader.js
196
197
  - app/assets/javascripts/mumuki_laboratory/application/bridge.js
198
+ - app/assets/javascripts/mumuki_laboratory/application/button.js
197
199
  - app/assets/javascripts/mumuki_laboratory/application/characters.js
198
200
  - app/assets/javascripts/mumuki_laboratory/application/codemirror-builder.js
199
201
  - app/assets/javascripts/mumuki_laboratory/application/codemirror.js
@@ -541,6 +543,7 @@ files:
541
543
  - spec/features/not_found_public_flow_spec.rb
542
544
  - spec/features/profile_flow_spec.rb
543
545
  - spec/features/progressive_tips_spec.rb
546
+ - spec/features/runner_assets_spec.rb
544
547
  - spec/features/standard_flow_spec.rb
545
548
  - spec/features/topic_flow_spec.rb
546
549
  - spec/helpers/application_helper_spec.rb
@@ -635,6 +638,7 @@ test_files:
635
638
  - spec/features/profile_flow_spec.rb
636
639
  - spec/features/topic_flow_spec.rb
637
640
  - spec/features/chapter_spec.rb
641
+ - spec/features/runner_assets_spec.rb
638
642
  - spec/features/home_private_flow_spec.rb
639
643
  - spec/features/lessons_flow_spec.rb
640
644
  - spec/features/dynamic_exam_spec.rb