mumuki-laboratory 5.3.0 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -1
  3. data/app/assets/javascripts/application/kids.js +47 -17
  4. data/app/assets/stylesheets/application/modules/_kids.scss +20 -0
  5. data/app/assets/stylesheets/application.scss +1 -1
  6. data/app/controllers/invitations_controller.rb +2 -2
  7. data/app/helpers/application_helper.rb +12 -2
  8. data/app/mailers/user_mailer.rb +12 -3
  9. data/app/models/assignment.rb +8 -0
  10. data/app/models/concerns/assistable.rb +17 -0
  11. data/app/models/concerns/with_expectations.rb +1 -5
  12. data/app/models/concerns/with_reminders.rb +53 -9
  13. data/app/models/concerns/with_slug.rb +1 -1
  14. data/app/models/concerns/with_status.rb +1 -1
  15. data/app/models/exercise.rb +2 -2
  16. data/app/models/organization.rb +8 -0
  17. data/app/models/submission/submission.rb +3 -1
  18. data/app/models/user.rb +4 -0
  19. data/app/views/book/show.html.erb +1 -1
  20. data/app/views/exercise_solutions/_expectations.html.erb +7 -0
  21. data/app/views/exercise_solutions/_results.html.erb +6 -3
  22. data/app/views/layouts/_kids.html.erb +3 -3
  23. data/app/views/layouts/application.html.erb +4 -5
  24. data/app/views/user_mailer/no_submissions_reminder.html.erb +349 -0
  25. data/app/views/user_mailer/no_submissions_reminder.text.erb +13 -0
  26. data/db/migrate/20180307150148_add_failed_submissions_count_to_assignments.rb +5 -0
  27. data/db/migrate/20180526141344_add_tips_rules_to_exercise.rb +5 -0
  28. data/lib/mumuki/laboratory/controllers/dynamic_errors.rb +1 -1
  29. data/lib/mumuki/laboratory/controllers/results_rendering.rb +7 -1
  30. data/lib/mumuki/laboratory/locales/en.yml +2 -0
  31. data/lib/mumuki/laboratory/locales/es.yml +2 -0
  32. data/lib/mumuki/laboratory/locales/narrator.en.yml +14 -0
  33. data/lib/mumuki/laboratory/locales/narrator.es.yml +14 -0
  34. data/lib/mumuki/laboratory/locales/narrator.pt.yml +14 -0
  35. data/lib/mumuki/laboratory/seed.rb +9 -29
  36. data/lib/mumuki/laboratory/status/base.rb +3 -1
  37. data/lib/mumuki/laboratory/status/failed.rb +0 -4
  38. data/lib/mumuki/laboratory/status/passed_with_warnings.rb +0 -4
  39. data/lib/mumuki/laboratory/status/unknown.rb +0 -4
  40. data/lib/mumuki/laboratory/version.rb +1 -1
  41. data/lib/mumuki/laboratory.rb +1 -0
  42. data/lib/tasks/users.rake +5 -4
  43. data/spec/dummy/db/schema.rb +3 -1
  44. data/spec/features/profile_flow_spec.rb +1 -1
  45. data/spec/features/progressive_tips_spec.rb +48 -0
  46. data/spec/helpers/application_helper_spec.rb +3 -5
  47. data/spec/helpers/email_helper_spec.rb +0 -2
  48. data/spec/helpers/with_navigation_spec.rb +0 -2
  49. data/spec/mailers/user_mailer_spec.rb +104 -10
  50. data/spec/models/event_generation_spec.rb +3 -0
  51. data/spec/models/exercise_spec.rb +0 -2
  52. data/spec/models/guide_import_spec.rb +7 -0
  53. data/spec/models/organization_spec.rb +0 -1
  54. data/spec/models/playground_spec.rb +0 -2
  55. data/spec/models/user_spec.rb +8 -0
  56. data/spec/spec_helper.rb +2 -0
  57. metadata +29 -4
