rider-kick 0.0.13 → 0.0.14

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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +629 -25
  3. data/lib/generators/rider_kick/USAGE +2 -0
  4. data/lib/generators/rider_kick/base_generator.rb +190 -0
  5. data/lib/generators/rider_kick/clean_arch_generator.rb +235 -45
  6. data/lib/generators/rider_kick/clean_arch_generator_engine_spec.rb +359 -0
  7. data/lib/generators/rider_kick/clean_arch_generator_factory_bot_spec.rb +131 -0
  8. data/lib/generators/rider_kick/entity_type_mapping_spec.rb +22 -13
  9. data/lib/generators/rider_kick/errors.rb +42 -0
  10. data/lib/generators/rider_kick/factory_generator.rb +238 -0
  11. data/lib/generators/rider_kick/factory_generator_spec.rb +175 -0
  12. data/lib/generators/rider_kick/repositories_contract_spec.rb +95 -22
  13. data/lib/generators/rider_kick/scaffold_generator.rb +377 -62
  14. data/lib/generators/rider_kick/scaffold_generator_builder_uploaders_spec.rb +119 -14
  15. data/lib/generators/rider_kick/scaffold_generator_conditional_filtering_spec.rb +820 -0
  16. data/lib/generators/rider_kick/scaffold_generator_contracts_spec.rb +37 -10
  17. data/lib/generators/rider_kick/scaffold_generator_contracts_with_scope_spec.rb +40 -11
  18. data/lib/generators/rider_kick/scaffold_generator_engine_spec.rb +221 -0
  19. data/lib/generators/rider_kick/scaffold_generator_idempotent_spec.rb +38 -13
  20. data/lib/generators/rider_kick/scaffold_generator_list_spec_format_spec.rb +153 -0
  21. data/lib/generators/rider_kick/scaffold_generator_rspec_spec.rb +347 -0
  22. data/lib/generators/rider_kick/scaffold_generator_success_spec.rb +31 -12
  23. data/lib/generators/rider_kick/scaffold_generator_with_scope_spec.rb +32 -11
  24. data/lib/generators/rider_kick/structure_generator.rb +154 -43
  25. data/lib/generators/rider_kick/structure_generator_comprehensive_spec.rb +598 -0
  26. data/lib/generators/rider_kick/structure_generator_engine_spec.rb +279 -0
  27. data/lib/generators/rider_kick/structure_generator_spec.rb +3 -3
  28. data/lib/generators/rider_kick/structure_generator_success_spec.rb +33 -5
  29. data/lib/generators/rider_kick/structure_generator_unit_spec.rb +2202 -0
  30. data/lib/generators/rider_kick/templates/.rubocop.yml +5 -4
  31. data/lib/generators/rider_kick/templates/config/initializers/version.rb.tt +1 -1
  32. data/lib/generators/rider_kick/templates/db/migrate/20220613145533_init_database.rb +1 -1
  33. data/lib/generators/rider_kick/templates/db/structures/example.yaml.tt +140 -66
  34. data/lib/generators/rider_kick/templates/domains/core/builders/builder.rb.tt +36 -10
  35. data/lib/generators/rider_kick/templates/domains/core/builders/builder_spec.rb.tt +219 -0
  36. data/lib/generators/rider_kick/templates/domains/core/builders/error.rb.tt +2 -2
  37. data/lib/generators/rider_kick/templates/domains/core/builders/pagination.rb.tt +2 -2
  38. data/lib/generators/rider_kick/templates/domains/core/entities/entity.rb.tt +32 -14
  39. data/lib/generators/rider_kick/templates/domains/core/entities/error.rb.tt +1 -1
  40. data/lib/generators/rider_kick/templates/domains/core/entities/pagination.rb.tt +1 -1
  41. data/lib/generators/rider_kick/templates/domains/core/repositories/abstract_repository.rb.tt +4 -4
  42. data/lib/generators/rider_kick/templates/domains/core/repositories/create.rb.tt +2 -2
  43. data/lib/generators/rider_kick/templates/domains/core/repositories/create_spec.rb.tt +78 -0
  44. data/lib/generators/rider_kick/templates/domains/core/repositories/destroy.rb.tt +2 -2
  45. data/lib/generators/rider_kick/templates/domains/core/repositories/destroy_spec.rb.tt +88 -0
  46. data/lib/generators/rider_kick/templates/domains/core/repositories/fetch_by_id.rb.tt +3 -3
  47. data/lib/generators/rider_kick/templates/domains/core/repositories/fetch_by_id_spec.rb.tt +62 -0
  48. data/lib/generators/rider_kick/templates/domains/core/repositories/list.rb.tt +13 -8
  49. data/lib/generators/rider_kick/templates/domains/core/repositories/list_spec.rb.tt +190 -0
  50. data/lib/generators/rider_kick/templates/domains/core/repositories/update.rb.tt +4 -4
  51. data/lib/generators/rider_kick/templates/domains/core/repositories/update_spec.rb.tt +119 -0
  52. data/lib/generators/rider_kick/templates/domains/core/use_cases/contract/default.rb.tt +1 -1
  53. data/lib/generators/rider_kick/templates/domains/core/use_cases/contract/pagination.rb.tt +1 -1
  54. data/lib/generators/rider_kick/templates/domains/core/use_cases/create.rb.tt +3 -7
  55. data/lib/generators/rider_kick/templates/domains/core/use_cases/create_spec.rb.tt +71 -0
  56. data/lib/generators/rider_kick/templates/domains/core/use_cases/destroy.rb.tt +3 -7
  57. data/lib/generators/rider_kick/templates/domains/core/use_cases/destroy_spec.rb.tt +62 -0
  58. data/lib/generators/rider_kick/templates/domains/core/use_cases/fetch_by_id.rb.tt +3 -7
  59. data/lib/generators/rider_kick/templates/domains/core/use_cases/fetch_by_id_spec.rb.tt +62 -0
  60. data/lib/generators/rider_kick/templates/domains/core/use_cases/get_version.rb.tt +2 -2
  61. data/lib/generators/rider_kick/templates/domains/core/use_cases/list.rb.tt +3 -7
  62. data/lib/generators/rider_kick/templates/domains/core/use_cases/list_spec.rb.tt +64 -0
  63. data/lib/generators/rider_kick/templates/domains/core/use_cases/update.rb.tt +3 -7
  64. data/lib/generators/rider_kick/templates/domains/core/use_cases/update_spec.rb.tt +73 -0
  65. data/lib/generators/rider_kick/templates/domains/core/utils/abstract_utils.rb.tt +3 -3
  66. data/lib/generators/rider_kick/templates/domains/core/utils/request_methods.rb.tt +1 -1
  67. data/lib/generators/rider_kick/templates/env.development +1 -1
  68. data/lib/generators/rider_kick/templates/env.production +1 -1
  69. data/lib/generators/rider_kick/templates/env.test +1 -1
  70. data/lib/generators/rider_kick/templates/models/{application_record.rb → application_record.rb.tt} +3 -1
  71. data/lib/generators/rider_kick/templates/models/model_spec.rb.tt +68 -0
  72. data/lib/generators/rider_kick/templates/spec/factories/.gitkeep +19 -0
  73. data/lib/generators/rider_kick/templates/spec/factories/factory.rb.tt +8 -0
  74. data/lib/generators/rider_kick/templates/spec/rails_helper.rb +2 -0
  75. data/lib/generators/rider_kick/templates/spec/support/class_stubber.rb +148 -0
  76. data/lib/generators/rider_kick/templates/spec/support/factory_bot.rb +34 -0
  77. data/lib/generators/rider_kick/templates/spec/support/faker.rb +61 -0
  78. data/lib/rider-kick.rb +8 -6
  79. data/lib/rider_kick/builders/abstract_active_record_entity_builder_spec.rb +644 -0
  80. data/lib/rider_kick/configuration.rb +238 -0
  81. data/lib/rider_kick/configuration_engine_spec.rb +377 -0
  82. data/lib/rider_kick/entities/failure_details.rb +1 -1
  83. data/lib/rider_kick/entities/failure_details_spec.rb +1 -1
  84. data/lib/rider_kick/matchers/use_case_result.rb +1 -1
  85. data/lib/rider_kick/use_cases/abstract_use_case.rb +1 -1
  86. data/lib/rider_kick/version.rb +1 -1
  87. metadata +129 -8
  88. data/CHANGELOG.md +0 -5
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe <%= domain_class_name %>::Repositories::<%= @scope_class %>::<%= @repository_class %>, type: :repository do
6
+ describe '#call' do
7
+ let(:builder) { instance_double(<%= domain_class_name %>::Builders::<%= @subject_class %>) }
8
+ let(:entity) { instance_double(<%= domain_class_name %>::Entities::<%= @subject_class %>) }
9
+ let(:<%= @variable_subject %>) { instance_double(<%= @model_class %>) }
10
+ let(:<%= @variable_subject %>_id) { 'test-id-123' }
11
+
12
+ let(:valid_params) do
13
+ Hashie::Mash.new({
14
+ id: <%= @variable_subject %>_id,
15
+ <% if @resource_owner_id.present? && @has_resource_owner_id_in_update_contract -%>
16
+ <%= @resource_owner_id %>: '<%= @resource_owner_id %>_value',
17
+ <% end -%>
18
+ <% @fields.first(2).each_with_index do |field, index| -%>
19
+ <% next if @resource_owner_id.present? && field == @resource_owner_id -%>
20
+ <% field_meta = columns_meta.find { |col| col[:name] == field } -%>
21
+ <% if field_meta && [:datetime, :timestamp].include?(field_meta[:type]) -%>
22
+ <%= field %>: Time.zone.now<%= index < @fields.first(2).length - 1 ? ',' : '' %>
23
+ <% else -%>
24
+ <%= field %>: 'updated_<%= field %>_value'<%= index < @fields.first(2).length - 1 ? ',' : '' %>
25
+ <% end -%>
26
+ <% end -%>
27
+ })
28
+ end
29
+
30
+ let(:error_messages) do
31
+ [
32
+ { 'attribute' => '<%= @fields.first %>', 'type' => 'blank', 'options' => { 'message' => 'must be valid format' } },
33
+ { 'attribute' => '<%= @fields[1] || @fields.first %>', 'type' => 'invalid', 'options' => { 'message' => 'must be valid format' } }
34
+ ]
35
+ end
36
+
37
+ let(:active_model_errors) do
38
+ errors = double('errors')
39
+ allow(errors).to receive(:each).and_yield(
40
+ double(as_json: error_messages.first)
41
+ ).and_yield(
42
+ double(as_json: error_messages.last)
43
+ )
44
+ errors
45
+ end
46
+
47
+ subject(:repository) { described_class.new(params: valid_params) }
48
+
49
+ before do
50
+ allow(<%= domain_class_name %>::Builders::<%= @subject_class %>).to receive(:new).with(<%= @variable_subject %>).and_return(builder)
51
+ allow(builder).to receive(:build).and_return(entity)
52
+ end
53
+
54
+ context 'when <%= @variable_subject %> exists' do
55
+ before do
56
+ <% if @resource_owner_id.present? && @has_resource_owner_id_in_update_contract -%>
57
+ allow(<%= @model_class %>).to receive(:find_by).with(
58
+ id: <%= @variable_subject %>_id,
59
+ <%= @resource_owner_id %>: valid_params.<%= @resource_owner_id %>
60
+ ).and_return(<%= @variable_subject %>)
61
+ <% else -%>
62
+ allow(<%= @model_class %>).to receive(:find_by).with(id: <%= @variable_subject %>_id).and_return(<%= @variable_subject %>)
63
+ <% end -%>
64
+ end
65
+
66
+ context 'when update is successful' do
67
+ it 'updates the <%= @variable_subject %> and returns success with entity', :aggregate_failures do
68
+ <% if @uploaders.present? -%>
69
+ <% @uploaders.each do |uploader| -%>
70
+ allow(<%= @variable_subject %>).to receive(:<%= uploader.name %>).and_return(double(attached?: false))
71
+ <% end -%>
72
+ <% end -%>
73
+ allow(<%= @variable_subject %>).to receive(:update).and_return(true)
74
+
75
+ result = repository.call(builder: true)
76
+
77
+ expect(result).to be_success
78
+ expect(result.value!).to eq(entity)
79
+ end
80
+ end
81
+
82
+ context 'when update fails' do
83
+ it 'returns failure with errors', :aggregate_failures do
84
+ <% if @uploaders.present? -%>
85
+ <% @uploaders.each do |uploader| -%>
86
+ allow(<%= @variable_subject %>).to receive(:<%= uploader.name %>).and_return(double(attached?: false))
87
+ <% end -%>
88
+ <% end -%>
89
+ allow(<%= @variable_subject %>).to receive(:update).and_return(false)
90
+ allow(<%= @variable_subject %>).to receive(:errors).and_return(active_model_errors)
91
+
92
+ result = repository.call(builder: true)
93
+
94
+ expect(result).to be_failure
95
+ # Verify error structure matches build_errors output
96
+ expect(result.failure).to be_an(Array)
97
+ end
98
+ end
99
+ end
100
+
101
+ context 'when <%= @variable_subject %> does not exist' do
102
+ it 'returns failure with not found message', :aggregate_failures do
103
+ <% if @resource_owner_id.present? && @has_resource_owner_id_in_update_contract -%>
104
+ allow(<%= @model_class %>).to receive(:find_by).with(
105
+ id: <%= @variable_subject %>_id,
106
+ <%= @resource_owner_id %>: valid_params.<%= @resource_owner_id %>
107
+ ).and_return(nil)
108
+ <% else -%>
109
+ allow(<%= @model_class %>).to receive(:find_by).with(id: <%= @variable_subject %>_id).and_return(nil)
110
+ <% end -%>
111
+
112
+ result = repository.call(builder: true)
113
+
114
+ expect(result).to be_failure
115
+ expect(result.failure).to eq('<%= @subject_class %> not found')
116
+ end
117
+ end
118
+ end
119
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Core::UseCases::Contract::Default
3
+ class <%= domain_class_name %>::UseCases::Contract::Default
4
4
  def call
