approval 0.1.0 → 0.2.0

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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -16
  3. data/Rakefile +9 -3
  4. data/lib/approval/config.rb +19 -0
  5. data/lib/approval/engine.rb +12 -0
  6. data/lib/approval/mixins/resource.rb +24 -0
  7. data/lib/approval/mixins/user.rb +36 -0
  8. data/lib/approval/mixins.rb +19 -0
  9. data/lib/approval/models/approval/comment.rb +10 -0
  10. data/lib/approval/models/approval/item.rb +60 -0
  11. data/lib/approval/models/approval/request.rb +43 -0
  12. data/lib/approval/models/approval/request_form/base.rb +37 -0
  13. data/lib/approval/models/approval/request_form/create.rb +22 -0
  14. data/lib/approval/models/approval/request_form/destroy.rb +22 -0
  15. data/lib/approval/models/approval/request_form/update.rb +23 -0
  16. data/lib/approval/models/approval/request_form.rb +4 -0
  17. data/lib/approval/models/approval/respond_form/approve.rb +19 -0
  18. data/lib/approval/models/approval/respond_form/base.rb +42 -0
  19. data/lib/approval/models/approval/respond_form/cancel.rb +16 -0
  20. data/lib/approval/models/approval/respond_form/reject.rb +18 -0
  21. data/lib/approval/models/approval/respond_form.rb +4 -0
  22. data/lib/approval/version.rb +1 -1
  23. data/lib/approval.rb +11 -3
  24. data/lib/generators/approval/USAGE +0 -0
  25. data/lib/generators/approval/install_generator.rb +45 -0
  26. data/lib/generators/approval/templates/create_approval_comments.rb.tt +14 -0
  27. data/lib/generators/approval/templates/create_approval_items.rb.tt +17 -0
  28. data/lib/generators/approval/templates/create_approval_requests.rb.tt +19 -0
  29. data/lib/generators/approval/templates/initializer.rb +4 -0
  30. data/spec/lib/config_spec.rb +10 -0
  31. data/spec/lib/version_spec.rb +7 -0
  32. data/spec/models/book_spec.rb +27 -0
  33. data/spec/models/comment_spec.rb +9 -0
  34. data/spec/models/item_spec.rb +114 -0
  35. data/spec/models/request_form/base_spec.rb +54 -0
  36. data/spec/models/request_form/create_spec.rb +23 -0
  37. data/spec/models/request_form/destroy_spec.rb +23 -0
  38. data/spec/models/request_form/update_spec.rb +23 -0
  39. data/spec/models/request_form_spec.rb +4 -0
  40. data/spec/models/request_spec.rb +40 -0
  41. data/spec/models/respond_form/approve_spec.rb +4 -0
  42. data/spec/models/respond_form/base_spec.rb +84 -0
  43. data/spec/models/respond_form/cancel_spec.rb +4 -0
  44. data/spec/models/respond_form/reject_spec.rb +4 -0
  45. data/spec/models/respond_form_spec.rb +4 -0
  46. data/spec/models/user_spec.rb +48 -0
  47. data/spec/rails/rails-4.2.9/README.rdoc +28 -0
  48. data/spec/rails/rails-4.2.9/Rakefile +6 -0
  49. data/spec/rails/rails-4.2.9/app/assets/javascripts/application.js +16 -0
  50. data/spec/rails/rails-4.2.9/app/assets/stylesheets/application.css +15 -0
  51. data/spec/rails/rails-4.2.9/app/controllers/application_controller.rb +5 -0
  52. data/spec/rails/rails-4.2.9/app/helpers/application_helper.rb +2 -0
  53. data/spec/rails/rails-4.2.9/app/models/book.rb +3 -0
  54. data/spec/rails/rails-4.2.9/app/models/user.rb +3 -0
  55. data/spec/rails/rails-4.2.9/app/views/layouts/application.html.erb +14 -0
  56. data/spec/rails/rails-4.2.9/bin/bundle +3 -0
  57. data/spec/rails/rails-4.2.9/bin/rails +4 -0
  58. data/spec/rails/rails-4.2.9/bin/rake +4 -0
  59. data/spec/rails/rails-4.2.9/bin/setup +29 -0
  60. data/spec/rails/rails-4.2.9/config/application.rb +35 -0
  61. data/spec/rails/rails-4.2.9/config/boot.rb +3 -0
  62. data/spec/rails/rails-4.2.9/config/database.yml +25 -0
  63. data/spec/rails/rails-4.2.9/config/environment.rb +8 -0
  64. data/spec/rails/rails-4.2.9/config/environments/development.rb +28 -0
  65. data/spec/rails/rails-4.2.9/config/environments/production.rb +67 -0
  66. data/spec/rails/rails-4.2.9/config/environments/test.rb +42 -0
  67. data/spec/rails/rails-4.2.9/config/initializers/approval.rb +4 -0
  68. data/spec/rails/rails-4.2.9/config/initializers/backtrace_silencers.rb +7 -0
  69. data/spec/rails/rails-4.2.9/config/initializers/cookies_serializer.rb +3 -0
  70. data/spec/rails/rails-4.2.9/config/initializers/filter_parameter_logging.rb +4 -0
  71. data/spec/rails/rails-4.2.9/config/initializers/inflections.rb +16 -0
  72. data/spec/rails/rails-4.2.9/config/initializers/mime_types.rb +4 -0
  73. data/spec/rails/rails-4.2.9/config/initializers/session_store.rb +3 -0
  74. data/spec/rails/rails-4.2.9/config/initializers/to_time_preserves_timezone.rb +10 -0
  75. data/spec/rails/rails-4.2.9/config/initializers/wrap_parameters.rb +14 -0
  76. data/spec/rails/rails-4.2.9/config/locales/en.yml +23 -0
  77. data/spec/rails/rails-4.2.9/config/routes.rb +56 -0
  78. data/spec/rails/rails-4.2.9/config/secrets.yml +22 -0
  79. data/spec/rails/rails-4.2.9/config.ru +4 -0
  80. data/spec/rails/rails-4.2.9/db/migrate/20170731151146_create_approval_requests.rb +19 -0
  81. data/spec/rails/rails-4.2.9/db/migrate/20170731151147_create_approval_comments.rb +14 -0
  82. data/spec/rails/rails-4.2.9/db/migrate/20170731151148_create_approval_items.rb +17 -0
  83. data/spec/rails/rails-4.2.9/db/migrate/20170731151149_create_users.rb +9 -0
  84. data/spec/rails/rails-4.2.9/db/migrate/20170731151150_create_books.rb +9 -0
  85. data/spec/rails/rails-4.2.9/db/schema.rb +68 -0
  86. data/spec/rails/rails-4.2.9/db/seeds.rb +7 -0
  87. data/spec/rails/rails-4.2.9/db/test.sqlite3 +0 -0
  88. data/spec/rails/rails-4.2.9/log/test.log +133 -0
  89. data/spec/rails/rails-4.2.9/public/404.html +67 -0
  90. data/spec/rails/rails-4.2.9/public/422.html +67 -0
  91. data/spec/rails/rails-4.2.9/public/500.html +66 -0
  92. data/spec/rails/rails-4.2.9/public/favicon.ico +0 -0
  93. data/spec/rails/rails-4.2.9/public/robots.txt +5 -0
  94. data/spec/rails/rails-5.1.2/README.md +24 -0
  95. data/spec/rails/rails-5.1.2/Rakefile +6 -0
  96. data/spec/rails/rails-5.1.2/app/assets/config/manifest.js +3 -0
  97. data/spec/rails/rails-5.1.2/app/assets/javascripts/application.js +15 -0
  98. data/spec/rails/rails-5.1.2/app/assets/javascripts/cable.js +13 -0
  99. data/spec/rails/rails-5.1.2/app/assets/stylesheets/application.css +15 -0
  100. data/spec/rails/rails-5.1.2/app/channels/application_cable/channel.rb +4 -0
  101. data/spec/rails/rails-5.1.2/app/channels/application_cable/connection.rb +4 -0
  102. data/spec/rails/rails-5.1.2/app/controllers/application_controller.rb +3 -0
  103. data/spec/rails/rails-5.1.2/app/helpers/application_helper.rb +2 -0
  104. data/spec/rails/rails-5.1.2/app/jobs/application_job.rb +2 -0
  105. data/spec/rails/rails-5.1.2/app/mailers/application_mailer.rb +4 -0
  106. data/spec/rails/rails-5.1.2/app/models/application_record.rb +3 -0
  107. data/spec/rails/rails-5.1.2/app/models/book.rb +3 -0
  108. data/spec/rails/rails-5.1.2/app/models/user.rb +3 -0
  109. data/spec/rails/rails-5.1.2/app/views/layouts/application.html.erb +14 -0
  110. data/spec/rails/rails-5.1.2/app/views/layouts/mailer.html.erb +13 -0
  111. data/spec/rails/rails-5.1.2/app/views/layouts/mailer.text.erb +1 -0
  112. data/spec/rails/rails-5.1.2/bin/bundle +3 -0
  113. data/spec/rails/rails-5.1.2/bin/rails +4 -0
  114. data/spec/rails/rails-5.1.2/bin/rake +4 -0
  115. data/spec/rails/rails-5.1.2/bin/setup +38 -0
  116. data/spec/rails/rails-5.1.2/bin/update +29 -0
  117. data/spec/rails/rails-5.1.2/bin/yarn +11 -0
  118. data/spec/rails/rails-5.1.2/config/application.rb +31 -0
  119. data/spec/rails/rails-5.1.2/config/boot.rb +3 -0
  120. data/spec/rails/rails-5.1.2/config/cable.yml +10 -0
  121. data/spec/rails/rails-5.1.2/config/database.yml +25 -0
  122. data/spec/rails/rails-5.1.2/config/environment.rb +8 -0
  123. data/spec/rails/rails-5.1.2/config/environments/development.rb +47 -0
  124. data/spec/rails/rails-5.1.2/config/environments/production.rb +83 -0
  125. data/spec/rails/rails-5.1.2/config/environments/test.rb +42 -0
  126. data/spec/rails/rails-5.1.2/config/initializers/application_controller_renderer.rb +6 -0
  127. data/spec/rails/rails-5.1.2/config/initializers/approval.rb +4 -0
  128. data/spec/rails/rails-5.1.2/config/initializers/backtrace_silencers.rb +7 -0
  129. data/spec/rails/rails-5.1.2/config/initializers/cookies_serializer.rb +5 -0
  130. data/spec/rails/rails-5.1.2/config/initializers/filter_parameter_logging.rb +4 -0
  131. data/spec/rails/rails-5.1.2/config/initializers/inflections.rb +16 -0
  132. data/spec/rails/rails-5.1.2/config/initializers/mime_types.rb +4 -0
  133. data/spec/rails/rails-5.1.2/config/initializers/wrap_parameters.rb +14 -0
  134. data/spec/rails/rails-5.1.2/config/locales/en.yml +33 -0
  135. data/spec/rails/rails-5.1.2/config/puma.rb +56 -0
  136. data/spec/rails/rails-5.1.2/config/routes.rb +3 -0
  137. data/spec/rails/rails-5.1.2/config/secrets.yml +32 -0
  138. data/spec/rails/rails-5.1.2/config.ru +5 -0
  139. data/spec/rails/rails-5.1.2/db/migrate/20170731101409_create_approval_requests.rb +19 -0
  140. data/spec/rails/rails-5.1.2/db/migrate/20170731101410_create_approval_comments.rb +14 -0
  141. data/spec/rails/rails-5.1.2/db/migrate/20170731101411_create_approval_items.rb +17 -0
  142. data/spec/rails/rails-5.1.2/db/migrate/20170731101412_create_users.rb +9 -0
  143. data/spec/rails/rails-5.1.2/db/migrate/20170731101413_create_books.rb +9 -0
  144. data/spec/rails/rails-5.1.2/db/schema.rb +64 -0
  145. data/spec/rails/rails-5.1.2/db/seeds.rb +7 -0
  146. data/spec/rails/rails-5.1.2/db/test.sqlite3 +0 -0
  147. data/spec/rails/rails-5.1.2/log/test.log +3485 -0
  148. data/spec/rails/rails-5.1.2/package.json +5 -0
  149. data/spec/rails/rails-5.1.2/public/404.html +67 -0
  150. data/spec/rails/rails-5.1.2/public/422.html +67 -0
  151. data/spec/rails/rails-5.1.2/public/500.html +66 -0
  152. data/spec/rails/rails-5.1.2/public/apple-touch-icon-precomposed.png +0 -0
  153. data/spec/rails/rails-5.1.2/public/apple-touch-icon.png +0 -0
  154. data/spec/rails/rails-5.1.2/public/favicon.ico +0 -0
  155. data/spec/rails/rails-5.1.2/public/robots.txt +1 -0
  156. data/spec/spec_helper.rb +117 -0
  157. data/spec/support/rails_template.rb +24 -0
  158. metadata +287 -43
  159. data/.gitignore +0 -12
  160. data/.rspec +0 -2
  161. data/.travis.yml +0 -5
  162. data/Gemfile +0 -4
  163. data/LICENSE.txt +0 -21
  164. data/approval.gemspec +0 -26
  165. data/bin/console +0 -14
  166. data/bin/setup +0 -8
