hanami 2.0.0.alpha8 → 2.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +442 -241
- data/FEATURES.md +30 -9
- data/README.md +1 -3
- data/hanami.gemspec +21 -11
- data/lib/hanami/app.rb +141 -0
- data/lib/hanami/assets/application_configuration.rb +10 -4
- data/lib/hanami/configuration/actions/content_security_policy.rb +5 -5
- data/lib/hanami/configuration/actions/cookies.rb +2 -2
- data/lib/hanami/configuration/actions.rb +10 -4
- data/lib/hanami/configuration/logger.rb +4 -4
- data/lib/hanami/configuration/router.rb +2 -6
- data/lib/hanami/configuration/sessions.rb +1 -1
- data/lib/hanami/configuration/views.rb +9 -4
- data/lib/hanami/configuration.rb +118 -46
- data/lib/hanami/constants.rb +24 -2
- data/lib/hanami/errors.rb +1 -1
- data/lib/hanami/{application → extensions}/action/slice_configured_action.rb +9 -9
- data/lib/hanami/extensions/action.rb +79 -0
- data/lib/hanami/extensions/view/context.rb +106 -0
- data/lib/hanami/{application → extensions}/view/slice_configured_context.rb +10 -10
- data/lib/hanami/{application → extensions}/view/slice_configured_view.rb +12 -6
- data/lib/hanami/extensions/view.rb +33 -0
- data/lib/hanami/extensions.rb +10 -0
- data/lib/hanami/providers/inflector.rb +13 -0
- data/lib/hanami/providers/logger.rb +13 -0
- data/lib/hanami/providers/rack.rb +27 -0
- data/lib/hanami/providers/routes.rb +33 -0
- data/lib/hanami/providers/settings.rb +23 -0
- data/lib/hanami/rake_tasks.rb +61 -0
- data/lib/hanami/routes.rb +51 -0
- data/lib/hanami/server.rb +1 -1
- data/lib/hanami/settings/dotenv_store.rb +58 -0
- data/lib/hanami/settings.rb +90 -0
- data/lib/hanami/setup.rb +4 -2
- data/lib/hanami/{application → slice}/router.rb +18 -13
- data/lib/hanami/slice/routes_helper.rb +37 -0
- data/lib/hanami/{application → slice}/routing/middleware/stack.rb +43 -5
- data/lib/hanami/slice/routing/resolver.rb +97 -0
- data/lib/hanami/{application → slice}/view_name_inferrer.rb +3 -3
- data/lib/hanami/slice.rb +246 -73
- data/lib/hanami/slice_configurable.rb +4 -17
- data/lib/hanami/slice_name.rb +6 -6
- data/lib/hanami/slice_registrar.rb +119 -0
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami/web/rack_logger.rb +1 -1
- data/lib/hanami.rb +34 -26
- data/spec/integration/application_middleware_stack_spec.rb +84 -0
- data/spec/integration/assets/cdn_spec.rb +48 -0
- data/spec/integration/assets/fingerprint_spec.rb +42 -0
- data/spec/integration/assets/helpers_spec.rb +50 -0
- data/spec/integration/assets/serve_spec.rb +70 -0
- data/spec/integration/assets/subresource_integrity_spec.rb +54 -0
- data/spec/integration/body_parsers_spec.rb +50 -0
- data/spec/integration/cli/assets/precompile_spec.rb +147 -0
- data/spec/integration/cli/assets_spec.rb +14 -0
- data/spec/integration/cli/console_spec.rb +105 -0
- data/spec/integration/cli/db/apply_spec.rb +74 -0
- data/spec/integration/cli/db/console_spec.rb +40 -0
- data/spec/integration/cli/db/create_spec.rb +50 -0
- data/spec/integration/cli/db/drop_spec.rb +54 -0
- data/spec/integration/cli/db/migrate_spec.rb +108 -0
- data/spec/integration/cli/db/prepare_spec.rb +36 -0
- data/spec/integration/cli/db/rollback_spec.rb +96 -0
- data/spec/integration/cli/db/version_spec.rb +38 -0
- data/spec/integration/cli/db_spec.rb +21 -0
- data/spec/integration/cli/destroy/action_spec.rb +143 -0
- data/spec/integration/cli/destroy/app_spec.rb +118 -0
- data/spec/integration/cli/destroy/mailer_spec.rb +74 -0
- data/spec/integration/cli/destroy/migration_spec.rb +70 -0
- data/spec/integration/cli/destroy/model_spec.rb +113 -0
- data/spec/integration/cli/destroy_spec.rb +18 -0
- data/spec/integration/cli/generate/action_spec.rb +469 -0
- data/spec/integration/cli/generate/app_spec.rb +215 -0
- data/spec/integration/cli/generate/mailer_spec.rb +189 -0
- data/spec/integration/cli/generate/migration_spec.rb +72 -0
- data/spec/integration/cli/generate/model_spec.rb +290 -0
- data/spec/integration/cli/generate/secret_spec.rb +56 -0
- data/spec/integration/cli/generate_spec.rb +19 -0
- data/spec/integration/cli/new/database_spec.rb +235 -0
- data/spec/integration/cli/new/hanami_head_spec.rb +27 -0
- data/spec/integration/cli/new/template_spec.rb +118 -0
- data/spec/integration/cli/new/test_spec.rb +274 -0
- data/spec/integration/cli/new_spec.rb +970 -0
- data/spec/integration/cli/plugins_spec.rb +39 -0
- data/spec/integration/cli/routes_spec.rb +49 -0
- data/spec/integration/cli/server_spec.rb +626 -0
- data/spec/integration/cli/version_spec.rb +85 -0
- data/spec/integration/early_hints_spec.rb +35 -0
- data/spec/integration/handle_exceptions_spec.rb +244 -0
- data/spec/integration/head_spec.rb +89 -0
- data/spec/integration/http_headers_spec.rb +29 -0
- data/spec/integration/mailer_spec.rb +32 -0
- data/spec/integration/middleware_spec.rb +81 -0
- data/spec/integration/mount_applications_spec.rb +88 -0
- data/spec/integration/project_initializers_spec.rb +40 -0
- data/spec/integration/rackup_spec.rb +35 -0
- data/spec/integration/rake/with_minitest_spec.rb +67 -0
- data/spec/integration/rake/with_rspec_spec.rb +69 -0
- data/spec/integration/routing_helpers_spec.rb +61 -0
- data/spec/integration/security/content_security_policy_spec.rb +46 -0
- data/spec/integration/security/csrf_protection_spec.rb +42 -0
- data/spec/integration/security/force_ssl_spec.rb +29 -0
- data/spec/integration/security/x_content_type_options_spec.rb +46 -0
- data/spec/integration/security/x_frame_options_spec.rb +46 -0
- data/spec/integration/security/x_xss_protection_spec.rb +46 -0
- data/spec/integration/send_file_spec.rb +51 -0
- data/spec/integration/sessions_spec.rb +247 -0
- data/spec/integration/static_middleware_spec.rb +21 -0
- data/spec/integration/streaming_spec.rb +41 -0
- data/spec/integration/unsafe_send_file_spec.rb +52 -0
- data/spec/isolation/hanami/application/already_configured_spec.rb +19 -0
- data/spec/isolation/hanami/application/inherit_anonymous_class_spec.rb +10 -0
- data/spec/isolation/hanami/application/inherit_concrete_class_spec.rb +14 -0
- data/spec/isolation/hanami/application/not_configured_spec.rb +9 -0
- data/spec/isolation/hanami/application/routes/configured_spec.rb +44 -0
- data/spec/isolation/hanami/application/routes/not_configured_spec.rb +16 -0
- data/spec/isolation/hanami/boot/success_spec.rb +50 -0
- data/spec/new_integration/action/configuration_spec.rb +26 -0
- data/spec/new_integration/action/cookies_spec.rb +58 -0
- data/spec/new_integration/action/csrf_protection_spec.rb +54 -0
- data/spec/new_integration/action/routes_spec.rb +73 -0
- data/spec/new_integration/action/sessions_spec.rb +50 -0
- data/spec/new_integration/action/view_integration_spec.rb +165 -0
- data/spec/new_integration/action/view_rendering/automatic_rendering_spec.rb +247 -0
- data/spec/new_integration/action/view_rendering/paired_view_inference_spec.rb +115 -0
- data/spec/new_integration/action/view_rendering_spec.rb +107 -0
- data/spec/new_integration/code_loading/loading_from_app_spec.rb +152 -0
- data/spec/new_integration/code_loading/loading_from_slice_spec.rb +165 -0
- data/spec/new_integration/container/application_routes_helper_spec.rb +48 -0
- data/spec/new_integration/container/auto_injection_spec.rb +53 -0
- data/spec/new_integration/container/auto_registration_spec.rb +86 -0
- data/spec/new_integration/container/autoloader_spec.rb +80 -0
- data/spec/new_integration/container/imports_spec.rb +253 -0
- data/spec/new_integration/container/prepare_container_spec.rb +123 -0
- data/spec/new_integration/container/shutdown_spec.rb +91 -0
- data/spec/new_integration/container/standard_bootable_components_spec.rb +124 -0
- data/spec/new_integration/rack_app/middleware_spec.rb +215 -0
- data/spec/new_integration/rack_app/non_booted_rack_app_spec.rb +105 -0
- data/spec/new_integration/rack_app/rack_app_spec.rb +524 -0
- data/spec/new_integration/settings_spec.rb +115 -0
- data/spec/new_integration/slices/external_slice_spec.rb +92 -0
- data/spec/new_integration/slices/slice_configuration_spec.rb +40 -0
- data/spec/new_integration/slices/slice_routing_spec.rb +226 -0
- data/spec/new_integration/slices/slice_settings_spec.rb +141 -0
- data/spec/new_integration/slices_spec.rb +101 -0
- data/spec/new_integration/view/configuration_spec.rb +49 -0
- data/spec/new_integration/view/context/assets_spec.rb +67 -0
- data/spec/new_integration/view/context/inflector_spec.rb +48 -0
- data/spec/new_integration/view/context/request_spec.rb +61 -0
- data/spec/new_integration/view/context/routes_spec.rb +86 -0
- data/spec/new_integration/view/context/settings_spec.rb +50 -0
- data/spec/new_integration/view/inflector_spec.rb +57 -0
- data/spec/new_integration/view/part_namespace_spec.rb +96 -0
- data/spec/new_integration/view/path_spec.rb +56 -0
- data/spec/new_integration/view/template_spec.rb +68 -0
- data/spec/new_integration/view/views_spec.rb +103 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/app_integration.rb +91 -0
- data/spec/support/coverage.rb +1 -0
- data/spec/support/fixtures/hanami-plugin/Gemfile +8 -0
- data/spec/support/fixtures/hanami-plugin/README.md +35 -0
- data/spec/support/fixtures/hanami-plugin/Rakefile +4 -0
- data/spec/support/fixtures/hanami-plugin/bin/console +15 -0
- data/spec/support/fixtures/hanami-plugin/bin/setup +8 -0
- data/spec/support/fixtures/hanami-plugin/hanami-plugin.gemspec +28 -0
- data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin/cli.rb +19 -0
- data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin/version.rb +7 -0
- data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin.rb +8 -0
- data/spec/support/rspec.rb +27 -0
- data/spec/support/shared_examples/cli/generate/app.rb +494 -0
- data/spec/support/shared_examples/cli/generate/migration.rb +32 -0
- data/spec/support/shared_examples/cli/generate/model.rb +81 -0
- data/spec/support/shared_examples/cli/new.rb +97 -0
- data/spec/unit/hanami/configuration/actions/content_security_policy_spec.rb +102 -0
- data/spec/unit/hanami/configuration/actions/cookies_spec.rb +46 -0
- data/spec/unit/hanami/configuration/actions/csrf_protection_spec.rb +57 -0
- data/spec/unit/hanami/configuration/actions/default_values_spec.rb +52 -0
- data/spec/unit/hanami/configuration/actions/sessions_spec.rb +50 -0
- data/spec/unit/hanami/configuration/actions_spec.rb +78 -0
- data/spec/unit/hanami/configuration/base_url_spec.rb +25 -0
- data/spec/unit/hanami/configuration/inflector_spec.rb +35 -0
- data/spec/unit/hanami/configuration/logger_spec.rb +203 -0
- data/spec/unit/hanami/configuration/views_spec.rb +120 -0
- data/spec/unit/hanami/configuration_spec.rb +43 -0
- data/spec/unit/hanami/env_spec.rb +54 -0
- data/spec/unit/hanami/routes_spec.rb +25 -0
- data/spec/unit/hanami/settings/dotenv_store_spec.rb +119 -0
- data/spec/unit/hanami/settings_spec.rb +56 -0
- data/spec/unit/hanami/slice_configurable_spec.rb +104 -0
- data/spec/unit/hanami/slice_name_spec.rb +47 -0
- data/spec/unit/hanami/slice_spec.rb +17 -0
- data/spec/unit/hanami/version_spec.rb +7 -0
- data/spec/unit/hanami/web/rack_logger_spec.rb +78 -0
- metadata +353 -57
- data/lib/hanami/application/action.rb +0 -72
- data/lib/hanami/application/container/providers/inflector.rb +0 -7
- data/lib/hanami/application/container/providers/logger.rb +0 -7
- data/lib/hanami/application/container/providers/rack_logger.rb +0 -15
- data/lib/hanami/application/container/providers/rack_monitor.rb +0 -12
- data/lib/hanami/application/container/providers/routes_helper.rb +0 -9
- data/lib/hanami/application/container/providers/settings.rb +0 -7
- data/lib/hanami/application/routes.rb +0 -55
- data/lib/hanami/application/routes_helper.rb +0 -34
- data/lib/hanami/application/routing/resolver/node.rb +0 -50
- data/lib/hanami/application/routing/resolver/trie.rb +0 -59
- data/lib/hanami/application/routing/resolver.rb +0 -87
- data/lib/hanami/application/routing/router.rb +0 -36
- data/lib/hanami/application/settings/dotenv_store.rb +0 -60
- data/lib/hanami/application/settings.rb +0 -93
- data/lib/hanami/application/slice_registrar.rb +0 -106
- data/lib/hanami/application/view/context.rb +0 -95
- data/lib/hanami/application/view.rb +0 -24
- data/lib/hanami/application.rb +0 -273
- data/lib/hanami/cli/application/cli.rb +0 -40
- data/lib/hanami/cli/application/command.rb +0 -47
- data/lib/hanami/cli/application/commands/console.rb +0 -81
- data/lib/hanami/cli/application/commands.rb +0 -16
- data/lib/hanami/cli/base_command.rb +0 -48
- data/lib/hanami/cli/commands/command.rb +0 -171
- data/lib/hanami/cli/commands/server.rb +0 -88
- data/lib/hanami/cli/commands.rb +0 -65
- data/lib/hanami/configuration/middleware.rb +0 -20
- data/lib/hanami/configuration/source_dirs.rb +0 -42
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami console", type: :integration do
|
|
4
|
+
context "irb" do
|
|
5
|
+
it "starts console" do
|
|
6
|
+
project_name = "bookshelf_console_irb"
|
|
7
|
+
with_project(project_name, console: :irb) do
|
|
8
|
+
setup_model
|
|
9
|
+
|
|
10
|
+
console do |input, _, _|
|
|
11
|
+
input.puts("Hanami::VERSION")
|
|
12
|
+
input.puts("Web::App")
|
|
13
|
+
input.puts("Web.routes")
|
|
14
|
+
input.puts("BookRepository.new.all.to_a")
|
|
15
|
+
input.puts("exit")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
expect(out).to include(Hanami::VERSION)
|
|
19
|
+
expect(out).to include("Web::App")
|
|
20
|
+
expect(out).to include("#<Hanami::Routes")
|
|
21
|
+
expect(out).to include("[]")
|
|
22
|
+
expect(out).to include("[#{project_name}] [INFO]")
|
|
23
|
+
expect(out).to include("SELECT `id`, `title` FROM `books` ORDER BY `books`.`id`")
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "starts console with --engine option" do
|
|
28
|
+
with_project("bookshelf_console_irb", console: :irb) do
|
|
29
|
+
console(" --engine=irb") do |input, _, _|
|
|
30
|
+
input.puts("Hanami::VERSION")
|
|
31
|
+
input.puts("exit")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
expect(out).to include(Hanami::VERSION)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "starts console without hanami-model" do
|
|
39
|
+
project_without_hanami_model("bookshelf", gems: ["dry-struct"], console: :irb) do
|
|
40
|
+
write "lib/entities/access_token.rb", <<~EOF
|
|
41
|
+
require 'dry-struct'
|
|
42
|
+
require 'securerandom'
|
|
43
|
+
|
|
44
|
+
module Types
|
|
45
|
+
include Dry::Types.module
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class AccessToken < Dry::Struct
|
|
49
|
+
attribute :id, Types::String.default { SecureRandom.uuid }
|
|
50
|
+
attribute :secret, Types::String
|
|
51
|
+
attribute :digest, Types::String
|
|
52
|
+
end
|
|
53
|
+
EOF
|
|
54
|
+
console do |input, _, _|
|
|
55
|
+
input.puts("AccessToken.new(id: '1', secret: 'shh', digest: 'def')")
|
|
56
|
+
input.puts("exit")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
expect(out).to include('#<AccessToken id="1" secret="shh" digest="def">')
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end # irb
|
|
63
|
+
|
|
64
|
+
xit "returns error when known engine isn't bundled" do
|
|
65
|
+
with_project("bookshelf_console_irb", console: :irb) do
|
|
66
|
+
output = "Missing gem for `pry' console engine. Please make sure to add it to `Gemfile'."
|
|
67
|
+
run_cmd "hanami console --engine=pry", output, exit_status: 1
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "returns error when unknown engine is requested" do
|
|
72
|
+
with_project("bookshelf_console_irb", console: :irb) do
|
|
73
|
+
output = "Unknown console engine: `foo'."
|
|
74
|
+
run_cmd "hanami console --engine=foo", output, exit_status: 1
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "prints help message" do
|
|
79
|
+
with_project do
|
|
80
|
+
output = <<~OUT
|
|
81
|
+
Command:
|
|
82
|
+
hanami console
|
|
83
|
+
|
|
84
|
+
Usage:
|
|
85
|
+
hanami console
|
|
86
|
+
|
|
87
|
+
Description:
|
|
88
|
+
Starts Hanami console
|
|
89
|
+
|
|
90
|
+
Options:
|
|
91
|
+
--engine=VALUE # Force a specific console engine: (pry/ripl/irb)
|
|
92
|
+
--help, -h # Print this help
|
|
93
|
+
|
|
94
|
+
Examples:
|
|
95
|
+
hanami console # Uses the bundled engine
|
|
96
|
+
hanami console --engine=pry # Force to use Pry
|
|
97
|
+
OUT
|
|
98
|
+
|
|
99
|
+
run_cmd "hanami console --help", output
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# TODO: test with pry
|
|
104
|
+
# TODO: test with ripl
|
|
105
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
describe "apply" do
|
|
5
|
+
it "migrates, dumps structure, deletes migrations", if: RUBY_VERSION < '2.4' do
|
|
6
|
+
with_project do
|
|
7
|
+
versions = generate_migrations
|
|
8
|
+
|
|
9
|
+
hanami "db apply"
|
|
10
|
+
|
|
11
|
+
hanami "db version"
|
|
12
|
+
expect(out).to include(versions.last.to_s)
|
|
13
|
+
|
|
14
|
+
db = Pathname.new("db")
|
|
15
|
+
schema = db.join("schema.sql").to_s
|
|
16
|
+
migrations = db.join("migrations")
|
|
17
|
+
|
|
18
|
+
expect(schema).to have_file_content <<~SQL
|
|
19
|
+
CREATE TABLE `schema_migrations` (`filename` varchar(255) NOT NULL PRIMARY KEY);
|
|
20
|
+
CREATE TABLE `users` (`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, `name` varchar(255), `age` integer);
|
|
21
|
+
INSERT INTO "schema_migrations" VALUES('#{versions.first}_create_users.rb');
|
|
22
|
+
INSERT INTO "schema_migrations" VALUES('#{versions.last}_add_age_to_users.rb');
|
|
23
|
+
SQL
|
|
24
|
+
|
|
25
|
+
expect(migrations.children).to be_empty
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "migrates, dumps structure, deletes migrations", if: RUBY_VERSION >= '2.4' do
|
|
30
|
+
with_project do
|
|
31
|
+
versions = generate_migrations
|
|
32
|
+
|
|
33
|
+
hanami "db apply"
|
|
34
|
+
|
|
35
|
+
hanami "db version"
|
|
36
|
+
expect(out).to include(versions.last.to_s)
|
|
37
|
+
|
|
38
|
+
db = Pathname.new('db')
|
|
39
|
+
schema = db.join('schema.sql').to_s
|
|
40
|
+
migrations = db.join('migrations')
|
|
41
|
+
|
|
42
|
+
expect(schema).to have_file_content <<-SQL
|
|
43
|
+
CREATE TABLE `schema_migrations` (`filename` varchar(255) NOT NULL PRIMARY KEY);
|
|
44
|
+
CREATE TABLE `users` (`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, `name` varchar(255), `age` integer);
|
|
45
|
+
CREATE TABLE sqlite_sequence(name,seq);
|
|
46
|
+
INSERT INTO schema_migrations VALUES('#{versions.first}_create_users.rb');
|
|
47
|
+
INSERT INTO schema_migrations VALUES('#{versions.last}_add_age_to_users.rb');
|
|
48
|
+
SQL
|
|
49
|
+
|
|
50
|
+
expect(migrations.children).to be_empty
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "prints help message" do
|
|
55
|
+
with_project do
|
|
56
|
+
output = <<~OUT
|
|
57
|
+
Command:
|
|
58
|
+
hanami db apply
|
|
59
|
+
|
|
60
|
+
Usage:
|
|
61
|
+
hanami db apply
|
|
62
|
+
|
|
63
|
+
Description:
|
|
64
|
+
Migrate, dump the SQL schema, and delete the migrations (experimental)
|
|
65
|
+
|
|
66
|
+
Options:
|
|
67
|
+
--help, -h # Print this help
|
|
68
|
+
OUT
|
|
69
|
+
|
|
70
|
+
run_cmd "hanami db apply --help", output
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
describe "console" do
|
|
5
|
+
it "starts database console" do
|
|
6
|
+
with_project do
|
|
7
|
+
generate_migrations
|
|
8
|
+
hanami "db prepare"
|
|
9
|
+
|
|
10
|
+
db_console do |input, _, _|
|
|
11
|
+
input.puts('INSERT INTO users (id, name, age) VALUES(1, "Luca", 34);')
|
|
12
|
+
input.puts("SELECT * FROM users;")
|
|
13
|
+
input.puts(".quit")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
expect(out).to include("1|Luca|34")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "prints help message" do
|
|
21
|
+
with_project do
|
|
22
|
+
output = <<~OUT
|
|
23
|
+
Command:
|
|
24
|
+
hanami db console
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
hanami db console
|
|
28
|
+
|
|
29
|
+
Description:
|
|
30
|
+
Starts a database console
|
|
31
|
+
|
|
32
|
+
Options:
|
|
33
|
+
--help, -h # Print this help
|
|
34
|
+
OUT
|
|
35
|
+
|
|
36
|
+
run_cmd "hanami db console --help", output
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
describe "create" do
|
|
5
|
+
it "creates database" do
|
|
6
|
+
project = "bookshelf_db_create"
|
|
7
|
+
|
|
8
|
+
with_project(project) do
|
|
9
|
+
hanami "db create"
|
|
10
|
+
|
|
11
|
+
db = Pathname.new("db").join("#{project}_development.sqlite").to_s
|
|
12
|
+
expect(db).to be_an_existing_file
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "doesn't create in production" do
|
|
17
|
+
project = "bookshelf_db_create_production"
|
|
18
|
+
|
|
19
|
+
with_project(project) do
|
|
20
|
+
RSpec::Support::Env["HANAMI_ENV"] = "production"
|
|
21
|
+
hanami "db create"
|
|
22
|
+
|
|
23
|
+
expect(exitstatus).to eq(1)
|
|
24
|
+
|
|
25
|
+
db = Pathname.new("db").join("#{project}.sqlite").to_s
|
|
26
|
+
expect(db).to_not be_an_existing_file
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "prints help message" do
|
|
31
|
+
with_project do
|
|
32
|
+
output = <<~OUT
|
|
33
|
+
Command:
|
|
34
|
+
hanami db create
|
|
35
|
+
|
|
36
|
+
Usage:
|
|
37
|
+
hanami db create
|
|
38
|
+
|
|
39
|
+
Description:
|
|
40
|
+
Create the database (only for development/test)
|
|
41
|
+
|
|
42
|
+
Options:
|
|
43
|
+
--help, -h # Print this help
|
|
44
|
+
OUT
|
|
45
|
+
|
|
46
|
+
run_cmd 'hanami db create --help', output
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
describe "drop" do
|
|
5
|
+
it "drops database" do
|
|
6
|
+
project = "bookshelf_db_drop"
|
|
7
|
+
|
|
8
|
+
with_project(project) do
|
|
9
|
+
db = Pathname.new("db").join("#{project}_development.sqlite").to_s
|
|
10
|
+
|
|
11
|
+
hanami "db create"
|
|
12
|
+
expect(db).to be_an_existing_file
|
|
13
|
+
|
|
14
|
+
hanami "db drop"
|
|
15
|
+
expect(db).to_not be_an_existing_file
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "doesn't drop in production" do
|
|
20
|
+
project = "bookshelf_db_drop_production"
|
|
21
|
+
|
|
22
|
+
with_project(project) do
|
|
23
|
+
RSpec::Support::Env["HANAMI_ENV"] = "production"
|
|
24
|
+
db = Pathname.new("db").join("#{project}.sqlite").to_s
|
|
25
|
+
FileUtils.touch(db) # simulate existing database
|
|
26
|
+
|
|
27
|
+
hanami "db drop"
|
|
28
|
+
|
|
29
|
+
expect(exitstatus).to eq(1)
|
|
30
|
+
expect(db).to be_an_existing_file
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "prints help message" do
|
|
35
|
+
with_project do
|
|
36
|
+
output = <<~OUT
|
|
37
|
+
Command:
|
|
38
|
+
hanami db drop
|
|
39
|
+
|
|
40
|
+
Usage:
|
|
41
|
+
hanami db drop
|
|
42
|
+
|
|
43
|
+
Description:
|
|
44
|
+
Drop the database (only for development/test)
|
|
45
|
+
|
|
46
|
+
Options:
|
|
47
|
+
--help, -h # Print this help
|
|
48
|
+
OUT
|
|
49
|
+
|
|
50
|
+
run_cmd 'hanami db drop --help', output
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
describe "migrate" do
|
|
5
|
+
it "migrates database" do
|
|
6
|
+
project = "bookshelf_db_migrate"
|
|
7
|
+
|
|
8
|
+
with_project(project) do
|
|
9
|
+
generate_migrations
|
|
10
|
+
|
|
11
|
+
hanami "db create"
|
|
12
|
+
hanami "db migrate"
|
|
13
|
+
|
|
14
|
+
db = Pathname.new("db").join("#{project}_development.sqlite")
|
|
15
|
+
|
|
16
|
+
users = `sqlite3 #{db} ".schema users"`
|
|
17
|
+
expect(users).to include("CREATE TABLE `users` (`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, `name` varchar(255), `age` integer);")
|
|
18
|
+
|
|
19
|
+
version = `sqlite3 #{db} "SELECT filename FROM schema_migrations ORDER BY filename DESC LIMIT 1"`
|
|
20
|
+
expect(version).to include("add_age_to_users")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "migrates database up to a version" do
|
|
25
|
+
project = "bookshelf_db_migrate_up_to_version"
|
|
26
|
+
|
|
27
|
+
with_project(project) do
|
|
28
|
+
versions = generate_migrations
|
|
29
|
+
|
|
30
|
+
hanami "db create"
|
|
31
|
+
hanami "db migrate #{versions.first}"
|
|
32
|
+
|
|
33
|
+
db = Pathname.new("db").join("#{project}_development.sqlite")
|
|
34
|
+
|
|
35
|
+
users = `sqlite3 #{db} ".schema users"`
|
|
36
|
+
expect(users).to include("CREATE TABLE `users` (`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, `name` varchar(255));")
|
|
37
|
+
|
|
38
|
+
version = `sqlite3 #{db} "SELECT filename FROM schema_migrations ORDER BY filename DESC LIMIT 1"`
|
|
39
|
+
expect(version).to include("create_users")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "migrates database down to a version" do
|
|
44
|
+
project = "bookshelf_db_migrate_down_to_version"
|
|
45
|
+
|
|
46
|
+
with_project(project) do
|
|
47
|
+
versions = generate_migrations
|
|
48
|
+
|
|
49
|
+
hanami "db create"
|
|
50
|
+
hanami "db migrate" # up to latest version
|
|
51
|
+
hanami "db migrate #{versions.first}"
|
|
52
|
+
|
|
53
|
+
db = Pathname.new("db").join("#{project}_development.sqlite")
|
|
54
|
+
|
|
55
|
+
users = `sqlite3 #{db} ".schema users"`
|
|
56
|
+
expect(users).to include("CREATE TABLE `users`(`id` integer DEFAULT (NULL) NOT NULL PRIMARY KEY AUTOINCREMENT, `name` varchar(255) DEFAULT (NULL) NULL);")
|
|
57
|
+
|
|
58
|
+
version = `sqlite3 #{db} "SELECT filename FROM schema_migrations ORDER BY filename DESC LIMIT 1"`
|
|
59
|
+
expect(version).to include("create_users")
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "migrates database down to 0" do
|
|
64
|
+
project = "bookshelf_db_migrate_down_to_zero"
|
|
65
|
+
|
|
66
|
+
with_project(project) do
|
|
67
|
+
generate_migrations
|
|
68
|
+
|
|
69
|
+
hanami "db create"
|
|
70
|
+
hanami "db migrate" # up to latest version
|
|
71
|
+
hanami "db migrate 0"
|
|
72
|
+
|
|
73
|
+
db = Pathname.new("db").join("#{project}_development.sqlite")
|
|
74
|
+
|
|
75
|
+
users = `sqlite3 #{db} ".schema users"`
|
|
76
|
+
expect(users).to eq("")
|
|
77
|
+
|
|
78
|
+
version = `sqlite3 #{db} "SELECT filename FROM schema_migrations ORDER BY filename DESC LIMIT 1"`
|
|
79
|
+
expect(version).to eq("")
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "prints help message" do
|
|
84
|
+
with_project do
|
|
85
|
+
banner = <<~OUT
|
|
86
|
+
Command:
|
|
87
|
+
hanami db drop
|
|
88
|
+
|
|
89
|
+
Usage:
|
|
90
|
+
hanami db drop
|
|
91
|
+
|
|
92
|
+
Description:
|
|
93
|
+
Drop the database (only for development/test)
|
|
94
|
+
|
|
95
|
+
Options:
|
|
96
|
+
--help, -h # Print this help
|
|
97
|
+
OUT
|
|
98
|
+
|
|
99
|
+
output = [
|
|
100
|
+
banner,
|
|
101
|
+
# %r{ hanami db migrate [\d]{14} # Migrate to a specific version}
|
|
102
|
+
]
|
|
103
|
+
|
|
104
|
+
run_cmd 'hanami db drop --help', output
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
describe "prepare" do
|
|
5
|
+
it "prepares database" do
|
|
6
|
+
with_project do
|
|
7
|
+
versions = generate_migrations
|
|
8
|
+
|
|
9
|
+
hanami "db prepare"
|
|
10
|
+
hanami "db version"
|
|
11
|
+
|
|
12
|
+
expect(out).to include(versions.last.to_s)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "prints help message" do
|
|
17
|
+
with_project do
|
|
18
|
+
output = <<~OUT
|
|
19
|
+
Command:
|
|
20
|
+
hanami db prepare
|
|
21
|
+
|
|
22
|
+
Usage:
|
|
23
|
+
hanami db prepare
|
|
24
|
+
|
|
25
|
+
Description:
|
|
26
|
+
Drop, create, and migrate the database (only for development/test)
|
|
27
|
+
|
|
28
|
+
Options:
|
|
29
|
+
--help, -h # Print this help
|
|
30
|
+
OUT
|
|
31
|
+
|
|
32
|
+
run_cmd 'hanami db prepare --help', output
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
describe "rollback" do
|
|
5
|
+
it "rollbacks database" do
|
|
6
|
+
project = "bookshelf_db_rollback"
|
|
7
|
+
|
|
8
|
+
with_project(project) do
|
|
9
|
+
generate_migrations
|
|
10
|
+
|
|
11
|
+
hanami "db create"
|
|
12
|
+
hanami "db migrate"
|
|
13
|
+
hanami "db rollback"
|
|
14
|
+
|
|
15
|
+
db = Pathname.new("db").join("#{project}_development.sqlite")
|
|
16
|
+
|
|
17
|
+
users = `sqlite3 #{db} ".schema users"`
|
|
18
|
+
expect(users).to include("CREATE TABLE `users`(`id` integer DEFAULT (NULL) NOT NULL PRIMARY KEY AUTOINCREMENT, `name` varchar(255) DEFAULT (NULL) NULL);")
|
|
19
|
+
|
|
20
|
+
version = `sqlite3 #{db} "SELECT filename FROM schema_migrations ORDER BY filename DESC LIMIT 1"`
|
|
21
|
+
expect(version).to_not include("add_age_to_users")
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "rollbacks database using custom steps" do
|
|
26
|
+
project = "bookshelf_db_migrate_custom_steps"
|
|
27
|
+
|
|
28
|
+
with_project(project) do
|
|
29
|
+
generate_migrations
|
|
30
|
+
|
|
31
|
+
hanami "db create"
|
|
32
|
+
hanami "db migrate"
|
|
33
|
+
hanami "db rollback 2"
|
|
34
|
+
|
|
35
|
+
db = Pathname.new("db").join("#{project}_development.sqlite")
|
|
36
|
+
|
|
37
|
+
users = `sqlite3 #{db} ".schema users"`
|
|
38
|
+
expect(users).to_not include("CREATE TABLE `users`(`id` integer DEFAULT (NULL) NOT NULL PRIMARY KEY AUTOINCREMENT, `name` varchar(255) DEFAULT (NULL) NULL);")
|
|
39
|
+
|
|
40
|
+
version = `sqlite3 #{db} "SELECT filename FROM schema_migrations ORDER BY filename DESC LIMIT 1"`
|
|
41
|
+
expect(version).to_not include("create_users")
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "returns an error when steps isn't an integer" do
|
|
46
|
+
with_project do
|
|
47
|
+
generate_migrations
|
|
48
|
+
|
|
49
|
+
hanami "db create"
|
|
50
|
+
hanami "db migrate"
|
|
51
|
+
|
|
52
|
+
output = "the number of steps must be a positive integer (you entered `quindici')."
|
|
53
|
+
run_cmd "hanami db rollback quindici", output, exit_status: 1
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "returns an error when steps is 0" do
|
|
58
|
+
with_project do
|
|
59
|
+
generate_migrations
|
|
60
|
+
|
|
61
|
+
hanami "db create"
|
|
62
|
+
hanami "db migrate"
|
|
63
|
+
|
|
64
|
+
output = "the number of steps must be a positive integer (you entered `0')."
|
|
65
|
+
run_cmd "hanami db rollback 0", output, exit_status: 1
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "prints help message" do
|
|
70
|
+
with_project do
|
|
71
|
+
output = <<~OUT
|
|
72
|
+
Command:
|
|
73
|
+
hanami db rollback
|
|
74
|
+
|
|
75
|
+
Usage:
|
|
76
|
+
hanami db rollback [STEPS]
|
|
77
|
+
|
|
78
|
+
Description:
|
|
79
|
+
Rollback migrations
|
|
80
|
+
|
|
81
|
+
Arguments:
|
|
82
|
+
STEPS # Number of steps to rollback the database
|
|
83
|
+
|
|
84
|
+
Options:
|
|
85
|
+
--help, -h # Print this help
|
|
86
|
+
|
|
87
|
+
Examples:
|
|
88
|
+
hanami db rollback # Rollbacks latest migration
|
|
89
|
+
hanami db rollback 2 # Rollbacks last two migration
|
|
90
|
+
OUT
|
|
91
|
+
|
|
92
|
+
run_cmd 'hanami db rollback --help', output
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
describe "version" do
|
|
5
|
+
it "prints database version" do
|
|
6
|
+
with_project do
|
|
7
|
+
versions = generate_migrations
|
|
8
|
+
|
|
9
|
+
hanami "db create"
|
|
10
|
+
hanami "db migrate"
|
|
11
|
+
hanami "db version"
|
|
12
|
+
|
|
13
|
+
expect(out).to include(versions.last.to_s)
|
|
14
|
+
expect(out).to_not include("SELECT * FROM")
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "prints help message" do
|
|
19
|
+
with_project do
|
|
20
|
+
output = <<~OUT
|
|
21
|
+
Command:
|
|
22
|
+
hanami db version
|
|
23
|
+
|
|
24
|
+
Usage:
|
|
25
|
+
hanami db version
|
|
26
|
+
|
|
27
|
+
Description:
|
|
28
|
+
Print the current migrated version
|
|
29
|
+
|
|
30
|
+
Options:
|
|
31
|
+
--help, -h # Print this help
|
|
32
|
+
OUT
|
|
33
|
+
|
|
34
|
+
run_cmd 'hanami db version --help', output
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "hanami db", type: :integration do
|
|
4
|
+
it "prints subcommands" do
|
|
5
|
+
with_project do
|
|
6
|
+
output = <<~OUT
|
|
7
|
+
Commands:
|
|
8
|
+
hanami db apply # Migrate, dump the SQL schema, and delete the migrations (experimental)
|
|
9
|
+
hanami db console # Starts a database console
|
|
10
|
+
hanami db create # Create the database (only for development/test)
|
|
11
|
+
hanami db drop # Drop the database (only for development/test)
|
|
12
|
+
hanami db migrate [VERSION] # Migrate the database
|
|
13
|
+
hanami db prepare # Drop, create, and migrate the database (only for development/test)
|
|
14
|
+
hanami db rollback [STEPS] # Rollback migrations
|
|
15
|
+
hanami db version # Print the current migrated version
|
|
16
|
+
OUT
|
|
17
|
+
|
|
18
|
+
run_cmd "hanami db", output, exit_status: 1
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|