hanami 2.0.0.beta2 → 2.0.0.beta3

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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -1
  3. data/lib/hanami/configuration/null_configuration.rb +2 -2
  4. data/lib/hanami/configuration.rb +17 -17
  5. data/lib/hanami/routes.rb +48 -21
  6. data/lib/hanami/version.rb +1 -1
  7. data/spec/{new_integration → integration}/action/cookies_spec.rb +0 -0
  8. data/spec/{new_integration → integration}/action/csrf_protection_spec.rb +0 -0
  9. data/spec/{new_integration → integration}/action/routes_spec.rb +3 -5
  10. data/spec/{new_integration → integration}/action/sessions_spec.rb +0 -0
  11. data/spec/{new_integration → integration}/action/slice_configuration_spec.rb +0 -0
  12. data/spec/{new_integration → integration}/action/view_integration_spec.rb +0 -0
  13. data/spec/{new_integration → integration}/action/view_rendering/automatic_rendering_spec.rb +0 -0
  14. data/spec/{new_integration → integration}/action/view_rendering/paired_view_inference_spec.rb +0 -0
  15. data/spec/{new_integration → integration}/action/view_rendering_spec.rb +0 -0
  16. data/spec/{new_integration → integration}/code_loading/loading_from_app_spec.rb +0 -0
  17. data/spec/{new_integration → integration}/code_loading/loading_from_lib_spec.rb +0 -0
  18. data/spec/{new_integration → integration}/code_loading/loading_from_slice_spec.rb +0 -0
  19. data/spec/{new_integration → integration}/container/application_routes_helper_spec.rb +1 -3
  20. data/spec/{new_integration → integration}/container/auto_injection_spec.rb +0 -0
  21. data/spec/{new_integration → integration}/container/auto_registration_spec.rb +0 -0
  22. data/spec/{new_integration → integration}/container/autoloader_spec.rb +0 -0
  23. data/spec/{new_integration → integration}/container/imports_spec.rb +0 -0
  24. data/spec/{new_integration → integration}/container/prepare_container_spec.rb +0 -0
  25. data/spec/{new_integration → integration}/container/shutdown_spec.rb +0 -0
  26. data/spec/{new_integration → integration}/container/standard_bootable_components_spec.rb +0 -0
  27. data/spec/{new_integration → integration}/dotenv_loading_spec.rb +0 -0
  28. data/spec/{new_integration → integration}/rack_app/middleware_spec.rb +9 -15
  29. data/spec/{new_integration → integration}/rack_app/non_booted_rack_app_spec.rb +3 -5
  30. data/spec/{new_integration → integration}/rack_app/rack_app_spec.rb +28 -48
  31. data/spec/{new_integration → integration}/settings/access_to_constants_spec.rb +0 -0
  32. data/spec/{new_integration → integration}/settings/loading_from_env_spec.rb +0 -0
  33. data/spec/{new_integration → integration}/settings/settings_component_loading_spec.rb +0 -0
  34. data/spec/{new_integration → integration}/settings/using_types_spec.rb +0 -0
  35. data/spec/{new_integration → integration}/setup_spec.rb +20 -0
  36. data/spec/{new_integration → integration}/slices/external_slice_spec.rb +2 -4
  37. data/spec/{new_integration → integration}/slices/slice_configuration_spec.rb +0 -0
  38. data/spec/{new_integration → integration}/slices/slice_loading_spec.rb +0 -0
  39. data/spec/{new_integration → integration}/slices/slice_routing_spec.rb +5 -13
  40. data/spec/{new_integration → integration}/slices/slice_settings_spec.rb +0 -0
  41. data/spec/{new_integration → integration}/slices_spec.rb +0 -0
  42. data/spec/{new_integration → integration}/view/context/assets_spec.rb +0 -0
  43. data/spec/{new_integration → integration}/view/context/inflector_spec.rb +0 -0
  44. data/spec/{new_integration → integration}/view/context/request_spec.rb +0 -0
  45. data/spec/{new_integration → integration}/view/context/routes_spec.rb +1 -3
  46. data/spec/{new_integration → integration}/view/context/settings_spec.rb +0 -0
  47. data/spec/{new_integration → integration}/view/inflector_spec.rb +0 -0
  48. data/spec/{new_integration → integration}/view/part_namespace_spec.rb +0 -0
  49. data/spec/{new_integration → integration}/view/path_spec.rb +0 -0
  50. data/spec/{new_integration → integration}/view/slice_configuration_spec.rb +0 -0
  51. data/spec/{new_integration → integration}/view/template_spec.rb +0 -0
  52. data/spec/{new_integration → integration}/view/views_spec.rb +0 -0
  53. data/spec/unit/hanami/configuration/actions_spec.rb +4 -15
  54. data/spec/unit/hanami/configuration/router_spec.rb +45 -0
  55. data/spec/unit/hanami/configuration/views_spec.rb +4 -15
  56. data/spec/unit/hanami/version_spec.rb +1 -1
  57. metadata +97 -244
  58. data/lib/hanami/server.rb +0 -29
  59. data/spec/integration/application_middleware_stack_spec.rb +0 -84
  60. data/spec/integration/assets/cdn_spec.rb +0 -48
  61. data/spec/integration/assets/fingerprint_spec.rb +0 -42
  62. data/spec/integration/assets/helpers_spec.rb +0 -50
  63. data/spec/integration/assets/serve_spec.rb +0 -70
  64. data/spec/integration/assets/subresource_integrity_spec.rb +0 -54
  65. data/spec/integration/body_parsers_spec.rb +0 -50
  66. data/spec/integration/cli/assets/precompile_spec.rb +0 -147
  67. data/spec/integration/cli/assets_spec.rb +0 -14
  68. data/spec/integration/cli/console_spec.rb +0 -105
  69. data/spec/integration/cli/db/apply_spec.rb +0 -74
  70. data/spec/integration/cli/db/console_spec.rb +0 -40
  71. data/spec/integration/cli/db/create_spec.rb +0 -50
  72. data/spec/integration/cli/db/drop_spec.rb +0 -54
  73. data/spec/integration/cli/db/migrate_spec.rb +0 -108
  74. data/spec/integration/cli/db/prepare_spec.rb +0 -36
  75. data/spec/integration/cli/db/rollback_spec.rb +0 -96
  76. data/spec/integration/cli/db/version_spec.rb +0 -38
  77. data/spec/integration/cli/db_spec.rb +0 -21
  78. data/spec/integration/cli/destroy/action_spec.rb +0 -143
  79. data/spec/integration/cli/destroy/app_spec.rb +0 -118
  80. data/spec/integration/cli/destroy/mailer_spec.rb +0 -74
  81. data/spec/integration/cli/destroy/migration_spec.rb +0 -70
  82. data/spec/integration/cli/destroy/model_spec.rb +0 -113
  83. data/spec/integration/cli/destroy_spec.rb +0 -18
  84. data/spec/integration/cli/generate/action_spec.rb +0 -469
  85. data/spec/integration/cli/generate/app_spec.rb +0 -215
  86. data/spec/integration/cli/generate/mailer_spec.rb +0 -189
  87. data/spec/integration/cli/generate/migration_spec.rb +0 -72
  88. data/spec/integration/cli/generate/model_spec.rb +0 -290
  89. data/spec/integration/cli/generate/secret_spec.rb +0 -56
  90. data/spec/integration/cli/generate_spec.rb +0 -19
  91. data/spec/integration/cli/new/database_spec.rb +0 -235
  92. data/spec/integration/cli/new/hanami_head_spec.rb +0 -27
  93. data/spec/integration/cli/new/template_spec.rb +0 -118
  94. data/spec/integration/cli/new/test_spec.rb +0 -274
  95. data/spec/integration/cli/new_spec.rb +0 -970
  96. data/spec/integration/cli/plugins_spec.rb +0 -39
  97. data/spec/integration/cli/routes_spec.rb +0 -49
  98. data/spec/integration/cli/server_spec.rb +0 -626
  99. data/spec/integration/cli/version_spec.rb +0 -85
  100. data/spec/integration/early_hints_spec.rb +0 -35
  101. data/spec/integration/handle_exceptions_spec.rb +0 -244
  102. data/spec/integration/head_spec.rb +0 -89
  103. data/spec/integration/http_headers_spec.rb +0 -29
  104. data/spec/integration/mailer_spec.rb +0 -32
  105. data/spec/integration/middleware_spec.rb +0 -81
  106. data/spec/integration/mount_applications_spec.rb +0 -88
  107. data/spec/integration/project_initializers_spec.rb +0 -40
  108. data/spec/integration/rackup_spec.rb +0 -35
  109. data/spec/integration/rake/with_minitest_spec.rb +0 -67
  110. data/spec/integration/rake/with_rspec_spec.rb +0 -69
  111. data/spec/integration/routing_helpers_spec.rb +0 -61
  112. data/spec/integration/security/content_security_policy_spec.rb +0 -46
  113. data/spec/integration/security/csrf_protection_spec.rb +0 -42
  114. data/spec/integration/security/force_ssl_spec.rb +0 -29
  115. data/spec/integration/security/x_content_type_options_spec.rb +0 -46
  116. data/spec/integration/security/x_frame_options_spec.rb +0 -46
  117. data/spec/integration/security/x_xss_protection_spec.rb +0 -46
  118. data/spec/integration/send_file_spec.rb +0 -51
  119. data/spec/integration/sessions_spec.rb +0 -247
  120. data/spec/integration/static_middleware_spec.rb +0 -21
  121. data/spec/integration/streaming_spec.rb +0 -41
  122. data/spec/integration/unsafe_send_file_spec.rb +0 -52
  123. data/spec/support/fixtures/hanami-plugin/Gemfile +0 -8
  124. data/spec/support/fixtures/hanami-plugin/README.md +0 -35
  125. data/spec/support/fixtures/hanami-plugin/Rakefile +0 -4
  126. data/spec/support/fixtures/hanami-plugin/bin/console +0 -15
  127. data/spec/support/fixtures/hanami-plugin/bin/setup +0 -8
  128. data/spec/support/fixtures/hanami-plugin/hanami-plugin.gemspec +0 -28
  129. data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin/cli.rb +0 -19
  130. data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin/version.rb +0 -7
  131. data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin.rb +0 -8
  132. data/spec/unit/hanami/routes_spec.rb +0 -25
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "Project initializers", type: :integration do
4
- it "mounts Rack middleware" do
5
- with_project("project_initializers", gems: ["i18n"]) do
6
- write "config/locales/en.yml", <<~EOF
7
- en:
8
- greeting: "Welcome stranger"
9
- EOF
10
-
11
- write "config/initializers/i18n.rb", <<~EOF
12
- require 'i18n'
13
- I18n.load_path = Dir['config/locales/*.yml']
14
- I18n.backend.load_translations
15
- EOF
16
-
17
- generate "action web home#index --url=/"
18
- rewrite "apps/web/views/home/index.rb", <<~EOF
19
- module Web::Views::Home
20
- class Index
21
- include Web::View
22
-
23
- def greeting
24
- I18n.t(:greeting)
25
- end
26
- end
27
- end
28
- EOF
29
-
30
- rewrite "apps/web/templates/home/index.html.erb", <<~EOF
31
- <h1><%= greeting%></h1>
32
- EOF
33
- server do
34
- get "/"
35
-
36
- expect(last_response.body).to include("Welcome stranger")
37
- end
38
- end
39
- end
40
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "rackup", type: :integration do
4
- it "serves contents from database" do
5
- with_project do
6
- setup_model
7
- console do |input, _, _|
8
- input.puts("BookRepository.new.create(title: 'Learn Hanami')")
9
- input.puts("exit")
10
- end
11
-
12
- generate "action web books#show --url=/books/:id"
13
- rewrite "apps/web/controllers/books/show.rb", <<~EOF
14
- module Web::Controllers::Books
15
- class Show
16
- include Web::Action
17
- expose :book
18
-
19
- def call(params)
20
- @book = BookRepository.new.find(params[:id]) or halt(404)
21
- end
22
- end
23
- end
24
- EOF
25
- rewrite "apps/web/templates/books/show.html.erb", <<~EOF
26
- <h1><%= book.title %></h1>
27
- EOF
28
-
29
- rackup do
30
- visit "/books/1"
31
- expect(page).to have_content("Learn Hanami")
32
- end
33
- end
34
- end
35
- end
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "Rake: default task", type: :integration do
4
- context "with Minitest" do
5
- xit "runs tests" do
6
- with_project("bookshelf", test: "minitest") do
7
- setup_model
8
-
9
- prepare_development_database
10
- generate_development_data
11
-
12
- prepare_test_database
13
-
14
- write "spec/bookshelf/repositories/book_repository_spec.rb", <<~EOF
15
- require 'spec_helper'
16
-
17
- describe BookRepository do
18
- before do
19
- BookRepository.new.clear
20
- end
21
-
22
- it 'finds all the records' do
23
- BookRepository.new.all.to_a.must_equal []
24
- end
25
- end
26
- EOF
27
-
28
- bundle_exec "rake"
29
- expect(out).to include("2 runs, 3 assertions, 0 failures, 0 errors, 0 skips")
30
-
31
- assert_development_data
32
- end
33
- end
34
- end
35
-
36
- private
37
-
38
- def prepare_development_database
39
- prepare_database
40
- end
41
-
42
- def prepare_test_database
43
- prepare_database env: "test"
44
- end
45
-
46
- def generate_development_data
47
- migrate
48
-
49
- console do |input, _, _|
50
- input.puts("BookRepository.new.create(title: 'Learn Hanami')")
51
- input.puts("exit")
52
- end
53
- end
54
-
55
- def assert_development_data
56
- console do |input, _, _|
57
- input.puts("BookRepository.new.all.to_a.count")
58
- input.puts("exit")
59
- end
60
-
61
- expect(out).to include("\n1")
62
- end
63
-
64
- def prepare_database(env: nil)
65
- hanami "db prepare", env: env
66
- end
67
- end
@@ -1,69 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "Rake: default task", type: :integration do
4
- context "with RSpec" do
5
- it "runs tests" do
6
- with_project("bookshelf", test: "rspec") do
7
- setup_model
8
-
9
- prepare_development_database
10
- generate_development_data
11
-
12
- prepare_test_database
13
-
14
- generate "mailer bookshelf"
15
-
16
- write "spec/bookshelf/repositories/book_repository_spec.rb", <<~EOF
17
- RSpec.describe BookRepository do
18
- before do
19
- described_class.new.clear
20
- end
21
-
22
- it 'finds all the records' do
23
- expect(described_class.new.all.to_a).to eq([])
24
- end
25
- end
26
- EOF
27
-
28
- bundle_exec "rake"
29
-
30
- # The default mailer_spec fails on purpose so you set the correct delivery information.
31
- expect(out).to include("3 examples, 1 failure")
32
-
33
- assert_development_data
34
- end
35
- end
36
- end
37
-
38
- private
39
-
40
- def prepare_development_database
41
- prepare_database
42
- end
43
-
44
- def prepare_test_database
45
- prepare_database env: "test"
46
- end
47
-
48
- def generate_development_data
49
- migrate
50
-
51
- console do |input, _, _|
52
- input.puts("BookRepository.new.create(title: 'Learn Hanami')")
53
- input.puts("exit")
54
- end
55
- end
56
-
57
- def assert_development_data
58
- console do |input, _, _|
59
- input.puts("BookRepository.new.all.to_a.count")
60
- input.puts("exit")
61
- end
62
-
63
- expect(out).to include("\n1")
64
- end
65
-
66
- def prepare_database(env: nil)
67
- hanami "db prepare", env: env
68
- end
69
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "Routing helpers", type: :integration do
4
- it "uses routing helpers within action" do
5
- with_project do
6
- generate "action web home#index --url=/"
7
- generate "action web books#index --url=/books"
8
-
9
- # Add `as:` option, so it can be used by the routing helper
10
- replace "apps/web/config/routes.rb", "/books", "get '/books', to: 'books#index', as: :books"
11
- rewrite "apps/web/controllers/home/index.rb", <<~EOF
12
- module Web::Controllers::Home
13
- class Index
14
- include Web::Action
15
-
16
- def call(params)
17
- redirect_to routes.books_url
18
- end
19
- end
20
- end
21
- EOF
22
-
23
- server do
24
- visit "/"
25
-
26
- expect(current_path).to eq("/books")
27
- end
28
- end
29
- end
30
-
31
- it "uses routing helpers within view" do
32
- with_project do
33
- generate "action web books#index --url=/books"
34
- generate "action web books#show --url=/books/:id"
35
-
36
- # Add `as:` option, so it can be used by the routing helper
37
- replace "apps/web/config/routes.rb", "/books/:id", "get '/books/:id', to: 'books#show', as: :book"
38
- rewrite "apps/web/views/books/index.rb", <<~EOF
39
- module Web::Views::Books
40
- class Index
41
- include Web::View
42
-
43
- def featured_book_path
44
- routes.path(:book, id: 23)
45
- end
46
- end
47
- end
48
- EOF
49
- rewrite "apps/web/templates/books/index.html.erb", <<~EOF
50
- <h1>Books</h1>
51
- <h2><a href="<%= featured_book_path %>">Featured Book</a></h2>
52
- EOF
53
-
54
- server do
55
- visit "/books"
56
-
57
- expect(page.body).to include(%(<a href="/books/23">Featured Book</a>))
58
- end
59
- end
60
- end
61
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "Content-Security-Policy header", type: :integration do
4
- it "returns default value" do
5
- with_project do
6
- generate "action web home#index --url=/"
7
-
8
- server do
9
- get "/"
10
-
11
- expect(last_response.status).to eq(200)
12
- expect(last_response.headers["Content-Security-Policy"]).to eq("form-action 'self'; frame-ancestors 'self'; base-uri 'self'; default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self' https: data:; style-src 'self' 'unsafe-inline' https:; font-src 'self'; object-src 'none'; plugin-types app/pdf; child-src 'self'; frame-src 'self'; media-src 'self'")
13
- end
14
- end
15
- end
16
-
17
- it "returns custom value" do
18
- with_project do
19
- generate "action web home#index --url=/"
20
-
21
- replace "apps/web/app.rb", "script-src 'self';", "script-src 'self' https://code.jquery.com;"
22
-
23
- server do
24
- get "/"
25
-
26
- expect(last_response.status).to eq(200)
27
- expect(last_response.headers["Content-Security-Policy"]).to eq("form-action 'self'; frame-ancestors 'self'; base-uri 'self'; default-src 'none'; script-src 'self' https://code.jquery.com; connect-src 'self'; img-src 'self' https: data:; style-src 'self' 'unsafe-inline' https:; font-src 'self'; object-src 'none'; plugin-types app/pdf; child-src 'self'; frame-src 'self'; media-src 'self'")
28
- end
29
- end
30
- end
31
-
32
- it "doesn't send header if setting is removed" do
33
- with_project do
34
- generate "action web home#index --url=/"
35
-
36
- replace "apps/web/app.rb", "security.content_security_policy %{", "%{"
37
-
38
- server do
39
- get "/"
40
-
41
- expect(last_response.status).to eq(200)
42
- expect(last_response.headers).to_not have_key("Content-Security-Policy")
43
- end
44
- end
45
- end
46
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "CSRF protection", type: :integration do
4
- it "protects POST endpoints from invalid token" do
5
- with_project do
6
- generate "action web books#create --url=/books --method=POST"
7
- replace "apps/web/app.rb", "# sessions :cookie, secret: ENV['WEB_SESSIONS_SECRET']", "sessions :cookie, secret: ENV['WEB_SESSIONS_SECRET']"
8
-
9
- server do
10
- post "/books", title: "TDD", _csrf_token: "invalid"
11
-
12
- expect(last_response.status).to eq(500)
13
- end
14
- end
15
- end
16
-
17
- it "protects PATCH endpoints from invalid token" do
18
- with_project do
19
- generate "action web books#update --url=/books/:id --method=PATCH"
20
- replace "apps/web/app.rb", "# sessions :cookie, secret: ENV['WEB_SESSIONS_SECRET']", "sessions :cookie, secret: ENV['WEB_SESSIONS_SECRET']"
21
-
22
- server do
23
- patch "/books/1", title: "Foo", _csrf_token: "invalid"
24
-
25
- expect(last_response.status).to eq(500)
26
- end
27
- end
28
- end
29
-
30
- it "protects DELETE endpoints from invalid token" do
31
- with_project do
32
- generate "action web books#destroy --url=/books/:id --method=DELETE"
33
- replace "apps/web/app.rb", "# sessions :cookie, secret: ENV['WEB_SESSIONS_SECRET']", "sessions :cookie, secret: ENV['WEB_SESSIONS_SECRET']"
34
-
35
- server do
36
- delete "/books/1", _csrf_token: "invalid"
37
-
38
- expect(last_response.status).to eq(500)
39
- end
40
- end
41
- end
42
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "force SSL", type: :integration do
4
- it "forces SSL" do
5
- project = "bookshelf_force_ssl"
6
-
7
- with_project(project, server: :puma) do
8
- generate "action web home#index --url=/"
9
-
10
- inject_line_after "apps/web/app.rb", "configure do", "force_ssl true"
11
-
12
- RSpec::Support::Env["HANAMI_ENV"] = "production"
13
- RSpec::Support::Env["DATABASE_URL"] = "sqlite://#{Pathname.new('db').join('bookshelf.sqlite')}"
14
- RSpec::Support::Env["SMTP_HOST"] = "localhost"
15
- RSpec::Support::Env["SMTP_PORT"] = "25"
16
-
17
- # key = Pathname.new(__dir__).join("..", "fixtures", "openssl", "server.key").realpath
18
- # cert = Pathname.new(__dir__).join("..", "fixtures", "openssl", "server.crt").realpath
19
-
20
- # bundle_exec "puma -b 'ssl://127.0.0.1:2300?key=#{key}&cert=#{cert}'" do
21
- server do
22
- # FIXME: I know, it's lame how I solved this problem, but I can't get Excon to do SSL handshake
23
- expect do
24
- get "/"
25
- end.to raise_error(Excon::Error::Socket)
26
- end
27
- end
28
- end
29
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "X-Content-Type-Options header", type: :integration do
4
- it "returns default value" do
5
- with_project do
6
- generate "action web home#index --url=/"
7
-
8
- server do
9
- get "/"
10
-
11
- expect(last_response.status).to eq(200)
12
- expect(last_response.headers["X-Content-Type-Options"]).to eq("nosniff")
13
- end
14
- end
15
- end
16
-
17
- it "returns custom value" do
18
- with_project do
19
- generate "action web home#index --url=/"
20
-
21
- replace "apps/web/app.rb", "security.x_content_type_options 'nosniff'", "security.x_content_type_options 'foo'"
22
-
23
- server do
24
- get "/"
25
-
26
- expect(last_response.status).to eq(200)
27
- expect(last_response.headers["X-Content-Type-Options"]).to eq("foo")
28
- end
29
- end
30
- end
31
-
32
- it "doesn't send header if setting is removed" do
33
- with_project do
34
- generate "action web home#index --url=/"
35
-
36
- replace "apps/web/app.rb", "security.x_content_type_options 'nosniff'", ""
37
-
38
- server do
39
- get "/"
40
-
41
- expect(last_response.status).to eq(200)
42
- expect(last_response.headers).to_not have_key("X-Content-Type-Options")
43
- end
44
- end
45
- end
46
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "X-Frame-Options header", type: :integration do
4
- it "returns default value" do
5
- with_project do
6
- generate "action web home#index --url=/"
7
-
8
- server do
9
- get "/"
10
-
11
- expect(last_response.status).to eq(200)
12
- expect(last_response.headers["X-Frame-Options"]).to eq("DENY")
13
- end
14
- end
15
- end
16
-
17
- it "returns custom value" do
18
- with_project do
19
- generate "action web home#index --url=/"
20
-
21
- replace "apps/web/app.rb", "security.x_frame_options 'DENY'", "security.x_frame_options 'ALLOW-FROM https://example.test/'"
22
-
23
- server do
24
- get "/"
25
-
26
- expect(last_response.status).to eq(200)
27
- expect(last_response.headers["X-Frame-Options"]).to eq("ALLOW-FROM https://example.test/")
28
- end
29
- end
30
- end
31
-
32
- it "doesn't send header if setting is removed" do
33
- with_project do
34
- generate "action web home#index --url=/"
35
-
36
- replace "apps/web/app.rb", "security.x_frame_options 'DENY'", ""
37
-
38
- server do
39
- get "/"
40
-
41
- expect(last_response.status).to eq(200)
42
- expect(last_response.headers).to_not have_key("X-Frame-Options")
43
- end
44
- end
45
- end
46
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "X-XSS-Protection header", type: :integration do
4
- it "returns default value" do
5
- with_project do
6
- generate "action web home#index --url=/"
7
-
8
- server do
9
- get "/"
10
-
11
- expect(last_response.status).to eq(200)
12
- expect(last_response.headers["X-XSS-Protection"]).to eq("1; mode=block")
13
- end
14
- end
15
- end
16
-
17
- it "returns custom value" do
18
- with_project do
19
- generate "action web home#index --url=/"
20
-
21
- replace "apps/web/app.rb", "security.x_xss_protection '1; mode=block'", "security.x_xss_protection '0'"
22
-
23
- server do
24
- get "/"
25
-
26
- expect(last_response.status).to eq(200)
27
- expect(last_response.headers["X-XSS-Protection"]).to eq("0")
28
- end
29
- end
30
- end
31
-
32
- it "doesn't send header if setting is removed" do
33
- with_project do
34
- generate "action web home#index --url=/"
35
-
36
- replace "apps/web/app.rb", "security.x_xss_protection '1; mode=block'", ""
37
-
38
- server do
39
- get "/"
40
-
41
- expect(last_response.status).to eq(200)
42
- expect(last_response.headers).to_not have_key("X-XSS-Protection")
43
- end
44
- end
45
- end
46
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "Send file", type: :integration do
4
- it "sends file from the public directory" do
5
- with_project do
6
- write "public/static.txt", "Static file"
7
- generate "action web home#index --url=/"
8
- rewrite "apps/web/controllers/home/index.rb", <<~EOF
9
- module Web::Controllers::Home
10
- class Index
11
- include Web::Action
12
-
13
- def call(params)
14
- send_file "static.txt"
15
- end
16
- end
17
- end
18
- EOF
19
-
20
- server do
21
- get "/"
22
-
23
- expect(last_response.status).to eq(200)
24
- expect(last_response.body).to include("Static file")
25
- end
26
- end
27
- end
28
-
29
- it "doesn't send file outside of public directory" do
30
- with_project do
31
- generate "action web home#index --url=/"
32
- rewrite "apps/web/controllers/home/index.rb", <<~EOF
33
- module Web::Controllers::Home
34
- class Index
35
- include Web::Action
36
-
37
- def call(params)
38
- send_file __FILE__
39
- end
40
- end
41
- end
42
- EOF
43
-
44
- server do
45
- get "/"
46
-
47
- expect(last_response.status).to eq(404)
48
- end
49
- end
50
- end
51
- end