@@ -72,7 +72,7 @@ feature 'Standard Flow', organization_workspace: :test do
72
72
 
73
73
  context 'with organizations and messages' do
74
74
  scenario 'visit organizations tab' do
75
- user.make_student_of! organization
75
+ user.make_student_of! organization.slug
76
76
  user.save!
77
77
  visit "/user#organizations"
78
78
 
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Progressive Tips', organization_workspace: :test do
4
+ let(:user) { create(:user) }
5
+
6
+ let(:haskell) { create(:haskell) }
7
+
8
+ let!(:problem) { build(:problem,
9
+ name: 'Succ1', description: 'Description of Succ1',
10
+ layout: :input_right, assistance_rules: [{when: :submission_failed, then: ['try this', 'try that']}] ) }
11
+ let(:assignment) { problem.find_or_init_assignment_for(user) }
12
+
13
+ let!(:chapter) {
14
+ create(:chapter, name: 'Functional Programming', lessons: [
15
+ create(:lesson, name: 'getting-started', description: 'An awesome guide', language: haskell, exercises: [problem])
16
+ ]) }
17
+
18
+ before { reindex_current_organization! }
19
+
20
+ context 'visit failed exercise' do
21
+ before { set_current_user! user }
22
+ before { assignment.update! status: :failed }
23
+
24
+ scenario '2 failed submissions' do
25
+ assignment.update! attemps_count: 2
26
+ visit "/exercises/#{problem.slug}"
27
+
28
+ expect(page).to have_text('Try this')
29
+ expect(page).to_not have_text('Try that')
30
+ end
31
+
32
+ scenario '5 failed submissions' do
33
+ assignment.update! attemps_count: 5
34
+ visit "/exercises/#{problem.id}"
35
+
36
+ expect(page).to_not have_text('Try this')
37
+ expect(page).to have_text('Try that')
38
+ end
39
+
40
+ scenario '10 failed submissions' do
41
+ assignment.update! attemps_count: 10
42
+ visit "/exercises/#{problem.id}"
43
+
44
+ expect(page).to_not have_text('Try this')
45
+ expect(page).to have_text('Try that')
46
+ end
47
+ end
48
+ end
@@ -4,8 +4,6 @@ describe ApplicationHelper, organization_workspace: :test do
4
4
  helper ApplicationHelper
5
5
  helper LinksHelper
6
6
 
7
- before { I18n.locale = :en }
8
-
9
7
  describe 'page_title' do
10
8
  context 'in path' do
11
9
  let(:exercise) { lesson.exercises.first }
@@ -16,9 +14,9 @@ describe ApplicationHelper, organization_workspace: :test do
16
14
 
17
15
  before { reindex_current_organization! }
18
16
 
19
- it { expect(page_title nil).to eq 'Mumuki - Improve your programming skills' }
20
- it { expect(page_title Problem.new).to eq 'Mumuki - Improve your programming skills' }
21
- it { expect(page_title exercise).to eq 'C1: A Guide - An Exercise - Mumuki' }
17
+ it { expect(page_title nil).to eq 'Mumuki - test - Improve your programming skills' }
18
+ it { expect(page_title Problem.new).to eq 'Mumuki - test - Improve your programming skills' }
19
+ it { expect(page_title exercise).to eq 'C1: A Guide - An Exercise - Mumuki - test' }
22
20
  end
23
21
  end
24
22
 
@@ -3,8 +3,6 @@ require 'spec_helper'
3
3
  describe EmailHelper, organization_workspace: :test do
4
4
  helper EmailHelper
5
5
 
6
- before { I18n.locale = :en }
7
-
8
6
  describe 'page_title' do
9
7
  let(:user) { create(:user) }
10
8
  let(:guide) { create(:guide, name: 'A Guide') }
@@ -4,8 +4,6 @@ describe WithStudentPathNavigation, organization_workspace: :test do
4
4
  helper WithStudentPathNavigation
5
5
  helper FontAwesome::Rails::IconHelper
6
6
 