5
5
  default
6
6
  end
@@ -1,4 +1,4 @@
1
- class Core::UseCases::Contract::Pagination
1
+ class <%= domain_class_name %>::UseCases::Contract::Pagination
2
2
  def call
3
3
  pagination
4
4
  end
@@ -1,13 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
3
+ class <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
4
4
  contract do
5
- params(Core::UseCases::Contract::Default.new.call) do
6
- <% if @resource_owner_id.present? -%>
7
- required(:<%= @resource_owner_id %>).filled(:string)
8
- <% end -%>
5
+ params(<%= domain_class_name %>::UseCases::Contract::Default.new.call) do
9
6
  <% @contract_create.each do |field| -%>
10
- <% next if field.include?("#{@resource_owner_id}") && @resource_owner_id.present? -%>
11
7
  <%= field %>
12
8
  <% end -%>
13
9
  end
@@ -17,6 +13,6 @@ class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].re
17
13
 
18
14
  def result
19
15
  params = yield build_parameter!
20
- Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
16
+ <%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
21
17
  end
22
18
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %>, type: :use_case do
6
+ describe '#call' do
7
+ let(:repository) { instance_double(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>) }
8
+ let(:entity) { instance_double(<%= domain_class_name %>::Entities::<%= @subject_class %>) }
9
+
10
+ let(:valid_params) do
11
+ {
12
+ <% if @resource_owner_id.present? -%>
13
+ <%= @resource_owner_id %>: '<%= @resource_owner_id %>_value',
14
+ <% end -%>
15
+ <% @fields.each_with_index do |field, index| -%>
16
+ <% next if @resource_owner_id.present? && field == @resource_owner_id -%>
17
+ <% field_meta = columns_meta.find { |col| col[:name] == field } -%>
18
+ <% if field_meta && [:datetime, :timestamp].include?(field_meta[:type]) -%>
19
+ <%= field %>: Time.zone.now<%= index < @fields.length - 1 ? ',' : '' %>
20
+ <% else -%>
21
+ <%= field %>: '<%= field %>_value'<%= index < @fields.length - 1 ? ',' : '' %>
22
+ <% end -%>
23
+ <% end -%>
24
+ }
25
+ end
26
+
27
+ before do
28
+ allow(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>)
29
+ .to receive(:new)
30
+ .with(params: anything)
31
+ .and_return(repository)
32
+ end
33
+
34
+ context 'when parameters are valid' do
35
+ it 'creates a new <%= @variable_subject %> successfully', :aggregate_failures do
36
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Success(entity))
37
+
38
+ contract = described_class.contract!(valid_params)
39
+ result = described_class.new(contract).result
40
+
41
+ expect(result).to be_success
42
+ expect(result.value!).to eq(entity)
43
+ end
44
+ end
45
+
46
+ context 'when parameters are invalid' do
47
+ it 'returns failure with validation errors' do
48
+ invalid_params = {}
49
+
50
+ contract = described_class.contract!(invalid_params)
51
+ result = described_class.new(contract).result
52
+
53
+ expect(result).to be_failure
54
+ end
55
+ end
56
+
57
+ context 'when repository fails' do
58
+ it 'returns failure', :aggregate_failures do
59
+ error = instance_double(<%= domain_class_name %>::Entities::Error)
60
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Failure(error))
61
+
62
+ contract = described_class.contract!(valid_params)
63
+ result = described_class.new(contract).result
64
+
65
+ expect(result).to be_failure
66
+ expect(result.failure).to eq(error)
67
+ end
68
+ end
69
+ end
70
+ end
71
+
@@ -1,16 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
3
+ class <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
4
4
  contract do