@@ -0,0 +1,19 @@
1
+ class CreateApprovalRequests < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :approval_requests do |t|
4
+ t.integer :request_user_id, null: false
5
+ t.integer :respond_user_id
6
+ t.integer :state, null: false, limit: 1, default: 0
7
+ t.datetime :requested_at, null: false
8
+ t.datetime :cancelled_at
9
+ t.datetime :approved_at
10
+ t.datetime :rejected_at
11
+
12
+ t.timestamps
13
+
14
+ t.index :request_user_id
15
+ t.index :respond_user_id
16
+ t.index :state
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,4 @@
1
+ Approval.configure do |config|
2
+ config.user_class_name = "User"
3
+ config.comment_maximum = 2000
4
+ end
@@ -0,0 +1,10 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::Config do
4
+ let(:config) { described_class.new }
5
+
6
+ describe "#permit_to_respond_to_own_request?" do
7
+ subject { config.permit_to_respond_to_own_request? }
8
+ it { is_expected.to eq false }
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval do
4
+ it "has a version number" do
5
+ expect(Approval::VERSION).not_to be nil
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Book, type: :model do
4
+ it { is_expected.to have_many(:approval_items).class_name("Approval::Item") }
5
+
6
+ describe ".append_ignore_fields" do
7
+ subject { described_class.append_ignore_fields(ignore_fields) }
8
+
9
+ context "when ignore_fields are blank" do
10
+ let(:ignore_fields) { [] }
11
+ it { is_expected.to match_array Approval::Mixins::Resource::DEFAULT_IGNORE_FIELDS }
12
+ end
13
+
14
+ context "when ignore_fields are present" do
15
+ let(:ignore_fields) { ["published_at"] }
16
+ it { is_expected.to match_array Approval::Mixins::Resource::DEFAULT_IGNORE_FIELDS.dup.concat(["published_at"]) }
17
+ end
18
+ end
19
+
20
+ describe "#params_for_approval" do
21
+ let(:book) { build :book }
22
+ let(:result) { book.attributes.except("id", "created_at", "updated_at") }
23
+
24
+ subject { book.params_for_approval }
25
+ it { is_expected.to eq result }
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::Comment, type: :model do
4
+ it { is_expected.to belong_to(:request).class_name("Approval::Request").inverse_of(:comments) }
5
+ it { is_expected.to belong_to(:user).class_name(Approval.config.user_class_name) }
6
+
7
+ it { is_expected.to validate_presence_of(:content) }
8
+ it { is_expected.to validate_length_of(:content).is_at_most(Approval.config.comment_maximum) }
9
+ end
@@ -0,0 +1,114 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::Item, type: :model do
4
+ describe "Association" do
5
+ it { is_expected.to belong_to(:request).class_name("Approval::Request").inverse_of(:items) }
6
+ it { is_expected.to belong_to(:resource) }
7
+ end
8
+
9
+ describe "Association" do
10
+ it { is_expected.to validate_presence_of(:resource_type) }
11
+ it { is_expected.to validate_presence_of(:event) }
12
+ it { is_expected.to validate_inclusion_of(:event).in_array(described_class::EVENTS) }
13
+
14
+ context "when event is create" do
15
+ subject { build :item, :update }
16
+ it { is_expected.to validate_presence_of(:event) }
17
+ end
18
+ end
19
+
20
+ describe "#create_event?" do
21
+ subject { item.create_event? }
22
+
23
+ context "when event is create" do
24
+ let(:item) { build :item, :create }
25
+ it { is_expected.to eq true }
26
+ end
27
+
28
+ context "when event is update" do
29
+ let(:item) { build :item, :update }
30
+ it { is_expected.to eq false }
31
+ end
32
+
33
+ context "when event is destroy" do
34
+ let(:item) { build :item, :destroy }
35
+ it { is_expected.to eq false }
36
+ end
37
+ end
38
+
39
+ describe "#update_event?" do
40
+ subject { item.update_event? }
41
+
42
+ context "when event is create" do
43
+ let(:item) { build :item, :create }
44
+ it { is_expected.to eq false }
45
+ end
46
+
47
+ context "when event is update" do
48
+ let(:item) { build :item, :update }
49
+ it { is_expected.to eq true }
50
+ end
51
+
52
+ context "when event is destroy" do
53
+ let(:item) { build :item, :destroy }
54
+ it { is_expected.to eq false }
55
+ end
56
+ end
57
+
58
+ describe "#destroy_event?" do
59
+ subject { item.destroy_event? }
60
+
61
+ context "when event is create" do
62
+ let(:item) { build :item, :create }
63
+ it { is_expected.to eq false }
64
+ end
65
+
66
+ context "when event is update" do
67
+ let(:item) { build :item, :update }
68
+ it { is_expected.to eq false }
69
+ end
70
+
71
+ context "when event is destroy" do
72
+ let(:item) { build :item, :destroy }
73
+ it { is_expected.to eq true }
74
+ end
75
+ end
76
+
77
+ describe "#apply" do
78
+ let(:request) { build :request, :pending }
79
+ let(:comment) { build :comment, request: request, user: request.request_user }
80
+ let(:item) { build :item, event, request: request }
81
+
82
+ before do
83
+ request.comments << comment
84
+ request.items << item
85
+ request.save!
86
+ end
87
+
88
+ subject { item.apply }
89
+
90
+ context "when event is create" do
91
+ let(:event) { :create }
92
+
93
+ it "creates book" do
94
+ expect { subject }.to change { Book.count }.by(1)
95
+ end
96
+ end
97
+
98
+ context "when event is update" do
99
+ let(:event) { :update }
100
+
101
+ it "updates book" do
102
+ expect { subject }.to change { Book.first.updated_at }
103
+ end
104
+ end
105
+
106
+ context "when event is destroy" do
107
+ let(:event) { :destroy }
108
+
109
+ it "destroys book" do
110
+ expect { subject }.to change { Book.count }.by(-1)
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RequestForm::Base, type: :model do
4
+ let(:form) { described_class.new(user: user, reason: reason, records: records) }
5
+
6
+ describe "Validation" do
7
+ let(:user) { create :user }
8
+ let(:reason) { "reason" }
9
+ let(:records) { build :book }
10
+
11
+ subject { form }
12
+
13
+ it { is_expected.to validate_presence_of(:user) }
14
+ it { is_expected.to validate_presence_of(:reason) }
15
+ it { is_expected.to validate_length_of(:reason).is_at_most(Approval.config.comment_maximum) }
16
+ it { is_expected.to validate_presence_of(:records) }
17
+ end
18
+
19
+ describe "#save" do
20
+ context "when invalid" do
21
+ let(:user) { nil }
22
+ let(:reason) { nil }
23
+ let(:records) { nil }
24
+
25
+ it { expect(form.save).to eq false }
26
+ end
27
+
28
+ context "when valid" do
29
+ let(:user) { create :user }
30
+ let(:reason) { "reason" }
31
+ let(:records) { build :book }
32
+
33
+ it { expect { form.save }.to raise_error(NotImplementedError) }
34
+ end
35
+ end
36
+
37
+ describe "#save!" do
38
+ context "when invalid" do
39
+ let(:user) { nil }
40
+ let(:reason) { nil }
41
+ let(:records) { nil }
42
+
43
+ it { expect { form.save! }.to raise_error(::ActiveRecord::RecordInvalid) }
44
+ end
45
+
46
+ context "when valid" do
47
+ let(:user) { create :user }
48
+ let(:reason) { "reason" }
49
+ let(:records) { build :book }
50
+
51
+ it { expect { form.save! }.to raise_error(NotImplementedError) }
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RequestForm::Create do
4
+ describe "#save" do
5
+ let(:user) { create :user }
6
+ let(:reason) { "reason" }
7
+ let(:form) { described_class.new(user: user, reason: reason, records: records) }
8
+
9
+ subject { form.save }
10
+
11
+ context "when records is single" do
12
+ let(:records) { build :book }
13
+ it { expect { subject }.not_to raise_error }
14
+ it { expect { subject }.to change { Approval::Item.count }.from(0).to(1) }
15
+ end
16
+
17
+ context "when records is multiple" do
18
+ let(:records) { build_list :book, 3 }
19
+ it { expect { subject }.not_to raise_error }
20
+ it { expect { subject }.to change { Approval::Item.count }.from(0).to(3) }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RequestForm::Destroy do
4
+ describe "#save" do
5
+ let(:user) { create :user }
6
+ let(:reason) { "reason" }
7
+ let(:form) { described_class.new(user: user, reason: reason, records: records) }
8
+
9
+ subject { form.save }
10
+
11
+ context "when records is single" do
12
+ let(:records) { create :book }
13
+ it { expect { subject }.not_to raise_error }
14
+ it { expect { subject }.to change { Approval::Item.count }.from(0).to(1) }
15
+ end
16
+
17
+ context "when records is multiple" do
18
+ let(:records) { create_list :book, 3 }
19
+ it { expect { subject }.not_to raise_error }
20
+ it { expect { subject }.to change { Approval::Item.count }.from(0).to(3) }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RequestForm::Update do
4
+ describe "#save" do
5
+ let(:user) { create :user }
6
+ let(:reason) { "reason" }
7
+ let(:form) { described_class.new(user: user, reason: reason, records: records) }
8
+
9
+ subject { form.save }
10
+
11
+ context "when records is single" do
12
+ let(:records) { create :book }
13
+ it { expect { subject }.not_to raise_error }
14
+ it { expect { subject }.to change { Approval::Item.count }.from(0).to(1) }
15
+ end
16
+
17
+ context "when records is multiple" do
18
+ let(:records) { create_list :book, 3 }
19
+ it { expect { subject }.not_to raise_error }
20
+ it { expect { subject }.to change { Approval::Item.count }.from(0).to(3) }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,4 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RequestForm do
4
+ end
@@ -0,0 +1,40 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::Request, type: :model do
4
+ describe "Association" do
5
+ it { is_expected.to belong_to(:request_user).class_name(Approval.config.user_class_name) }
6
+ it { is_expected.to belong_to(:respond_user).class_name(Approval.config.user_class_name) }
7
+ it { is_expected.to have_many(:comments).class_name("::Approval::Comment").dependent(:destroy) }
8
+ it { is_expected.to have_many(:items).class_name("::Approval::Item").dependent(:destroy) }
9
+ end
10
+
11
+ it { is_expected.to define_enum_for(:state).with(described_class.states) }
12
+
13
+ describe "Validation" do
14
+ it { is_expected.to validate_presence_of(:state) }
15
+ it { is_expected.to validate_presence_of(:request_user) }
16
+ it { is_expected.to validate_presence_of(:comments) }
17
+ it { is_expected.to validate_presence_of(:items) }
18
+
19
+ context "when request not pending" do
20
+ subject { build :request, :cancelled }
21
+ it { is_expected.to validate_presence_of(:respond_user) }
22
+ end
23
+ end
24
+
25
+ describe "Callback" do
26
+ context "before create" do
27
+ let(:request) { build :request, :pending }
28
+ let(:comment) { build :comment, request: request, user: request.request_user }
29
+ let(:item) { build :item, :create, request: request }
30
+
31
+ it "set requested_at" do
32
+ expect(request.requested_at).to be_nil
33
+ request.comments << comment
34
+ request.items << item
35
+ request.save!
36
+ expect(request.requested_at).to be_present
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,4 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RespondForm::Approve do
4
+ end
@@ -0,0 +1,84 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RespondForm::Base, type: :model do
4
+ let(:form) { described_class.new(user: user, reason: reason, request: request) }
5
+
6
+ describe "Validation" do
7
+ let(:user) { create :user }
8
+ let(:reason) { "reason" }
9
+ let(:request) do
10
+ build(:request, :pending).tap do |request|
11
+ request.comments << build(:comment, user: request.request_user)
12
+ request.items << build(:item, :create)
13
+ request.save!
14
+ end
15
+ end
16
+
17
+ subject { form }
18
+
19
+ it { is_expected.to validate_presence_of(:user) }
20
+ it { is_expected.to validate_presence_of(:reason) }
21
+ it { is_expected.to validate_length_of(:reason).is_at_most(Approval.config.comment_maximum) }
22
+ it { is_expected.to validate_presence_of(:request) }
23
+ end
24
+
25
+ describe "#save" do
26
+ context "when invalid" do
27
+ let(:user) { create :user }
28
+ let(:reason) { "" }
29
+ let(:request) do
30
+ build(:request, :pending).tap do |request|
31
+ request.comments << build(:comment, user: request.request_user)
32
+ request.items << build(:item, :create)
33
+ request.save!
34
+ end
35
+ end
36
+
37
+ it { expect(form.save).to eq false }
38
+ end
39
+
40
+ context "when valid" do
41
+ let(:user) { create :user }
42
+ let(:reason) { "reason" }
43
+ let(:request) do
44
+ build(:request, :pending).tap do |request|
45
+ request.comments << build(:comment, user: request.request_user)
46
+ request.items << build(:item, :create)
47
+ request.save!
48
+ end
49
+ end
50
+
51
+ it { expect { form.save }.to raise_error(NotImplementedError) }
52
+ end
53
+ end
54
+
55
+ describe "#save!" do
56
+ context "when invalid" do
57
+ let(:user) { create :user }
58
+ let(:reason) { "" }
59
+ let(:request) do
60
+ build(:request, :pending).tap do |request|
61
+ request.comments << build(:comment, user: request.request_user)
62
+ request.items << build(:item, :create)
63
+ request.save!
64
+ end
65
+ end
66
+
67
+ it { expect { form.save! }.to raise_error(::ActiveRecord::RecordInvalid) }
68
+ end
69
+
70
+ context "when valid" do
71
+ let(:user) { create :user }
72
+ let(:reason) { "reason" }
73
+ let(:request) do
74
+ build(:request, :pending).tap do |request|
75
+ request.comments << build(:comment, user: request.request_user)
76
+ request.items << build(:item, :create)
77
+ request.save!
78
+ end
79
+ end
80
+
81
+ it { expect { form.save! }.to raise_error(NotImplementedError) }
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,4 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RespondForm::Cancel do
4
+ end
@@ -0,0 +1,4 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RespondForm::Reject do
4
+ end
@@ -0,0 +1,4 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Approval::RespondForm do
4
+ end
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe User, type: :model do
4
+ it { is_expected.to have_many(:approval_requests).class_name("Approval::Request").with_foreign_key(:request_user_id) }
5
+ it { is_expected.to have_many(:approval_comments).class_name("Approval::Comment").with_foreign_key(:user_id) }
6
+
7
+ describe "RequestForm" do
8
+ let(:user) { build :user }
9
+ let(:records) { build_list :book, 3 }
10
+ let(:reason) { "reason" }
11
+
12
+ describe "#request_for_create" do
13
+ subject { user.request_for_create(records, reason: reason) }
14
+ it { is_expected.to be_a(Approval::RequestForm::Create) }
15
+ end
16
+
17
+ describe "#request_for_update" do
18
+ subject { user.request_for_update(records, reason: reason) }
19
+ it { is_expected.to be_a(Approval::RequestForm::Update) }
20
+ end
21
+
22
+ describe "#request_for_destroy" do
23
+ subject { user.request_for_destroy(records, reason: reason) }
24
+ it { is_expected.to be_a(Approval::RequestForm::Destroy) }
25
+ end
26
+ end
27
+
28
+ describe "RespondForm" do
29
+ let(:user) { build :user }
30
+ let(:request) { build :request }
31
+ let(:reason) { "reason" }
32
+
33
+ describe "#cancel_request" do
34
+ subject { user.cancel_request(request, reason: reason) }
35
+ it { is_expected.to be_a(Approval::RespondForm::Cancel) }
36
+ end
37
+
38
+ describe "#approve_request" do
39
+ subject { user.approve_request(request, reason: reason) }
40
+ it { is_expected.to be_a(Approval::RespondForm::Approve) }
41
+ end
42
+
43
+ describe "#reject_request" do
44
+ subject { user.reject_request(request, reason: reason) }
45
+ it { is_expected.to be_a(Approval::RespondForm::Reject) }
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,16 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require turbolinks
16
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,3 @@
1
+ class Book < ActiveRecord::Base
2
+ acts_as_approval_resource
3
+ end
@@ -0,0 +1,3 @@
1
+ class User < ActiveRecord::Base
2
+ acts_as_approval_user
3
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Rails429</title>
5
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
6
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run