sun-sword 0.0.12 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e7f2301ad37844f511cef0f9439948ee35b7e74411e7a28989fcac4ff0ed3bb4
4
- data.tar.gz: e37e5d005d3cb2fc82ce039570f9f6f5117c7347d4b1cc1c662df60b62fc85d3
3
+ metadata.gz: 6e4ddac73f4a2f50ec6923ddc5f5f69e9bcc547be9e17d55c60bc6ecc993d4d0
4
+ data.tar.gz: dcfe5d73943110eb8b165991e7677b0594db726522c23b1ca483140714e6e525
5
5
  SHA512:
6
- metadata.gz: cbc03f139610daf61f3c260efac697aa0229aba1bccd608a1d207fccdf74254e43f639870a09d0f6b8ae80b6c21f3436e1ec935368934c65accf25a5d5fd2646
7
- data.tar.gz: 88ea0d19496ba67f716f7d1479b99e03efb8191c4609bc3c08c5d7131cac98204e4a9f634a2572e548873f1fca0cc612b4db9a0780f82fa355418c5ac76c9d5e
6
+ metadata.gz: f48f2974b697c84430061f2a4cb75e0512e3cfc7001bb599edb7894a56a3ef352efc5de33b5fe96def472fda01f665f7c5aed7b890c190e728748ea6066c71fe
7
+ data.tar.gz: 9c12c9c9d150325af5840927e5ca6c8063fdb32a7249f7ab8c03ffe3ebeebebce78a50974cc5756928f70655b3ead5777d8d372caa96f27f5157e6c135cd2b2f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sun-sword (0.0.12)
4
+ sun-sword (0.0.14)
5
5
  activesupport (>= 7.0, < 9.0)
6
6
  hashie (>= 5.0, < 6.0)
7
7
  thor (>= 1.2, < 2.0)
@@ -55,13 +55,12 @@ module SunSword
55
55
 
56
56
  def add_to_gemfile
57
57
  gem_dependencies = <<~RUBY
58
+
58
59
  # --- SunSword Package frontend
59
60
  group :development do
60
61
  gem "listen"
61
62
  end
62
- group :test do
63
- gem "rails-controller-testing"
64
- end
63
+
65
64
  gem 'turbo-rails'
66
65
  gem 'vite_rails'
67
66
  RUBY
@@ -109,7 +108,6 @@ module SunSword
109
108
  end
110
109
 
111
110
  def generate_controllers_tests
112
- run 'rails g controller tests stimulus turbo_drive turbo_frame frame_content update_content'
113
111
  template 'controllers/tests_controller.rb', File.join(path_app, 'controllers/tests_controller.rb')
114
112
  template 'controllers/tests_controller_spec.rb', File.join(path_app, 'controllers/tests_controller_spec.rb')
115
113
  template 'controllers/application_controller.rb.tt', File.join(path_app, 'controllers/application_controller.rb')
@@ -398,12 +398,6 @@ RSpec.describe SunSword::FrontendGenerator, type: :generator do
398
398
  allow(generator).to receive(:say)
399
399
  end
400
400
 
401
- it 'runs rails generator command' do
402
- generator.send(:generate_controllers_tests)
403
-
404
- expect(generator).to have_received(:run).with('rails g controller tests stimulus turbo_drive turbo_frame frame_content update_content')
405
- end
406
-
407
401
  it 'calls template for controller files' do
408
402
  generator.send(:generate_controllers_tests)
409
403
 
@@ -15,6 +15,7 @@ module SunSword
15
15
 
16
16
  class_option :engine, type: :string, default: nil, desc: 'Specify target engine name (e.g., admin, api)'
17
17
  class_option :engine_structure, type: :string, default: nil, desc: 'Specify engine where structure file is located'
18
+ class_option :domain, type: :string, default: nil, desc: 'Specify domain prefix for UseCases (e.g., core)'
18
19
 
19
20
  def validate_engine
20
21
  return unless options[:engine]
@@ -66,6 +67,11 @@ module SunSword
66
67
  @scope_class = @scope_path.camelize
67
68
  @scope_subject = @scope_path.singularize
68
69
  @model_class = model_name.camelize.constantize
70
+
71
+ # Column metadata
72
+ @columns_meta = columns_meta
73
+ @columns_meta_hash = @columns_meta.index_by { |c| c[:name] }
74
+
69
75
  @subject_class = @variable_subject.camelize
70
76
  @fields = contract_fields
71
77
  @form_fields = @controllers.form_fields
@@ -83,6 +89,9 @@ module SunSword
83
89
  # Engine mount path for view rendering
84
90
  @engine_mount_path = options[:engine] ? options[:engine].to_s.downcase : ''
85
91
 