5
- params(Core::UseCases::Contract::Default.new.call) do
5
+ params(<%= domain_class_name %>::UseCases::Contract::Default.new.call) do
6
6
  required(:id).filled(:string)
7
7
  <% @contract_destroy.each do |field| -%>
8
- <% next if field.include?("#{@resource_owner_id}") && @resource_owner_id.present? -%>
9
8
  <% next if field.include?("(:id)") -%>
10
9
  <%= field %>
11
- <% end -%>
12
- <% if @resource_owner_id.present? -%>
13
- required(:<%= @resource_owner_id %>).filled(:string)
14
10
  <% end -%>
15
11
  end
16
12
  end
@@ -19,6 +15,6 @@ class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].re
19
15
 
20
16
  def result
21
17
  params = yield build_parameter!
22
- Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
18
+ <%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
23
19
  end
24
20
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %>, type: :use_case do
6
+ describe '#call' do
7
+ let(:repository) { instance_double(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>) }
8
+ let(:entity) { instance_double(<%= domain_class_name %>::Entities::<%= @subject_class %>) }
9
+ let(:<%= @variable_subject %>_id) { 'test-id-123' }
10
+
11
+ let(:valid_params) do
12
+ {
13
+ id: <%= @variable_subject %>_id<% if @resource_owner_id.present? && @has_resource_owner_id_in_destroy_contract %>,
14
+ <%= @resource_owner_id %>: '<%= @resource_owner_id %>_value'<% end %>
15
+ }
16
+ end
17
+
18
+ before do
19
+ allow(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>)
20
+ .to receive(:new)
21
+ .with(params: anything)
22
+ .and_return(repository)
23
+ end
24
+
25
+ context 'when parameters are valid' do
26
+ it 'destroys the <%= @variable_subject %> successfully', :aggregate_failures do
27
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Success(entity))
28
+
29
+ contract = described_class.contract!(valid_params)
30
+ result = described_class.new(contract).result
31
+
32
+ expect(result).to be_success
33
+ expect(result.value!).to eq(entity)
34
+ end
35
+ end
36
+
37
+ context 'when parameters are invalid' do
38
+ it 'returns failure when id is missing' do
39
+ invalid_params = {}
40
+
41
+ contract = described_class.contract!(invalid_params)
42
+ result = described_class.new(contract).result
43
+
44
+ expect(result).to be_failure
45
+ end
46
+ end
47
+
48
+ context 'when repository fails' do
49
+ it 'returns failure', :aggregate_failures do
50
+ error = instance_double(<%= domain_class_name %>::Entities::Error)
51
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Failure(error))
52
+
53
+ contract = described_class.contract!(valid_params)
54
+ result = described_class.new(contract).result
55
+
56
+ expect(result).to be_failure
57
+ expect(result.failure).to eq(error)
58
+ end
59
+ end
60
+ end
61
+ end
62
+
@@ -1,16 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
3
+ class <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
4
4
  contract do