7
- before { I18n.locale = :en }
8
-
9
7
  describe '#next_button' do
10
8
  context 'with problems' do
11
9
  let(:lesson) { create(:lesson, name: 'my guide', exercises: [
@@ -1,16 +1,52 @@
1
1
  require "spec_helper"
2
2
 
3
3
  RSpec.describe UserMailer, type: :mailer do
4
+ let(:central) { create(:organization, name: 'central') }
5
+
6
+ describe '#remindable' do
7
+ context 'when user does not want to receive notifications' do
8
+ let(:user) { create :user,
9
+ accepts_reminders: false,
10
+ last_organization: central,
11
+ last_submission_date: nil }
12
+ it { expect(User.remindable).to_not include user }
13
+ end
14
+
15
+ context 'when user wants to receive notifications, and has never submitted' do
16
+ let(:user) { create :user,
17
+ accepts_reminders: true,
18
+ last_organization: central,
19
+ last_submission_date: nil }
20
+ it { expect(User.remindable).to include user }
21
+ end
22
+
23
+ context 'when user wants to receive notifications, and has not sent submissions recently' do
24
+ let(:user) { create :user,
25
+ accepts_reminders: true,
26
+ last_organization: central,
27
+ last_submission_date: 30.days.ago }
28
+ it { expect(User.remindable).to include user }
29
+ end
30
+
31
+ context 'when user wants to receive notifications, and has sent submissions recently' do
32
+ let(:user) { create :user,
33
+ accepts_reminders: true,
34
+ last_organization: central,
35
+ last_submission_date: 15.minutes.ago }
36
+ it { expect(User.remindable).to_not include user }
37
+ end
38
+ end
4
39
 
5
40
  describe "we_miss_you_reminder" do
6
41
  let(:reminder) { user.build_reminder }
7
- let(:central) { create(:organization, name: 'central') }
8
- let(:user) { build :user, last_organization: central, last_submission_date: days_since_last_submission.days.ago, last_reminded_date: days_since_last_reminded.days.ago }
42
+ let(:user) { build :user,
43
+ last_organization: central,
44
+ last_submission_date: days_since_last_submission.days.ago,
45
+ last_reminded_date: days_since_last_reminded.days.ago }
9
46
 
10
47
  let(:days_since_last_submission) { 9 }
11
48
  let(:days_since_last_reminded) { 8 }
12
49
 
13
-
14
50
  it "renders the headers" do
15
51
  expect(reminder.subject).to eq("We miss you!")
16
52
  expect(reminder.to).to eq([user.email])
@@ -23,32 +59,32 @@ RSpec.describe UserMailer, type: :mailer do
23
59
  context "last submission this week" do
24
60
  let(:days_since_last_submission) { 3 }
25
61
 
26
- it { expect(user.should_send_reminder?).to be false }
62
+ it { expect(user.should_remind?).to be false }
27
63
  end
28
64
 
29
65
  context "last submission 1 week ago" do
30
- it { expect(user.should_send_reminder?).to be true }
66
+ it { expect(user.should_remind?).to be true }
31
67
  it { expect(reminder.body.encoded).to include("Keep learning") }
32
68
  end
33
69
 
34
70
  context "last submission 2 weeks ago" do
35
71
  let(:days_since_last_submission) { 16 }
36
72
 
37
- it { expect(user.should_send_reminder?).to be true }
73
+ it { expect(user.should_remind?).to be true }
38
74
  it { expect(reminder.body.encoded).to include("Keep learning") }
39
75
  end
40
76
 
41
77
  context "last submission 3 weeks ago" do
42
78
  let(:days_since_last_submission) { 26 }
43
79
 
44
- it { expect(user.should_send_reminder?).to be true }
80
+ it { expect(user.should_remind?).to be true }
45
81
  it { expect(reminder.body.encoded).to include("Keep learning") }
46
82
  end
47
83
 
48
84
  context "last submission 4 weeks ago" do
49
85
  let(:days_since_last_submission) { 30 }
50
86
 
51
- it { expect(user.should_send_reminder?).to be false }
87
+ it { expect(user.should_remind?).to be false }
52
88
  end
53
89
  end
54
90
 
@@ -58,12 +94,70 @@ RSpec.describe UserMailer, type: :mailer do
58
94
  context "last submission this week" do
59
95
  let(:days_since_last_submission) { 3 }
60
96
 
61
- it { expect(user.should_send_reminder?).to be false }
97
+ it { expect(user.should_remind?).to be false }
62
98
  end
63
99
 
64
100
  context "last submission 1 week ago" do
65
- it { expect(user.should_send_reminder?).to be false }
101
+ it { expect(user.should_remind?).to be false }
66
102
  end
67
103
  end
68
104
  end
105
+
106
+ describe "no_submissions_reminder" do
107
+ let(:reminder) { user.build_reminder }
108
+ let(:user) { build :user, last_organization: central,
109
+ last_submission_date: nil,
110
+ last_reminded_date: days_since_last_reminded.days.ago,
111
+ created_at: days_since_user_creation.days.ago }
112
+
113
+ let(:days_since_last_reminded) { 8 }
114
+ let(:days_since_user_creation) { 8 }
115
+
116
+ it "renders the headers" do
117
+ expect(reminder.subject).to eq("Start using Mumuki!")
118
+ expect(reminder.to).to eq([user.email])
119
+ expect(reminder.from).to eq(["support@mumuki.org"])
120
+ end
121
+
122
+ context 'last reminded over 1 week ago' do
123
+ let(:days_since_last_reminded) { 8 }
124
+
125
+ context "registered this week" do
126
+ let(:days_since_user_creation) { 3 }
127
+
128
+ it { expect(user.should_remind?).to be false }
129
+ end
130
+
131
+ context "registered 1 week ago" do
132
+ it { expect(user.should_remind?).to be true }
133
+ it { expect(reminder.body.encoded).to include("you've never submitted solutions") }
134
+ end
135
+
136
+ context "last submission 2 weeks ago" do
137
+ let(:days_since_user_creation) { 16 }
138
+
139
+ it { expect(user.should_remind?).to be true }
140
+ it { expect(reminder.body.encoded).to include("you've never submitted solutions") }
141
+ end
142
+
143
+ context "last submission 3 weeks ago" do
144
+ let(:days_since_user_creation) { 26 }
145
+
146
+ it { expect(user.should_remind?).to be true }
147
+ it { expect(reminder.body.encoded).to include("you've never submitted solutions") }
148
+ end
149
+
150
+ context "last submission 4 weeks ago" do
151
+ let(:days_since_user_creation) { 30 }
152
+
153
+ it { expect(user.should_remind?).to be false }
154
+ end
155
+ end
156
+
157
+ context 'last reminded this week' do
158
+ let(:days_since_last_reminded) { 2 }
159
+
160
+ it { expect(user.should_remind?).to be false }
161
+ end
162
+ end
69
163
  end
@@ -39,6 +39,7 @@ describe '#as_platform_json', organization_workspace: :test do
39
39
  feedback: nil,
40
40
  test_results: nil,
41
41
  submissions_count: 2,
42
+ attemps_count: 0,
42
43
  manual_evaluation_comment: nil,
43
44
  exercise: {
44
45
  eid: exercise.bibliotheca_id,
@@ -97,6 +98,7 @@ describe '#as_platform_json', organization_workspace: :test do
97
98
  feedback: nil,
98
99
  test_results: nil,
99
100
  submissions_count: 2,
101
+ attemps_count: 0,
100
102
  manual_evaluation_comment: nil,
101
103
  exercise: {
102
104
  name: exercise.name,
@@ -151,6 +153,7 @@ describe '#as_platform_json', organization_workspace: :test do
151
153
  feedback: nil,
152
154
  test_results: nil,
153
155
  submissions_count: 2,
156
+ attemps_count: 0,
154
157
  manual_evaluation_comment: nil,
155
158
  exercise: {
156
159
  eid: exercise.bibliotheca_id,
@@ -4,8 +4,6 @@ describe Exercise, organization_workspace: :test do
4
4
  let(:exercise) { create(:exercise) }
5
5
  let(:user) { create(:user) }
6
6
 
7
- before { I18n.locale = :en }
8
-
9
7
  describe '#slug' do
10
8
  let(:guide) { create(:guide, slug: 'foo/bar') }
11
9
  let(:exercise) { create(:exercise, guide: guide, bibliotheca_id: 4) }
@@ -25,6 +25,10 @@ describe Guide do
25
25
  teacher_info: 'an info',
26
26
  language: 'gobstones',
27
27
  solution: 'foo',
28
+ assistance_rules: [
29
+ {when: :content_empty, then: 'remember to copy the code in the editor!'},
30
+ {when: :submission_errored, then: 'remember to copy code exactly as presented'},
31
+ ],
28
32
  id: 1},
29
33
 
30
34
  {type: 'playground',
@@ -138,6 +142,9 @@ describe Guide do
138
142
  it { expect(guide.exercises.count).to eq 5 }
139
143
  it { expect(guide.exercises.first.language).to eq gobstones }
140
144
  it { expect(guide.exercises.first.extra_visible).to be false }
145
+ it { expect(guide.exercises.first.assistance_rules).to be_present }
146
+ it { expect(guide.exercises.first.assistant.rules.count).to eq 2 }
147
+
141
148
  it { expect(guide.exercises.second.language).to eq haskell }
142
149
  it { expect(guide.exercises.second.default_content).to eq 'a default content' }
143
150
  it { expect(guide.exercises.second.extra_visible).to be true }
@@ -81,7 +81,6 @@ describe Organization, organization_workspace: :test do
81
81
  let(:fresh_organization) { create(:organization, name: 'foo') }
82
82
  it { expect(fresh_organization.login_settings.login_methods).to eq Mumukit::Login::Settings.default_methods }
83
83
  it { expect(fresh_organization.login_settings.social_login_methods).to eq [] }
84
- it { expect(fresh_organization.login_settings.to_lock_json('/foo')).to be_html_safe }
85
84
  end
86
85
 
87
86
  describe 'validations' do
@@ -3,8 +3,6 @@ require 'spec_helper'
3
3
  describe Playground do
4
4
  let(:user) { create(:user) }
5
5
 
6
- before { I18n.locale = :en }
7
-
8
6
  describe '#create' do
9
7
  context 'when language is queriable and exercise is playable' do
10
8
  let(:language) { create(:language, queriable: true) }
@@ -252,4 +252,12 @@ describe User, organization_workspace: :test do
252
252
  student.resubmit! Organization.current.name
253
253
  end
254
254
  end
255
+
256
+ describe '#accept_invitation!' do
257
+ let(:student) { create :user }
258
+ let(:invitation) { create :invitation, course: 'some_orga/some_course' }
259
+ before { student.accept_invitation! invitation }
260
+ it { expect(student.student? invitation.course).to be true }
261
+ it { expect(student.student? 'foo/bar').to be false }
262
+ end
255
263
  end
data/spec/spec_helper.rb CHANGED
@@ -28,6 +28,8 @@ require_relative './capybara_helper'
28
28
  require_relative './evaluation_helper'
29
29
 
30
30
  RSpec.configure do |config|
31
+ config.before(:each) { I18n.locale = :en }
32
+
31
33
  config.before(:each) do
32
34
  if RSpec.current_example.metadata[:organization_workspace] == :test
33
35
  set_subdomain_host! 'test'
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: 5.3.0
4
+ version: 5.4.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: 2018-05-31 00:00:00.000000000 Z
11
+ date: 2018-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.3'
117
+ version: '2.0'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.3'
124
+ version: '2.0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: mumukit-login
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: mumukit-assistant
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.1'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.1'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: rack
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -319,6 +333,7 @@ files:
319
333
  - app/models/book.rb
320
334
  - app/models/chapter.rb
321
335
  - app/models/complement.rb
336
+ - app/models/concerns/assistable.rb
322
337
  - app/models/concerns/friendly_name.rb
323
338
  - app/models/concerns/guide_container.rb
324
339
  - app/models/concerns/navigation/parent_navigation.rb
@@ -389,6 +404,7 @@ files:
389
404
  - app/views/errors/not_found.html.erb
390
405
  - app/views/errors/unauthorized.html.erb
391
406
  - app/views/exams/show.html.erb
407
+ - app/views/exercise_solutions/_expectations.html.erb
392
408
  - app/views/exercise_solutions/_kids_results.html.erb
393
409
  - app/views/exercise_solutions/_kids_results_button.html.erb
394
410
  - app/views/exercise_solutions/_results.html.erb
@@ -444,6 +460,8 @@ files:
444
460
  - app/views/user_mailer/2nd_reminder.text.erb
445
461
  - app/views/user_mailer/3rd_reminder.html.erb
446
462
  - app/views/user_mailer/3rd_reminder.text.erb
463
+ - app/views/user_mailer/no_submissions_reminder.html.erb
464
+ - app/views/user_mailer/no_submissions_reminder.text.erb
447
465
  - app/views/users/_users_form.html.erb
448
466
  - app/views/users/show.html.erb
449
467
  - config/i18n-tasks.yml
@@ -679,10 +697,12 @@ files:
679
697
  - db/migrate/20180129142749_add_api_client.rb
680
698
  - db/migrate/20180130194923_add_last_reminded_date_to_users.rb
681
699
  - db/migrate/20180130204935_add_course.rb
700
+ - db/migrate/20180307150148_add_failed_submissions_count_to_assignments.rb
682
701
  - db/migrate/20180323125804_remove_user_name.rb
683
702
  - db/migrate/20180323140943_remove_unused_omniauth_fields.rb
684
703
  - db/migrate/20180326224511_remove_book_ids.rb
685
704
  - db/migrate/20180402015405_remove_course_uid.rb
705
+ - db/migrate/20180526141344_add_tips_rules_to_exercise.rb
686
706
  - db/seeds/users.rb
687
707
  - lib/events.rb
688
708
  - lib/mumuki/laboratory.rb
@@ -711,6 +731,9 @@ files:
711
731
  - lib/mumuki/laboratory/locales/datetime.es.yml
712
732
  - lib/mumuki/laboratory/locales/en.yml
713
733
  - lib/mumuki/laboratory/locales/es.yml
734
+ - lib/mumuki/laboratory/locales/narrator.en.yml
735
+ - lib/mumuki/laboratory/locales/narrator.es.yml
736
+ - lib/mumuki/laboratory/locales/narrator.pt.yml
714
737
  - lib/mumuki/laboratory/locales/pt.yml
715
738
  - lib/mumuki/laboratory/locales/views.es.yml
716
739
  - lib/mumuki/laboratory/mumukit/auth.rb
@@ -830,6 +853,7 @@ files:
830
853
  - spec/features/menu_bar_spec.rb
831
854
  - spec/features/not_found_flow_spec.rb
832
855
  - spec/features/profile_flow_spec.rb
856
+ - spec/features/progressive_tips_spec.rb
833
857
  - spec/features/standard_flow_spec.rb
834
858
  - spec/helpers/application_helper_spec.rb
835
859
  - spec/helpers/email_helper_spec.rb
@@ -1010,6 +1034,7 @@ test_files:
1010
1034
  - spec/features/menu_bar_spec.rb
1011
1035
  - spec/features/not_found_flow_spec.rb
1012
1036
  - spec/features/profile_flow_spec.rb
1037
+ - spec/features/progressive_tips_spec.rb
1013
1038
  - spec/features/standard_flow_spec.rb
1014
1039
  - spec/helpers/application_helper_spec.rb
1015
1040
  - spec/helpers/email_helper_spec.rb