92
+ # UseCase domain prefix
93
+ @usecase_domain = options[:domain] ? options[:domain].to_s.camelize : @engine_structure_class
94
+
86
95
  @mapping_fields = {
87
96
  string: :text_field,
88
97
  text: :text_area,
@@ -390,6 +399,25 @@ module SunSword
390
399
  @model_class.columns.reject { |column| skip_contract_fields.include?(column.name.to_s) }.map { |column| [column.name.to_s, column.type.to_s] }
391
400
  end
392
401
 
402
+ def columns_meta
403
+ @model_class.columns.map do |c|
404
+ {
405
+ name: c.name.to_s,
406
+ type: c.type,
407
+ sql_type: (c.respond_to?(:sql_type) ? c.sql_type : nil),
408
+ null: (c.respond_to?(:null) ? c.null : nil),
409
+ default: (c.respond_to?(:default) ? c.default : nil),
410
+ precision: (c.respond_to?(:precision) ? c.precision : nil),
411
+ scale: (c.respond_to?(:scale) ? c.scale : nil),
412
+ limit: (c.respond_to?(:limit) ? c.limit : nil)
413
+ }
414
+ end
415
+ end
416
+
417
+ def get_column_meta(field)
418
+ @columns_meta_hash[field.to_s] || {}
419
+ end
420
+
393
421
  def strong_params
394
422
  # pakai controllers.form_fields kalau ada, kalau tidak jatuh ke kolom model (contract_fields)
395
423
  raw_fields = @controllers&.form_fields || contract_fields
@@ -507,9 +507,9 @@ RSpec.describe SunSword::ScaffoldGenerator, type: :generator do
507
507
  expect(content).to include('POST #create')
508
508
  expect(content).to include('PATCH #update')
509
509
  expect(content).to include('DELETE #destroy')
510
- expect(content).to include('instance_double')
511
- expect(content).to include('Dry::Monads::Success')
512
- expect(content).to include('Dry::Monads::Failure')
510
+ expect(content).to include('stub_use_case(')
511
+ expect(content).to include('response: :success')
512
+ expect(content).to include('response: :failure')
513
513
  end
514
514
  end
515
515
 
@@ -554,7 +554,7 @@ RSpec.describe SunSword::ScaffoldGenerator, type: :generator do
554
554
  controller_spec_path = File.join(destination_root, 'app', 'controllers', 'admin', 'test_models_controller_spec.rb')
555
555
  content = File.read(controller_spec_path)
556
556
  expect(content).to include('RSpec.describe Admin::TestModelsController')
557
- expect(content).to include('Core::UseCases::Admin')
557
+ expect(content).to include('UseCases::Admin')
558
558
  end
559
559
  end
560
560
  end
@@ -597,9 +597,8 @@ RSpec.describe SunSword::ScaffoldGenerator, type: :generator do
597
597
 
598
598
  controller_spec_path = File.join(destination_root, 'engines', 'admin', 'app', 'controllers', 'admin', 'test_models_controller_spec.rb')
599
599
  content = File.read(controller_spec_path)
600
- expect(content).to include('instance_double')
600
+ expect(content).to include('stub_use_case(')
601
601
  expect(content).to include('create(:')
602
- expect(content).to include('build(:')
603
602
  end
604
603
  end
605
604
  end
@@ -302,7 +302,7 @@ Devise.setup do |config|
302
302
  # apps is `200 OK` and `302 Found` respectively, but new apps are generated with
303
303
  # these new defaults that match Hotwire/Turbo behavior.
304
304
  # Note: These might become the new default in future versions of Devise.
305
- config.responder.error_status = :unprocessable_entity
305
+ config.responder.error_status = :unprocessable_content
306
306
  config.responder.redirect_status = :see_other
307
307
 
308
308
  # ==> Configuration for :registerable
@@ -1,27 +1,29 @@
1
1
  # Template for the controller (controllers/controller.rb.tt)
2
- class <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.join("::") %>Controller < <%= [@engine_scope_class].reject(&:empty?).join("::").sub(/(.+)/, '\1::') %>ApplicationController
2
+ class <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.join("::") %>Controller < <%= [@engine_scope_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>ApplicationController
3
3
  before_action :set_<%= @variable_subject %>, only: %i[edit update]
4
4
  layout :set_layouts
5
5
 
6
6
  # GET /<engine_mount_path>/<%=[@scope_path].reject { |c| c.empty? }.join("/") %>
7
7
  def index
8
- use_case = <%= [@engine_structure_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>
8
+ use_case = <%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %><%= [@scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>
9
9
  contract = use_case.contract!(build_contract({}))
10
10
  result = use_case.new(contract).result
11
11
  Dry::Matcher::ResultMatcher.call(result) do |matcher|
12
12
  matcher.success do |response|
13
13
  @<%= @variable_subject.pluralize %> = response
14
- render '<%= [@engine_mount_path, @scope_path, "index"].reject { |c| c.empty? }.join("/") %>'
14
+ render '<%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_") + "/" %><%= [@engine_mount_path, @scope_path, "index"].reject { |c| c.empty? }.join("/") %>'
15
15
  end
16
16
  matcher.failure do |errors|
17
- redirect_to root_path, success: errors
17
+ @<%= @variable_subject.pluralize %> = Hashie::Mash.new({ response: [] })
18
+ flash.now[:error] = errors.pluck(:message).join(", ")
19
+ render '<%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_") + "/" %><%= [@engine_mount_path, @scope_path, "index"].reject { |c| c.empty? }.join("/") %>'
18
20
  end
19
21
  end
20
22
  end
21
23
 
22
24
  # GET /<engine_mount_path>/<%=[@scope_path, ":uuid"].reject { |c| c.empty? }.join("/") %>
23
25
  def show
24
- use_case = <%= [@engine_structure_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>
26
+ use_case = <%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %><%= [@scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>
25
27
  contract = use_case.contract!(build_contract({ id: params[:id] }))
26
28
  result = use_case.new(contract).result
27
29
  Dry::Matcher::ResultMatcher.call(result) do |matcher|
@@ -29,7 +31,7 @@ class <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.join("::")
29
31
  @<%= @variable_subject %> = response
30
32
  end
31
33
  matcher.failure do |errors|
32
- redirect_to root_path, success: errors
34
+ redirect_to <%= [@scope_path].reject { |c| c.empty? }.join("_") %>_url, success: errors
33
35
  end
34
36
  end
35
37
  end
@@ -45,47 +47,47 @@ class <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.join("::")
45
47
 
46
48
  # POST /<%= @engine_scope_path %>/<%= @scope_path %>
47
49
  def create
48
- use_case = <%= [@engine_structure_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>
50
+ use_case = <%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %><%= [@scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>
49
51
  contract = use_case.contract!(build_contract(<%= @variable_subject %>_params))
50
52
  result = use_case.new(contract).result
51
53
  Dry::Matcher::ResultMatcher.call(result) do |matcher|
52
54
  matcher.success do |response|
53
- redirect_to <%= [@scope_path.singularize].reject { |c| c.empty? }.join("_") %>_url(id: response.id), success: '<%= @subject_class %> was successfully created.'
55
+ redirect_to <%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_").sub(/(.+)/, '\1_') %><%= [@scope_path.singularize].reject { |c| c.empty? }.join("_") %>_url(id: response.id), success: '<%= @subject_class %> was successfully created.'
54
56
  end
55
57
  matcher.failure do |errors|
56
58
  @<%= @variable_subject %> = build_form_errors(<%= @variable_subject %>_params, <%= @model_class %>.new, errors)
57
- render '<%= [@engine_mount_path, @scope_path, "new"].reject { |c| c.empty? }.join("/") %>', status: :unprocessable_entity
59
+ render '<%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_") + "/" %><%= [@engine_mount_path, @scope_path, "new"].reject { |c| c.empty? }.join("/") %>', status: :unprocessable_content
58
60
  end
59
61
  end
60
62
  end
61
63
 
62
64
  # PATCH/PUT /<engine_mount_path>/<%=[@scope_path, ":uuid"].reject { |c| c.empty? }.join("/") %>
63
65
  def update
64
- use_case = <%= [@engine_structure_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>
66
+ use_case = <%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %><%= [@scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>
65
67
  contract = use_case.contract!(build_contract(<%= @variable_subject %>_params).merge({ id: params[:id] }))
66
68
  result = use_case.new(contract).result
67
69
  Dry::Matcher::ResultMatcher.call(result) do |matcher|
68
70
  matcher.success do |response|
69
- redirect_to <%= [@scope_path.singularize].reject { |c| c.empty? }.join("_") %>_url(id: response.id), success: '<%= @subject_class %> was successfully updated.'
71
+ redirect_to <%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_").sub(/(.+)/, '\1_') %><%= [@scope_path.singularize].reject { |c| c.empty? }.join("_") %>_url(id: response.id), success: '<%= @subject_class %> was successfully updated.'
70
72
  end
71
73
  matcher.failure do |errors|
72
74
  @<%= @variable_subject %> = build_form_errors(<%= @variable_subject %>_params, <%= @model_class %>.find(params[:id]), errors)
73
- render '<%= [@engine_mount_path, @scope_path, "edit"].reject { |c| c.empty? }.join("/") %>', status: :unprocessable_entity
75
+ render '<%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_") + "/" %><%= [@engine_mount_path, @scope_path, "edit"].reject { |c| c.empty? }.join("/") %>', status: :unprocessable_content
74
76
  end
75
77
  end
76
78
  end
77
79
 
78
80
  # DELETE /<engine_mount_path>/<%=[@scope_path, ":uuid"].reject { |c| c.empty? }.join("/") %>
79
81
  def destroy
80
- use_case = <%= [@engine_structure_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>
82
+ use_case = <%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %><%= [@scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>
81
83
  contract = use_case.contract!(build_contract({ id: params[:id] }))
82
84
  result = use_case.new(contract).result
83
85
  Dry::Matcher::ResultMatcher.call(result) do |matcher|
84
86
  matcher.success do |response|
85
- redirect_to <%= [@scope_path].reject { |c| c.empty? }.join("_") %>_url, notice: '<%= @subject_class %> was successfully destroyed.'
87
+ redirect_to <%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_").sub(/(.+)/, '\1_') %><%= [@scope_path].reject { |c| c.empty? }.join("_") %>_url, notice: '<%= @subject_class %> was successfully destroyed.'
86
88
  end
87
89
  matcher.failure do |errors|
88
- redirect_to <%= [@scope_path].reject { |c| c.empty? }.join("_") %>_url, error: '<%= @subject_class %> could not be destroyed.'
90
+ redirect_to <%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_").sub(/(.+)/, '\1_') %><%= [@scope_path].reject { |c| c.empty? }.join("_") %>_url, error: '<%= @subject_class %> could not be destroyed.'
89
91
  end
90
92
  end
91
93
  end
@@ -107,7 +109,7 @@ class <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.join("::")
107
109
  <%else -%>
108
110
  @<%= @variable_subject %> = <%= @model_class %>.find_by(id: params[:id])
109
111
  <%end -%>
110
- redirect_to <%= [@scope_path].reject { |c| c.empty? }.join("_") %>_url, error: '<%= @subject_class %> not found.' if @<%= @variable_subject %>.nil?
112
+ redirect_to <%= [@route_scope_path.singularize].reject { |c| c.empty? }.join("_").sub(/(.+)/, '\1_') %><%= [@scope_path].reject { |c| c.empty? }.join("_") %>_url, error: '<%= @subject_class %> not found.' if @<%= @variable_subject %>.nil?
111
113
  end
112
114
 
113
115
  # Only allow a list of trusted parameters through.
@@ -3,10 +3,36 @@
3
3
  require 'rails_helper'
4
4
 
5
5
  RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.join("::") %>Controller, type: :controller do
6
+ <% if @engine_scope_class.present? -%>
7
+ routes { <%= @engine_scope_class%>::Engine.routes }
8
+ <% end -%>
9
+
6
10
  <% if @resource_owner_id.present? -%>
7
- let(:owner) { create(:<%= @resource_owner %>) }
8
- let(:actor) { create(:actor) }
11
+ let(:<%= @resource_owner %>) { create(:<%= @resource_owner %>)}
12
+ let(:<%= @resource_owner_id %>) { <%= @resource_owner %>.id }
13
+ <% end -%>
14
+ <% @fields.each do |field| -%>
15
+ <% next if @resource_owner_id.present? && field[0] == @resource_owner_id -%>
16
+ <% field_meta = columns_meta.find { |col| col[:name] == field[0] } -%>
17
+ <% if field_meta && field_meta[:type] == :uuid -%>
18
+ let(:<%= field[0].delete_suffix("_id") %>) { create(:<%= field[0].delete_suffix("_id") %>, <%= @resource_owner %>: <%= @resource_owner %>) }
19
+ let(:<%= field[0] %>) { <%= field[0].delete_suffix("_id") %>.id }
20
+ <% end -%>
9
21
  <% end -%>
22
+ <%
23
+ explicit_params = []
24
+ if @resource_owner_id.present?
25
+ explicit_params << "#{@resource_owner_id}: #{@resource_owner}.id"
26
+ end
27
+ @fields.each do |field|
28
+ next if @resource_owner_id.present? && field[0] == @resource_owner_id
29
+ field_meta = columns_meta.find { |col| col[:name] == field[0] }
30
+ if field_meta && field_meta[:type] == :uuid
31
+ explicit_params << "#{field[0]}: #{field[0].delete_suffix('_id')}.id"
32
+ end
33
+ end
34
+ create_params_str = explicit_params.any? ? ", #{explicit_params.join(', ')}" : ''
35
+ -%>
10
36
 
11
37
  let(:valid_attributes) do
12
38
  {
@@ -28,29 +54,26 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
28
54
 
29
55
  let(:invalid_attributes) do
30
56
  {
31
- <% @fields.first(2).each_with_index do |(field, type), index| -%>
32
- <% next if field.to_s == 'id' || field.to_s.end_with?('_id') -%>
33
- <%= field %>: nil<%= ',' unless index == 1 %>
57
+ <% @fields.each_with_index do |field, index| -%>
58
+ <% next if @resource_owner_id.present? && field == @resource_owner_id -%>
59
+ <% is_last = index == @fields.length - 1 || (@resource_owner_id.present? && index == @fields.length - 1) -%>
60
+ <%= field[0] %>: 'nil'<%= is_last ? '' : ',' %>
34
61
  <% end -%>
35
- }
36
- end
62
+ }
63
+ end
37
64
 
38
65
  <% if @resource_owner_id.present? -%>
39
66
  before do
40
- allow(controller).to receive(:<%= @resource_owner_id %>).and_return(owner.id)
67
+ allow(controller).to receive(:<%= @resource_owner_id %>).and_return(<%= @resource_owner %>.id)
41
68
  end
42
69
 
43
70
  <% end -%>
44
71
  describe 'GET #index' do
45
72
  context 'when use case succeeds' do
46
- let(:<%= @variable_subject.pluralize %>) { create_list(:<%= @variable_subject %>) }
47
- let(:use_case_instance) { instance_double(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>) }
48
- let(:success_result) { Dry::Monads::Success(<%= @variable_subject.pluralize %>) }
73
+ let(:<%= @variable_subject.pluralize %>) { create_list(:<%= @variable_subject %>, 3<%= create_params_str %>) }
49
74
 
50
75
  before do
51
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
52
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
53
- allow(use_case_instance).to receive(:result).and_return(success_result)
76
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>, <%= @variable_subject.pluralize %>, response: :success)
54
77
  end
55
78
 
56
79
  it 'returns success response and assigns @<%= @variable_subject.pluralize %>' do
@@ -62,42 +85,38 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
62
85
  end
63
86
 
64
87
  it 'calls use case with correct contract' do
65
- expect(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)<%= @resource_owner_id.present? ? "\n .with(hash_including(#{@resource_owner_id}: owner.id))" : '' %>
88
+ expect(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)<%= @resource_owner_id.present? ? "\n .with(hash_including(#{@resource_owner_id}: #{@resource_owner}.id))" : '' %>
66
89
 
67
90
  get :index
68
91
  end
69
92
  end
70
93
 
71
94
  context 'when use case fails' do
72
- let(:use_case_instance) { instance_double(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>) }
73
- let(:failure_result) { Dry::Monads::Failure('Error loading <%= @variable_subject.pluralize %>') }
95
+ let(:use_case_instance) { instance_double(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>) }
96
+ let(:failure_result) { 'Error loading <%= @variable_subject.pluralize %>' }
74
97
 
75
98
  before do
76
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
77
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
78
- allow(use_case_instance).to receive(:result).and_return(failure_result)
99
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].reject { |c| c.empty? }.join("::") %>, failure_result, response: :failure)
79
100
  end
80
101
 
81
102
  it 'redirects to root path with error' do
82
103
  get :index
83
104
 
84
- expect(response).to redirect_to(root_path)
105
+ expect(response).to redirect_to(<%= @variable_subject.pluralize %>_url)
85
106
  expect(flash[:success]).to eq('Error loading <%= @variable_subject.pluralize %>')
86
107
  end
87
108
  end
88
109
  end
89
110
 
90
111
  describe 'GET #show' do
91
- let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= @resource_owner_id.present? ? ", #{@resource_owner_id}: owner.id" : '' %>) }
112
+ let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= create_params_str %>) }
92
113
 
93
114
  context 'when use case succeeds' do
94
- let(:use_case_instance) { instance_double(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>) }
95
- let(:success_result) { Dry::Monads::Success(<%= @variable_subject %>) }
115
+ let(:use_case_instance) { instance_double(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>) }
116
+ let(:success_result) { <%= @variable_subject %> }
96
117
 
97
118
  before do
98
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
99
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
100
- allow(use_case_instance).to receive(:result).and_return(success_result)
119
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>, success_result, response: :success)
101
120
  end
102
121
 
103
122
  it 'returns success response and assigns @<%= @variable_subject %>' do
@@ -108,27 +127,25 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
108
127
  end
109
128
 
110
129
  it 'calls use case with correct contract' do
111
- expect(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)
112
- .with(hash_including(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: owner.id, " : '' %>id: <%= @variable_subject %>.id))
130
+ expect(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)
131
+ .with(hash_including(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: #{@resource_owner}.id, " : '' %>id: <%= @variable_subject %>.id))
113
132
 
114
133
  get :show, params: { id: <%= @variable_subject %>.id }
115
134
  end
116
135
  end
117
136
 
118
137
  context 'when use case fails' do
119
- let(:use_case_instance) { instance_double(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>) }
120
- let(:failure_result) { Dry::Monads::Failure('<%= @subject_class %> not found') }
138
+ let(:use_case_instance) { instance_double(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>) }
139
+ let(:failure_result) { '<%= @subject_class %> not found' }
121
140
 
122
141
  before do
123
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
124
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
125
- allow(use_case_instance).to receive(:result).and_return(failure_result)
142
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('fetch', '_by_id')].reject { |c| c.empty? }.join("::") %>, failure_result, response: :failure)
126
143
  end
127
144
 
128
- it 'redirects to root path with error' do
145
+ it 'redirects to <%= @variable_subject.pluralize %> path with error' do
129
146
  get :show, params: { id: 'non-existent' }
130
147
 
131
- expect(response).to redirect_to(root_path)
148
+ expect(response).to redirect_to(<%= @variable_subject.pluralize %>_url)
132
149
  expect(flash[:success]).to eq('<%= @subject_class %> not found')
133
150
  end
134
151
  end
@@ -144,12 +161,12 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
144
161
  end
145
162
 
146
163
  describe 'GET #edit' do
147
- let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= @resource_owner_id.present? ? ", #{@resource_owner_id}: owner.id" : '' %>) }
164
+ let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= create_params_str %>) }
148
165
 
149
166
  context 'when <%= @variable_subject %> exists<%= @resource_owner_id.present? ? " and belongs to owner" : '' %>' do
150
167
  before do
151
168
  allow(<%= @model_class %>).to receive(:find_by)
152
- .with(<%= @resource_owner_id.present? ? "id: #{@variable_subject}.id, #{@resource_owner_id}: owner.id" : "id: #{@variable_subject}.id" %>)
169
+ .with(<%= @resource_owner_id.present? ? "id: #{@variable_subject}.id, #{@resource_owner_id}: #{@resource_owner}.id" : "id: #{@variable_subject}.id" %>)
153
170
  .and_return(<%= @variable_subject %>)
154
171
  end
155
172
 
@@ -164,7 +181,7 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
164
181
  context 'when <%= @variable_subject %> does not exist<%= @resource_owner_id.present? ? " or does not belong to owner" : '' %>' do
165
182
  before do
166
183
  allow(<%= @model_class %>).to receive(:find_by)
167
- .with(<%= @resource_owner_id.present? ? "id: 'non-existent', #{@resource_owner_id}: owner.id" : "id: 'non-existent'" %>)
184
+ .with(<%= @resource_owner_id.present? ? "id: 'non-existent', #{@resource_owner_id}: #{@resource_owner}.id" : "id: 'non-existent'" %>)
168
185
  .and_return(nil)
169
186
  end
170
187
 
@@ -178,28 +195,25 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
178
195
  end
179
196
 
180
197
  describe 'POST #create' do
181
- let(:use_case_instance) { instance_double(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>) }
198
+ let(:use_case_instance) { instance_double(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>) }
182
199
 
183
200
  context 'with valid params' do
184
- let(:created_<%= @variable_subject %>) { build(:<%= @variable_subject %>, id: 'uuid-123', **valid_attributes) }
185
- let(:success_result) { Dry::Monads::Success(created_<%= @variable_subject %>) }
201
+ let(:success_result) { Hashie::Mash.new({ id: SecureRandom.uuid }) }
186
202
 
187
203
  before do
188
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
189
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
190
- allow(use_case_instance).to receive(:result).and_return(success_result)
204
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>, success_result, response: :success)
191
205
  end
192
206
 
193
207
  it 'creates and redirects with success message' do
194
208
  post :create, params: { models_<%= @subject_class.underscore %>: valid_attributes }
195
209
 
196
- expect(response).to redirect_to(<%= [@route_scope_path, @scope_path.singularize].reject { |c| c.empty? }.join("_") %>_url(id: created_<%= @variable_subject %>.id))
210
+ expect(response).to redirect_to(<%= [@route_scope_path, @scope_path.singularize].reject { |c| c.empty? }.join("_") %>_url(id: success_result.id))
197
211
  expect(flash[:success]).to eq('<%= @subject_class %> was successfully created.')
198
212
  end
199
213
 
200
214
  it 'calls use case with correct contract' do
201
- expect(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)
202
- .with(hash_including(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: owner.id, " : '' %>**valid_attributes.stringify_keys))
215
+ expect(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)
216
+ .with(hash_including(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: #{@resource_owner}.id, " : '' %>**valid_attributes.stringify_keys))
203
217
 
204
218
  post :create, params: { models_<%= @subject_class.underscore %>: valid_attributes }
205
219
  end
@@ -207,19 +221,17 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
207
221
 
208
222
  context 'with invalid params' do
209
223
  let(:errors) { { <%= @fields.first.first %>: ['cannot be blank'] } }
210
- let(:failure_result) { Dry::Monads::Failure(errors) }
224
+ let(:failure_result) { errors}
211
225
 
212
226
  before do
213
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
214
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
215
- allow(use_case_instance).to receive(:result).and_return(failure_result)
227
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].reject { |c| c.empty? }.join("::") %>, failure_result, response: :failure)
216
228
  allow(controller).to receive(:build_form_errors).and_return(<%= @model_class %>.new)
217
229
  end
218
230
 
219
231
  it 'does not create and renders new with errors' do
220
232
  post :create, params: { models_<%= @subject_class.underscore %>: invalid_attributes }
221
233
 
222
- expect(response).to have_http_status(:unprocessable_entity)
234
+ expect(response).to have_http_status(:unprocessable_content)
223
235
  expect(response).to render_template('<%= [@route_scope_path, @scope_path, 'new'].reject { |c| c.empty? }.join("/") %>')
224
236
  expect(assigns(:<%= @variable_subject %>)).to be_a(<%= @model_class %>)
225
237
  end
@@ -234,24 +246,20 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
234
246
  end
235
247
 
236
248
  describe 'PATCH #update' do
237
- let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= @resource_owner_id.present? ? ", #{@resource_owner_id}: owner.id" : '' %>) }
238
- let(:use_case_instance) { instance_double(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>) }
249
+ let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= create_params_str %>) }
239
250
  let(:updated_attributes) { { <%= @fields.first.first %>: 'Updated Value' } }