5
- params(Core::UseCases::Contract::Default.new.call) do
5
+ params(<%= domain_class_name %>::UseCases::Contract::Default.new.call) do
6
6
  required(:id).filled(:string)
7
7
  <% @contract_fetch_by_id.each do |field| -%>
8
- <% next if field.include?("#{@resource_owner_id}") && @resource_owner_id.present? -%>
9
8
  <% next if field.include?("(:id)") -%>
10
9
  <%= field %>
11
- <% end -%>
12
- <% if @resource_owner_id.present? -%>
13
- required(:<%= @resource_owner_id %>).filled(:string)
14
10
  <% end -%>
15
11
  end
16
12
  end
@@ -19,6 +15,6 @@ class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].re
19
15
 
20
16
  def result
21
17
  params = yield build_parameter!
22
- Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
18
+ <%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
23
19
  end
24
20
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %>, type: :use_case do
6
+ describe '#call' do
7
+ let(:repository) { instance_double(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>) }
8
+ let(:entity) { instance_double(<%= domain_class_name %>::Entities::<%= @subject_class %>) }
9
+ let(:<%= @variable_subject %>_id) { 'test-id-123' }
10
+
11
+ let(:valid_params) do
12
+ {
13
+ id: <%= @variable_subject %>_id<% if @resource_owner_id.present? && @has_resource_owner_id_in_fetch_by_id_contract %>,
14
+ <%= @resource_owner_id %>: '<%= @resource_owner_id %>_value'<% end %>
15
+ }
16
+ end
17
+
18
+ before do
19
+ allow(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>)
20
+ .to receive(:new)
21
+ .with(params: anything)
22
+ .and_return(repository)
23
+ end
24
+
25
+ context 'when parameters are valid' do
26
+ it 'fetches the <%= @variable_subject %> successfully', :aggregate_failures do
27
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Success(entity))
28
+
29
+ contract = described_class.contract!(valid_params)
30
+ result = described_class.new(contract).result
31
+
32
+ expect(result).to be_success
33
+ expect(result.value!).to eq(entity)
34
+ end
35
+ end
36
+
37
+ context 'when parameters are invalid' do
38
+ it 'returns failure when id is missing' do
39
+ invalid_params = {}
40
+
41
+ contract = described_class.contract!(invalid_params)
42
+ result = described_class.new(contract).result
43
+
44
+ expect(result).to be_failure
45
+ end
46
+ end
47
+
48
+ context 'when <%= @variable_subject %> is not found' do
49
+ it 'returns failure', :aggregate_failures do
50
+ error = instance_double(<%= domain_class_name %>::Entities::Error)
51
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Failure(error))
52
+
53
+ contract = described_class.contract!(valid_params)
54
+ result = described_class.new(contract).result
55
+
56
+ expect(result).to be_failure
57
+ expect(result.failure).to eq(error)
58
+ end
59
+ end
60
+ end
61
+ end
62
+
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Core::UseCases::GetVersion < RiderKick::UseCases::AbstractUseCase
3
+ class <%= domain_class_name %>::UseCases::GetVersion < RiderKick::UseCases::AbstractUseCase
4
4
  contract do
