hanami 2.0.2 → 2.1.0.beta1

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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +25 -9
  5. data/hanami.gemspec +2 -2
  6. data/lib/hanami/config/actions.rb +0 -4
  7. data/lib/hanami/config/logger.rb +1 -1
  8. data/lib/hanami/config/views.rb +0 -4
  9. data/lib/hanami/config.rb +54 -0
  10. data/lib/hanami/extensions/action/slice_configured_action.rb +15 -7
  11. data/lib/hanami/extensions/action.rb +4 -4
  12. data/lib/hanami/extensions/router/errors.rb +58 -0
  13. data/lib/hanami/extensions/view/context.rb +129 -60
  14. data/lib/hanami/extensions/view/part.rb +26 -0
  15. data/lib/hanami/extensions/view/scope.rb +26 -0
  16. data/lib/hanami/extensions/view/slice_configured_context.rb +0 -2
  17. data/lib/hanami/extensions/view/slice_configured_helpers.rb +44 -0
  18. data/lib/hanami/extensions/view/slice_configured_view.rb +106 -21
  19. data/lib/hanami/extensions/view/standard_helpers.rb +14 -0
  20. data/lib/hanami/extensions.rb +10 -3
  21. data/lib/hanami/helpers/form_helper/form_builder.rb +1391 -0
  22. data/lib/hanami/helpers/form_helper/values.rb +75 -0
  23. data/lib/hanami/helpers/form_helper.rb +213 -0
  24. data/lib/hanami/middleware/public_errors_app.rb +75 -0
  25. data/lib/hanami/middleware/render_errors.rb +93 -0
  26. data/lib/hanami/slice.rb +28 -2
  27. data/lib/hanami/slice_configurable.rb +3 -2
  28. data/lib/hanami/version.rb +1 -1
  29. data/lib/hanami/web/rack_logger.rb +8 -20
  30. data/lib/hanami.rb +1 -1
  31. data/spec/integration/action/view_rendering/view_context_spec.rb +221 -0
  32. data/spec/integration/action/view_rendering_spec.rb +0 -18
  33. data/spec/integration/rack_app/middleware_spec.rb +23 -23
  34. data/spec/integration/rack_app/rack_app_spec.rb +5 -1
  35. data/spec/integration/slices/slice_registrations_spec.rb +80 -0
  36. data/spec/integration/view/config/default_context_spec.rb +149 -0
  37. data/spec/integration/view/{inflector_spec.rb → config/inflector_spec.rb} +1 -1
  38. data/spec/integration/view/config/part_class_spec.rb +147 -0
  39. data/spec/integration/view/config/part_namespace_spec.rb +103 -0
  40. data/spec/integration/view/config/paths_spec.rb +119 -0
  41. data/spec/integration/view/config/scope_class_spec.rb +147 -0
  42. data/spec/integration/view/config/scope_namespace_spec.rb +103 -0
  43. data/spec/integration/view/config/template_spec.rb +38 -0
  44. data/spec/integration/view/context/request_spec.rb +3 -7
  45. data/spec/integration/view/helpers/form_helper_spec.rb +174 -0
  46. data/spec/integration/view/helpers/part_helpers_spec.rb +124 -0
  47. data/spec/integration/view/helpers/scope_helpers_spec.rb +84 -0
  48. data/spec/integration/view/helpers/user_defined_helpers/part_helpers_spec.rb +162 -0
  49. data/spec/integration/view/helpers/user_defined_helpers/scope_helpers_spec.rb +119 -0
  50. data/spec/integration/view/slice_configuration_spec.rb +9 -9
  51. data/spec/integration/web/render_detailed_errors_spec.rb +90 -0
  52. data/spec/integration/web/render_errors_spec.rb +240 -0
  53. data/spec/spec_helper.rb +1 -1
  54. data/spec/support/matchers.rb +32 -0
  55. data/spec/unit/hanami/config/actions/default_values_spec.rb +0 -4
  56. data/spec/unit/hanami/config/logger_spec.rb +9 -0
  57. data/spec/unit/hanami/config/render_detailed_errors_spec.rb +25 -0
  58. data/spec/unit/hanami/config/render_errors_spec.rb +25 -0
  59. data/spec/unit/hanami/config/views_spec.rb +0 -18
  60. data/spec/unit/hanami/extensions/view/context_spec.rb +59 -0
  61. data/spec/unit/hanami/helpers/form_helper_spec.rb +2826 -0
  62. data/spec/unit/hanami/router/errors/not_allowed_error_spec.rb +27 -0
  63. data/spec/unit/hanami/router/errors/not_found_error_spec.rb +22 -0
  64. data/spec/unit/hanami/slice_configurable_spec.rb +18 -0
  65. data/spec/unit/hanami/version_spec.rb +1 -1
  66. data/spec/unit/hanami/web/rack_logger_spec.rb +1 -1
  67. metadata +67 -33
  68. data/spec/integration/action/view_integration_spec.rb +0 -165
  69. data/spec/integration/view/part_namespace_spec.rb +0 -96
  70. data/spec/integration/view/path_spec.rb +0 -56
  71. data/spec/integration/view/template_spec.rb +0 -68
  72. data/spec/isolation/hanami/application/already_configured_spec.rb +0 -19
  73. data/spec/isolation/hanami/application/inherit_anonymous_class_spec.rb +0 -10
  74. data/spec/isolation/hanami/application/inherit_concrete_class_spec.rb +0 -14
  75. data/spec/isolation/hanami/application/not_configured_spec.rb +0 -9
  76. data/spec/isolation/hanami/application/routes/configured_spec.rb +0 -44
  77. data/spec/isolation/hanami/application/routes/not_configured_spec.rb +0 -16
  78. data/spec/isolation/hanami/boot/success_spec.rb +0 -50
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe "App view / Config / Part class", :app_integration do
4
+ before do
5
+ with_directory(make_tmp_directory) do
6
+ write "config/app.rb", <<~RUBY
7
+ module TestApp
8
+ class App < Hanami::App
9
+ end
10
+ end
11
+ RUBY
12
+
13
+ write "app/view.rb", <<~RUBY
14
+ # auto_register: false
15
+
16
+ require "hanami/view"
17
+
18
+ module TestApp
19
+ class View < Hanami::View
20
+ end
21
+ end
22
+ RUBY
23
+
24
+ before_prepare if respond_to?(:before_prepare)
25
+ require "hanami/prepare"
26
+ end
27
+ end
28
+
29
+ describe "app view" do
30
+ let(:view_class) { TestApp::View }
31
+
32
+ context "no concrete app part class defined" do
33
+ it "generates an app part class and configures it as the view's part_class" do
34
+ expect(view_class.config.part_class).to be TestApp::Views::Part
35
+ expect(view_class.config.part_class.superclass).to be Hanami::View::Part
36
+ end
37
+ end
38
+
39
+ context "concrete app part class defined" do
40
+ def before_prepare
41
+ write "app/views/part.rb", <<~RUBY
42
+ # auto_register: false
43
+
44
+ module TestApp
45
+ module Views
46
+ class Part < Hanami::View::Part
47
+ def self.concrete?
48
+ true
49
+ end
50
+ end
51
+ end
52
+ end
53
+ RUBY
54
+ end
55
+
56
+ it "configures the app part class as the view's part_class" do
57
+ expect(view_class.config.part_class).to be TestApp::Views::Part
58
+ expect(view_class.config.part_class).to be_concrete
59
+ end
60
+ end
61
+ end
62
+
63
+ describe "slice view" do
64
+ let(:view_class) { Main::View }
65
+
66
+ def before_prepare
67
+ write "slices/main/view.rb", <<~RUBY
68
+ # auto_register: false
69
+
70
+ module Main
71
+ class View < TestApp::View
72
+ end
73
+ end
74
+ RUBY
75
+ end
76
+
77
+ context "no concrete slice part class defined" do
78
+ it "generates a slice part class, inheriting from the app part class, and configures it as the view's part_class" do
79
+ expect(view_class.config.part_class).to be Main::Views::Part
80
+ expect(view_class.config.part_class.superclass).to be TestApp::Views::Part
81
+ end
82
+ end
83
+
84
+ context "concrete slice part class defined" do
85
+ def before_prepare
86
+ super
87
+
88
+ write "slices/main/views/part.rb", <<~RUBY
89
+ # auto_register: false
90
+
91
+ module Main
92
+ module Views
93
+ class Part < TestApp::Views::Part
94
+ def self.concrete?
95
+ true
96
+ end
97
+ end
98
+ end
99
+ end
100
+ RUBY
101
+ end
102
+
103
+ it "configures the slice part class as the view's part_class" do
104
+ expect(view_class.config.part_class).to be Main::Views::Part
105
+ expect(view_class.config.part_class).to be_concrete
106
+ end
107
+ end
108
+
109
+ context "view not inheriting from app view, no concrete part class" do
110
+ def before_prepare
111
+ write "slices/main/view.rb", <<~RUBY
112
+ # auto_register: false
113
+
114
+ module Main
115
+ class View < Hanami::View
116
+ end
117
+ end
118
+ RUBY
119
+ end
120
+
121
+ it "generates a slice part class, inheriting from the app part class, and configures it as the view's part_class" do
122
+ expect(view_class.config.part_class).to be Main::Views::Part
123
+ expect(view_class.config.part_class.superclass).to be TestApp::Views::Part
124
+ end
125
+ end
126
+
127
+ context "no app view class defined" do
128
+ def before_prepare
129
+ FileUtils.rm "app/view.rb"
130
+
131
+ write "slices/main/view.rb", <<~RUBY
132
+ # auto_register: false
133
+
134
+ module Main
135
+ class View < Hanami::View
136
+ end
137
+ end
138
+ RUBY
139
+ end
140
+
141
+ it "generates a slice part class, inheriting from Hanami::View::Part, and configures it as the view's part_class" do
142
+ expect(view_class.config.part_class).to be Main::Views::Part
143
+ expect(view_class.config.part_class.superclass).to be Hanami::View::Part
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami"
4
+
5
+ RSpec.describe "App view / Config / Part namespace", :app_integration do
6
+ before do
7
+ with_directory(make_tmp_directory) do
8
+ write "config/app.rb", <<~RUBY
9
+ module TestApp
10
+ class App < Hanami::App
11
+ end
12
+ end
13
+ RUBY
14
+
15
+ write "app/view.rb", <<~RUBY
16
+ # auto_register: false
17
+
18
+ require "hanami/view"
19
+
20
+ module TestApp
21
+ class View < Hanami::View
22
+ end
23
+ end
24
+ RUBY
25
+
26
+ before_prepare if respond_to?(:before_prepare)
27
+ require "hanami/prepare"
28
+ end
29
+ end
30
+
31
+ subject(:part_namespace) { view_class.config.part_namespace }
32
+
33
+ describe "app view" do
34
+ let(:view_class) { TestApp::View }
35
+
36
+ describe "no part namespace defined" do
37
+ it "is nil" do
38
+ expect(part_namespace).to be nil
39
+ end
40
+ end
41
+
42
+ describe "part namespace defined" do
43
+ def before_prepare
44
+ write "app/views/parts/post.rb", <<~RUBY
45
+ module TestApp
46
+ module Views
47
+ module Parts
48
+ class Post < Hanami::View::Part
49
+ end
50
+ end
51
+ end
52
+ end
53
+ RUBY
54
+ end
55
+
56
+ it "is the Views::Parts namespace within the app" do
57
+ expect(part_namespace).to eq TestApp::Views::Parts
58
+ end
59
+ end
60
+ end
61
+
62
+ describe "slice view" do
63
+ def before_prepare
64
+ write "slices/main/view.rb", <<~RUBY
65
+ # auto_register: false
66
+
67
+ module Main
68
+ class View < TestApp::View
69
+ end
70
+ end
71
+ RUBY
72
+ end
73
+
74
+ let(:view_class) { Main::View }
75
+
76
+ describe "no part namespace defined" do
77
+ it "is nil" do
78
+ expect(part_namespace).to be nil
79
+ end
80
+ end
81
+
82
+ describe "part namespace defined" do
83
+ def before_prepare
84
+ super
85
+
86
+ write "slices/main/views/parts/post.rb", <<~RUBY
87
+ module Main
88
+ module Views
89
+ module Parts
90
+ class Post < Hanami::View::Part
91
+ end
92
+ end
93
+ end
94
+ end
95
+ RUBY
96
+ end
97
+
98
+ it "is the Views::Parts namespace within the slice" do
99
+ expect(part_namespace).to eq Main::Views::Parts
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami"
4
+
5
+ RSpec.describe "App view / Config / Paths", :app_integration do
6
+ before do
7
+ with_directory(make_tmp_directory) do
8
+ write "config/app.rb", <<~RUBY
9
+ module TestApp
10
+ class App < Hanami::App
11
+ end
12
+ end
13
+ RUBY
14
+
15
+ write "app/view.rb", <<~RUBY
16
+ # auto_register: false
17
+
18
+ require "hanami/view"
19
+
20
+ module TestApp
21
+ class View < Hanami::View
22
+ end
23
+ end
24
+ RUBY
25
+
26
+ require "hanami/setup"
27
+ before_prepare if respond_to?(:before_prepare)
28
+ require "hanami/prepare"
29
+ end
30
+ end
31
+
32
+ subject(:paths) { view_class.config.paths }
33
+
34
+ describe "app view" do
35
+ let(:view_class) { TestApp::View }
36
+
37
+ it "is 'app/templates/'" do
38
+ expect(paths.map(&:dir)).to eq [Hanami.app.root.join("app", "templates")]
39
+ end
40
+
41
+ context "custom config in app" do
42
+ def before_prepare
43
+ TestApp::App.config.views.paths = ["/custom/dir"]
44
+ end
45
+
46
+ it "uses the custom config" do
47
+ expect(paths.map(&:dir)).to eq [Pathname("/custom/dir")]
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "slice view" do
53
+ subject(:view_class) { Main::View }
54
+
55
+ def before_prepare
56
+ write "slices/main/view.rb", <<~RUBY
57
+ # auto_register: false
58
+
59
+ module Main
60
+ class View < TestApp::View
61
+ end
62
+ end
63
+ RUBY
64
+ end
65
+
66
+ it "is 'templates/' within the slice dir" do
67
+ expect(paths.map(&:dir)).to eq [Main::Slice.root.join("templates")]
68
+ end
69
+
70
+ context "custom config in app" do
71
+ def before_prepare
72
+ super
73
+ TestApp::App.config.views.paths = ["/custom/dir"]
74
+ end
75
+
76
+ it "uses the custom config" do
77
+ expect(paths.map(&:dir)).to eq [Pathname("/custom/dir")]
78
+ end
79
+ end
80
+
81
+ context "custom config in slice" do
82
+ def before_prepare
83
+ super
84
+
85
+ write "config/slices/main.rb", <<~RUBY
86
+ module Main
87
+ class Slice < Hanami::Slice
88
+ config.views.paths = ["/custom/slice/dir"]
89
+ end
90
+ end
91
+ RUBY
92
+ end
93
+
94
+ it "uses the custom config" do
95
+ expect(paths.map(&:dir)).to eq [Pathname("/custom/slice/dir")]
96
+ end
97
+ end
98
+
99
+ context "custom config in app and slice" do
100
+ def before_prepare
101
+ super
102
+
103
+ TestApp::App.config.views.paths = ["/custom/dir"]
104
+
105
+ write "config/slices/main.rb", <<~RUBY
106
+ module Main
107
+ class Slice < Hanami::Slice
108
+ config.views.paths = ["/custom/slice/dir"]
109
+ end
110
+ end
111
+ RUBY
112
+ end
113
+
114
+ it "uses the custom config from the slice" do
115
+ expect(paths.map(&:dir)).to eq [Pathname("/custom/slice/dir")]
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe "App view / Config / Scope class", :app_integration do
4
+ before do
5
+ with_directory(@dir = make_tmp_directory) do
6
+ write "config/app.rb", <<~RUBY
7
+ module TestApp
8
+ class App < Hanami::App
9
+ end
10
+ end
11
+ RUBY
12
+
13
+ write "app/view.rb", <<~RUBY
14
+ # auto_register: false
15
+
16
+ require "hanami/view"
17
+
18
+ module TestApp
19
+ class View < Hanami::View
20
+ end
21
+ end
22
+ RUBY
23
+
24
+ before_prepare if respond_to?(:before_prepare)
25
+ require "hanami/prepare"
26
+ end
27
+ end
28
+
29
+ describe "app view" do
30
+ let(:view_class) { TestApp::View }
31
+
32
+ describe "no concrete app scope class defined" do
33
+ it "generates an app scope class and configures it as the view's scope_class" do
34
+ expect(view_class.config.scope_class).to be TestApp::Views::Scope
35
+ expect(view_class.config.scope_class.superclass).to be Hanami::View::Scope
36
+ end
37
+ end
38
+
39
+ describe "concrete app scope class defined" do
40
+ def before_prepare
41
+ write "app/views/scope.rb", <<~RUBY
42
+ # auto_register: false
43
+
44
+ module TestApp
45
+ module Views
46
+ class Scope < Hanami::View::Scope
47
+ def self.concrete?
48
+ true
49
+ end
50
+ end
51
+ end
52
+ end
53
+ RUBY
54
+ end
55
+
56
+ it "configures the app scope class as the view's scope_class" do
57
+ expect(view_class.config.scope_class).to be TestApp::Views::Scope
58
+ expect(view_class.config.scope_class).to be_concrete
59
+ end
60
+ end
61
+ end
62
+
63
+ describe "slice view" do
64
+ let(:view_class) { Main::View }
65
+
66
+ def before_prepare
67
+ write "slices/main/view.rb", <<~RUBY
68
+ # auto_register: false
69
+
70
+ module Main
71
+ class View < TestApp::View
72
+ end
73
+ end
74
+ RUBY
75
+ end
76
+
77
+ describe "no concrete slice scope class defined" do
78
+ it "generates a slice scope class and configures it as the view's scope_class" do
79
+ expect(view_class.config.scope_class).to be Main::Views::Scope
80
+ expect(view_class.config.scope_class.superclass).to be TestApp::Views::Scope
81
+ end
82
+ end
83
+
84
+ describe "concrete slice scope class defined" do
85
+ def before_prepare
86
+ super
87
+
88
+ write "slices/main/views/scope.rb", <<~RUBY
89
+ # auto_register: false
90
+
91
+ module Main
92
+ module Views
93
+ class Scope < TestApp::Views::Scope
94
+ def self.concrete?
95
+ true
96
+ end
97
+ end
98
+ end
99
+ end
100
+ RUBY
101
+ end
102
+
103
+ it "configures the slice scope class as the view's scope_class" do
104
+ expect(view_class.config.scope_class).to eq Main::Views::Scope
105
+ expect(view_class.config.scope_class).to be_concrete
106
+ end
107
+ end
108
+
109
+ context "view not inheriting from app view, no concrete scope class defined" do
110
+ def before_prepare
111
+ write "slices/main/view.rb", <<~RUBY
112
+ # auto_register: false
113
+
114
+ module Main
115
+ class View < Hanami::View
116
+ end
117
+ end
118
+ RUBY
119
+ end
120
+
121
+ it "generates a slice scope class, inheriting from the app scope class, and configures it as the view's scope_class" do
122
+ expect(view_class.config.scope_class).to be Main::Views::Scope
123
+ expect(view_class.config.scope_class.superclass).to be TestApp::Views::Scope
124
+ end
125
+ end
126
+
127
+ context "no app view class defined" do
128
+ def before_prepare
129
+ FileUtils.rm "app/view.rb"
130
+
131
+ write "slices/main/view.rb", <<~RUBY
132
+ # auto_register: false
133
+
134
+ module Main
135
+ class View < Hanami::View
136
+ end
137
+ end
138
+ RUBY
139
+ end
140
+
141
+ it "generates a slice scope class, inheriting from Hanami::View::Scope, and configures it as the view's scope_class" do
142
+ expect(view_class.config.scope_class).to be Main::Views::Scope
143
+ expect(view_class.config.scope_class.superclass).to be Hanami::View::Scope
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami"
4
+
5
+ RSpec.describe "App view / Config / Scope namespace", :app_integration do
6
+ before do
7
+ with_directory(make_tmp_directory) do
8
+ write "config/app.rb", <<~RUBY
9
+ module TestApp
10
+ class App < Hanami::App
11
+ end
12
+ end
13
+ RUBY
14
+
15
+ write "app/view.rb", <<~RUBY
16
+ # auto_register: false
17
+
18
+ require "hanami/view"
19
+
20
+ module TestApp
21
+ class View < Hanami::View
22
+ end
23
+ end
24
+ RUBY
25
+
26
+ before_prepare if respond_to?(:before_prepare)
27
+ require "hanami/prepare"
28
+ end
29
+ end
30
+
31
+ subject(:scope_namespace) { view_class.config.scope_namespace }
32
+
33
+ describe "app view" do
34
+ let(:view_class) { TestApp::View }
35
+
36
+ describe "no scope namespace defined" do
37
+ it "is nil" do
38
+ expect(scope_namespace).to be nil
39
+ end
40
+ end
41
+
42
+ describe "scope namespace defined" do
43
+ def before_prepare
44
+ write "app/views/scopes/player.rb", <<~RUBY
45
+ module TestApp
46
+ module Views
47
+ module Scopes
48
+ class Player < Hanami::View::Scope
49
+ end
50
+ end
51
+ end
52
+ end
53
+ RUBY
54
+ end
55
+
56
+ it "is the Views::Scopes namespace within the app" do
57
+ expect(scope_namespace).to eq TestApp::Views::Scopes
58
+ end
59
+ end
60
+ end
61
+
62
+ describe "slice view" do
63
+ def before_prepare
64
+ write "slices/main/view.rb", <<~RUBY
65
+ # auto_register: false
66
+
67
+ module Main
68
+ class View < TestApp::View
69
+ end
70
+ end
71
+ RUBY
72
+ end
73
+
74
+ let(:view_class) { Main::View }
75
+
76
+ describe "no scope namespace defined" do
77
+ it "is nil" do
78
+ expect(scope_namespace).to be nil
79
+ end
80
+ end
81
+
82
+ describe "scope namespace defined" do
83
+ def before_prepare
84
+ super
85
+
86
+ write "slices/main/views/scopes/player.rb", <<~RUBY
87
+ module Main
88
+ module Views
89
+ module Scopes
90
+ class Player < Hanami::View::Scope
91
+ end
92
+ end
93
+ end
94
+ end
95
+ RUBY
96
+ end
97
+
98
+ it "is the Views::Scopes namespace within the slice" do
99
+ expect(scope_namespace).to eq Main::Views::Scopes
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami"
4
+
5
+ RSpec.describe "App view / Config / Template", :app_integration do
6
+ before do
7
+ module TestApp
8
+ class App < Hanami::App
9
+ config.root = "/test_app"
10
+ end
11
+ end
12
+
13
+ Hanami.app.instance_eval(&app_hook) if respond_to?(:app_hook)
14
+ Hanami.app.register_slice :main
15
+ Hanami.app.prepare
16
+
17
+ module TestApp
18
+ class View < Hanami::View
19
+ end
20
+ end
21
+
22
+ module TestApp
23
+ module Views
24
+ module Article
25
+ class Index < TestApp::View
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ subject(:template) { view_class.config.template }
33
+ let(:view_class) { TestApp::Views::Article::Index }
34
+
35
+ it "configures the tempalte to match the class name" do
36
+ expect(template).to eq "article/index"
37
+ end
38
+ end
@@ -20,14 +20,10 @@ RSpec.describe "App view / Context / Request", :app_integration do
20
20
  let(:context_class) { TestApp::Views::Context }
21
21
 
22
22
  subject(:context) {
23
- context_class.new(
24
- request: request,
25
- response: response,
26
- )
23
+ context_class.new(request: request)
27
24
  }
28
25
 
29
26
  let(:request) { double(:request) }
30
- let(:response) { double(:response) }
31
27
 
32
28
  describe "#request" do
33
29
  it "is the provided request" do
@@ -51,10 +47,10 @@ RSpec.describe "App view / Context / Request", :app_integration do
51
47
  let(:flash) { double(:flash) }
52
48
 
53
49
  before do
54
- allow(response).to receive(:flash) { flash }
50
+ allow(request).to receive(:flash) { flash }
55
51
  end
56
52
 
57
- it "is the response's flash" do
53
+ it "is the request's flash" do
58
54
  expect(context.flash).to be flash
59
55
  end
60
56
  end