240
251
 
241
252
  before do
242
253
  allow(<%= @model_class %>).to receive(:find_by)
243
- .with(<%= @resource_owner_id.present? ? "id: #{@variable_subject}.id, #{@resource_owner_id}: owner.id" : "id: #{@variable_subject}.id" %>)
254
+ .with(<%= @resource_owner_id.present? ? "id: #{@variable_subject}.id, #{@resource_owner_id}: #{@resource_owner}.id" : "id: #{@variable_subject}.id" %>)
244
255
  .and_return(<%= @variable_subject %>)
245
256
  end
246
257
 
247
258
  context 'with valid params' do
248
259
  let(:updated_<%= @variable_subject %>) { <%= @variable_subject %>.tap { |obj| obj.<%= @fields.first.first %> = 'Updated Value' } }
249
- let(:success_result) { Dry::Monads::Success(updated_<%= @variable_subject %>) }
250
260
 
251
261
  before do
252
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
253
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
254
- allow(use_case_instance).to receive(:result).and_return(success_result)
262
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>, updated_<%= @variable_subject %>, response: :success)
255
263
  end
256
264
 
257
265
  it 'updates and redirects with success message' do
@@ -262,8 +270,8 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
262
270
  end
263
271
 
264
272
  it 'calls use case with correct contract' do