5
5
  params do
6
6
  # required(:version).filled(:string)
@@ -11,7 +11,7 @@ class Core::UseCases::GetVersion < RiderKick::UseCases::AbstractUseCase
11
11
 
12
12
  def result
13
13
  params = yield build_parameter!
14
- response = { version: <%= Rails.application.class.module_parent_name %>::VERSION }
14
+ response = { version: <%= Rails.application&.class&.module_parent_name || 'MyApp' %>::VERSION }
15
15
  Success response
16
16
  end
17
17
  end
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
3
+ class <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
4
4
  contract do
5
- params(Core::UseCases::Contract::Default.new.call, Core::UseCases::Contract::Pagination.new.call) do
5
+ params(<%= domain_class_name %>::UseCases::Contract::Default.new.call, <%= domain_class_name %>::UseCases::Contract::Pagination.new.call) do
6
6
  <% @contract_list.each do |field| -%>
7
- <% next if field.include?("#{@resource_owner_id}") && @resource_owner_id.present? -%>
8
7
  <%= field %>
9
- <% end -%>
10
- <% if @resource_owner_id.present? -%>
11
- required(:<%= @resource_owner_id %>).filled(:string)
12
8
  <% end -%>
13
9
  end
14
10
  end
@@ -17,6 +13,6 @@ class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].re
17
13
 
18
14
  def result
19
15
  params = yield build_parameter!
20
- Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
16
+ <%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
21
17
  end
22
18
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %>, type: :use_case do
6
+ describe '#call' do
7
+ let(:repository) { instance_double(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>) }
8
+ let(:pagination_entity) { instance_double(<%= domain_class_name %>::Entities::Pagination) }
9
+
10
+ let(:valid_params) do
11
+ {
12
+ <% if @resource_owner_id.present? && @has_resource_owner_id_in_list_contract -%>
13
+ <%= @resource_owner_id %>: '<%= @resource_owner_id %>_value',
14
+ <% end -%>
15
+ page: 1,
16
+ items: 10
17
+ }
18
+ end
19
+
20
+ before do
21
+ allow(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>)
22
+ .to receive(:new)
23
+ .with(params: anything)
24
+ .and_return(repository)
25
+ end
26
+
27
+ context 'when parameters are valid' do
28
+ it 'returns a list of <%= @scope_path %> with pagination', :aggregate_failures do
29
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Success(pagination_entity))
30
+
31
+ contract = described_class.contract!(valid_params)
32
+ result = described_class.new(contract).result
33
+
34
+ expect(result).to be_success
35
+ expect(result.value!).to eq(pagination_entity)
36
+ end
37
+ end
38
+
39
+ context 'when parameters are invalid' do
40
+ it 'returns failure with validation errors' do
41
+ invalid_params = { page: 'not-a-number' }
42
+
43
+ contract = described_class.contract!(invalid_params)
44
+ result = described_class.new(contract).result
45
+
46
+ expect(result).to be_failure
47
+ end
48
+ end
49
+
50
+ context 'when repository fails' do
51
+ it 'returns failure', :aggregate_failures do
52
+ error = instance_double(<%= domain_class_name %>::Entities::Error)
53
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Failure(error))
54
+
55
+ contract = described_class.contract!(valid_params)
56
+ result = described_class.new(contract).result
57
+
58
+ expect(result).to be_failure
59
+ expect(result.failure).to eq(error)
60
+ end
61
+ end
62
+ end
63
+ end
64
+
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
3
+ class <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %> < RiderKick::UseCases::AbstractUseCase
4
4
  contract do