265
- expect(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)
266
- .with(hash_including(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: owner.id, " : '' %>id: <%= @variable_subject %>.id, **updated_attributes.stringify_keys))
273
+ expect(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)
274
+ .with(hash_including(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: #{@resource_owner}.id, " : '' %>id: <%= @variable_subject %>.id, **updated_attributes.stringify_keys))
267
275
 
268
276
  patch :update, params: { id: <%= @variable_subject %>.id, models_<%= @subject_class.underscore %>: updated_attributes }
269
277
  end
@@ -271,12 +279,10 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
271
279
 
272
280
  context 'with invalid params' do
273
281
  let(:errors) { { <%= @fields.first.first %>: ['cannot be blank'] } }
274
- let(:failure_result) { Dry::Monads::Failure(errors) }
282
+ let(:failure_result) { errors }
275
283
 
276
284
  before do
277
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
278
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
279
- allow(use_case_instance).to receive(:result).and_return(failure_result)
285
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].reject { |c| c.empty? }.join("::") %>, failure_result, response: :failure)
280
286
  allow(<%= @model_class %>).to receive(:find).with(<%= @variable_subject %>.id).and_return(<%= @variable_subject %>)
281
287
  allow(controller).to receive(:build_form_errors).and_return(<%= @variable_subject %>)
282
288
  end
@@ -284,7 +290,7 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
284
290
  it 'does not update and renders edit with errors' do
285
291
  patch :update, params: { id: <%= @variable_subject %>.id, models_<%= @subject_class.underscore %>: invalid_attributes }
286
292
 
287
- expect(response).to have_http_status(:unprocessable_entity)
293
+ expect(response).to have_http_status(:unprocessable_content)
288
294
  expect(response).to render_template('<%= [@route_scope_path, @scope_path, 'edit'].reject { |c| c.empty? }.join("/") %>')
289
295
  expect(assigns(:<%= @variable_subject %>)).to eq(<%= @variable_subject %>)
290
296
  end
@@ -292,16 +298,13 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
292
298
  end
293
299
 
294
300
  describe 'DELETE #destroy' do
295
- let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= @resource_owner_id.present? ? ", #{@resource_owner_id}: owner.id" : '' %>) }
296
- let(:use_case_instance) { instance_double(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>) }
301
+ let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= create_params_str %>) }
297
302
 