5
- params(Core::UseCases::Contract::Default.new.call) do
5
+ params(<%= domain_class_name %>::UseCases::Contract::Default.new.call) do
6
6
  required(:id).filled(:string)
7
- <% if @resource_owner_id.present? -%>
8
- required(:<%= @resource_owner_id %>).filled(:string)
9
- <% end -%>
10
7
  <% @contract_update.each do |field| -%>
11
- <% next if field.include?("#{@resource_owner_id}") && @resource_owner_id.present? -%>
12
8
  <% next if field.include?("(:id)") -%>
13
9
  <%= field %>
14
10
  <% end -%>
@@ -19,6 +15,6 @@ class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].re
19
15
 
20
16
  def result
21
17
  params = yield build_parameter!
22
- Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
18
+ <%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
23
19
  end
24
20
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe <%= domain_class_name %>::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].reject { |c| c.empty? }.join("::") %>, type: :use_case do
6
+ describe '#call' do
7
+ let(:repository) { instance_double(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>) }
8
+ let(:entity) { instance_double(<%= domain_class_name %>::Entities::<%= @subject_class %>) }
9
+ let(:<%= @variable_subject %>_id) { 'test-id-123' }
10
+
11
+ let(:valid_params) do
12
+ {
13
+ id: <%= @variable_subject %>_id,
14
+ <% if @resource_owner_id.present? && @has_resource_owner_id_in_update_contract -%>
15
+ <%= @resource_owner_id %>: '<%= @resource_owner_id %>_value',
16
+ <% end -%>
17
+ <% @fields.first(2).each_with_index do |field, index| -%>
18
+ <% next if @resource_owner_id.present? && field == @resource_owner_id -%>
19
+ <% field_meta = columns_meta.find { |col| col[:name] == field } -%>
20
+ <% if field_meta && [:datetime, :timestamp].include?(field_meta[:type]) -%>
21
+ <%= field %>: Time.zone.now<%= index < @fields.first(2).length - 1 ? ',' : '' %>
22
+ <% else -%>
23
+ <%= field %>: 'updated_<%= field %>_value'<%= index < @fields.first(2).length - 1 ? ',' : '' %>
24
+ <% end -%>
25
+ <% end -%>
26
+ }
27
+ end
28
+
29
+ before do
30
+ allow(<%= domain_class_name %>::Repositories::<%= @scope_class%>::<%= @repository_class%>)
31
+ .to receive(:new)
32
+ .with(params: anything)
33
+ .and_return(repository)
34
+ end
35
+
36
+ context 'when parameters are valid' do
37
+ it 'updates the <%= @variable_subject %> successfully', :aggregate_failures do
38
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Success(entity))
39
+
40
+ contract = described_class.contract!(valid_params)
41
+ result = described_class.new(contract).result
42
+
43
+ expect(result).to be_success
44
+ expect(result.value!).to eq(entity)
45
+ end
46
+ end
47
+
48
+ context 'when parameters are invalid' do
49
+ it 'returns failure when id is missing' do
50
+ invalid_params = valid_params.except(:id)
51
+
52
+ contract = described_class.contract!(invalid_params)
53
+ result = described_class.new(contract).result
54
+
55
+ expect(result).to be_failure
56
+ end
57
+ end
58
+
59
+ context 'when repository fails' do
60
+ it 'returns failure', :aggregate_failures do
61
+ error = instance_double(<%= domain_class_name %>::Entities::Error)
62
+ allow(repository).to receive(:call).with(builder: true).and_return(Dry::Monads::Failure(error))
63
+
64
+ contract = described_class.contract!(valid_params)
65
+ result = described_class.new(contract).result
66
+
67
+ expect(result).to be_failure
68
+ expect(result.failure).to eq(error)
69
+ end
70
+ end
71
+ end
72
+ end
73
+
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Core::Utils::AbstractUtils
3
+ class <%= domain_class_name %>::Utils::AbstractUtils
4
4
  include Dry::Monads[:result, :do]