298
303
  context 'when deletion succeeds' do
299
- let(:success_result) { Dry::Monads::Success(true) }
304
+ let(:success_result) { true }
300
305
 
301
306
  before do
302
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
303
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
304
- allow(use_case_instance).to receive(:result).and_return(success_result)
307
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>, success_result, response: :success)
305
308
  end
306
309
 
307
310
  it 'destroys and redirects with success notice' do
@@ -312,20 +315,18 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
312
315
  end
313
316
 
314
317
  it 'calls use case with correct contract' do
315
- expect(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)
316
- .with(hash_including(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: owner.id, " : '' %>id: <%= @variable_subject %>.id))
318
+ expect(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!)
319
+ .with(hash_including(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: #{@resource_owner}.id, " : '' %>id: <%= @variable_subject %>.id))
317
320
 
318
321
  delete :destroy, params: { id: <%= @variable_subject %>.id }
319
322
  end
320
323
  end
321
324
 
322
325
  context 'when deletion fails' do
323
- let(:failure_result) { Dry::Monads::Failure('Cannot delete <%= @variable_subject %>') }
326
+ let(:failure_result) { 'Cannot delete <%= @variable_subject %>' }
324
327
 
325
328
  before do
326
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>).to receive(:contract!).and_return(true)
327
- allow(Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>).to receive(:new).and_return(use_case_instance)
328
- allow(use_case_instance).to receive(:result).and_return(failure_result)
329
+ stub_use_case(<%= [@usecase_domain].reject { |c| c.empty? }.join("::").sub(/(.+)/, '\1::') %>UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].reject { |c| c.empty? }.join("::") %>, failure_result, response: :failure)
329
330
  end
330
331
 
331
332
  it 'redirects with error message' do
@@ -343,17 +344,17 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
343
344
  params = { <%= @fields.first.first %>: 'Test' }
344
345
  result = controller.send(:build_contract, params)
345
346
 
346
- expect(result).to include(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: owner.id, " : '' %><%= @fields.first.first %>: 'Test')
347
+ expect(result).to include(<%= @resource_owner_id.present? ? "#{@resource_owner_id}: #{@resource_owner}.id, " : '' %><%= @fields.first.first %>: 'Test')
347
348
  end
348
349
  end
349
350
 
350
351
  describe '#set_<%= @variable_subject %>' do
351
352
  context 'when <%= @variable_subject %> exists' do
352
- let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= @resource_owner_id.present? ? ", #{@resource_owner_id}: owner.id" : '' %>) }
353
+ let(:<%= @variable_subject %>) { create(:<%= @variable_subject %><%= create_params_str %>) }
353
354
 
354
355
  before do
355
356
  allow(<%= @model_class %>).to receive(:find_by)
356
- .with(<%= @resource_owner_id.present? ? "id: #{@variable_subject}.id, #{@resource_owner_id}: owner.id" : "id: #{@variable_subject}.id" %>)
357
+ .with(<%= @resource_owner_id.present? ? "id: #{@variable_subject}.id, #{@resource_owner_id}: #{@resource_owner}.id" : "id: #{@variable_subject}.id" %>)
357
358
  .and_return(<%= @variable_subject %>)
358
359
  end
359
360
 
@@ -369,16 +370,18 @@ RSpec.describe <%= [@engine_scope_class, @scope_class].reject { |c| c.empty? }.j
369
370
  context 'when <%= @variable_subject %> does not exist' do
370
371
  before do
371
372
  allow(<%= @model_class %>).to receive(:find_by)
372
- .with(<%= @resource_owner_id.present? ? "id: 'non-existent', #{@resource_owner_id}: owner.id" : "id: 'non-existent'" %>)
373
+ .with(<%= @resource_owner_id.present? ? "id: 'non-existent', #{@resource_owner_id}: #{@resource_owner}.id" : "id: 'non-existent'" %>)
373
374
  .and_return(nil)
374
375
  end
375
376
 
376
377
  it 'redirects with error' do
377
378
  controller.params[:id] = 'non-existent'
379
+ allow(controller).to receive(:redirect_to)
380
+
378
381
  controller.send(:set_<%= @variable_subject %>)
379
382
 
380
- expect(response).to redirect_to(<%= [@route_scope_path, @scope_path].reject { |c| c.empty? }.join("_") %>_url)
381
- expect(flash[:error]).to eq('<%= @subject_class %> not found.')
383
+ expect(controller.instance_variable_get(:@<%= @variable_subject %>)).to be_nil
384
+ expect(controller).to have_received(:redirect_to).with(<%= [@route_scope_path, @scope_path].reject { |c| c.empty? }.join("_") %>_url, error: '<%= @subject_class %> not found.')
382
385
  end
383
386
  end
384
387
  end
@@ -16,37 +16,39 @@
16
16
  <%% end %>
17
17
  </div>
18
18
  </div>
19
- <div class="overflow-x-auto sm:flex-auto">
20
- <div class="inline-block min-w-full align-middle">
21
- <table class="min-w-full divide-y divide-gray-300">
22
- <thead>
23
- <tr>
24
- <%% <%= @controllers.list_fields.map { |tc| [tc.titleize.to_s, '']} + [["Action", "text-center"]]%>.each do |title, attr_class| %>
25
- <th scope="col" class="class-tr <%%= attr_class %>"><%%= title %></th>
26
- <%% end %>
27
- </th>
28
- </tr>
29
- </thead>
30
- <tbody class="min-w-full divide-y divide-gray-100">
31
- <%% @<%= @variable_subject.pluralize %>.response.each do |<%= @variable_subject %>| %>
32
- <tr class="even:bg-gray-50">
33
- <%@controllers.list_fields.each do |field| -%>
34
- <td class="class-td">
35
- <div class="flex items-center">
36
- <div>
37
- <div class="text-sm text-gray-900"><%%= <%= @variable_subject %>.<%=field %> %></div>
38
- </div>
39
- </div>
40
- </td>
41
- <%end-%>
42
- <td class="class-td text-center">
43
- <%%= render "components/link_action", key: "<%= [@route_scope_path, @scope_subject].reject { |c| c.empty? }.join("_") %>", value: <%= @variable_subject %>, actions: [:show, :edit, :destroy] %>
44
- </td>
19
+ <%% if @<%= @variable_subject.pluralize %>.response.present? %>
20
+ <div class="overflow-x-auto sm:flex-auto">
21
+ <div class="inline-block min-w-full align-middle">
22
+ <table class="min-w-full divide-y divide-gray-300">
23
+ <thead>
24
+ <tr>
25
+ <%% <%= @controllers.list_fields.map { |tc| [tc.titleize.to_s, '']} + [["Action", "text-center"]]%>.each do |title, attr_class| %>
26
+ <th scope="col" class="class-tr <%%= attr_class %>"><%%= title %></th>
27
+ <%% end %>
28
+ </th>
45
29
  </tr>
46
- <%% end %>
47
- </tbody>
48
- </table>
30
+ </thead>
31
+ <tbody class="min-w-full divide-y divide-gray-100">
32
+ <%% @<%= @variable_subject.pluralize %>.response.each do |<%= @variable_subject %>| %>
33
+ <tr class="even:bg-gray-50">
34
+ <%@controllers.list_fields.each do |field| -%>
35
+ <td class="class-td">
36
+ <div class="flex items-center">
37
+ <div>
38
+ <div class="text-sm text-gray-900"><%%= <%= @variable_subject %>.<%=field %> %></div>
39
+ </div>
40
+ </div>
41
+ </td>
42
+ <%end-%>
43
+ <td class="class-td text-center">
44
+ <%%= render "components/link_action", key: "<%= [@route_scope_path, @scope_subject].reject { |c| c.empty? }.join("_") %>", value: <%= @variable_subject %>, actions: [:show, :edit, :destroy] %>
45
+ </td>
46
+ </tr>
47
+ <%% end %>
48
+ </tbody>
49
+ </table>
50
+ </div>
49
51
  </div>
50
- </div>
52
+ <%% end %>
51
53
  </div>
52
54
  </div>
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SunSword
4
- VERSION = '0.0.12'
4
+ VERSION = '0.0.14'
5
5
  public_constant :VERSION
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sun-sword
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kotaro Minami