5
5
 
6
6
  def http
7
- extend(Core::Utils::RequestMethods)
7
+ extend(<%= domain_class_name %>::Utils::RequestMethods)
8
8
  end
9
9
 
10
10
  def error_messages_for(record)
@@ -14,7 +14,7 @@ class Core::Utils::AbstractUtils
14
14
  def build_errors(resource)
15
15
  errors = []
16
16
  resource.errors.each do |error|
17
- errors << Core::Builders::Error.new(error.as_json).build
17
+ errors << <%= domain_class_name %>::Builders::Error.new(error.as_json).build
18
18
  end
19
19
  errors
20
20
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Core::Utils::RequestMethods
3
+ module <%= domain_class_name %>::Utils::RequestMethods
4
4
  include Dry::Monads[:result, :do]
5
5
  DEFAULT_REQUEST_CONTENT_TYPE = 'application/json;charset=UTF-8'
6
6
  private_constant :DEFAULT_REQUEST_CONTENT_TYPE
@@ -1,7 +1,7 @@
1
1
  BASE_URL="http://localhost:3000"
2
2
 
3
3
  # database primary
4
- DATABASE_NAME=<%= Rails.application.class.module_parent_name.underscore %>_development
4
+ DATABASE_NAME=<%= (Rails.application&.class&.module_parent_name || 'myapp').underscore %>_development
5
5
  DATABASE_USERNAME=postgres
6
6
  DATABASE_PASSWORD=bayangan
7
7
  DATABASE_HOSTNAME=localhost