auction_fun_core 0.8.9 → 0.8.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/auction_fun_core.gemspec +1 -1
  4. data/lib/auction_fun_core/version.rb +1 -1
  5. data/spec/auction_fun_core/contracts/auction_context/create_contract_spec.rb +158 -0
  6. data/spec/auction_fun_core/contracts/auction_context/post_auction/participant_contract_spec.rb +77 -0
  7. data/spec/auction_fun_core/contracts/auction_context/post_auction/winner_contract_spec.rb +76 -0
  8. data/spec/auction_fun_core/contracts/auction_context/pre_auction/auction_start_reminder_contract_spec.rb +48 -0
  9. data/spec/auction_fun_core/contracts/auction_context/processor/finish/closed_contract_spec.rb +59 -0
  10. data/spec/auction_fun_core/contracts/auction_context/processor/finish/penny_contract_spec.rb +59 -0
  11. data/spec/auction_fun_core/contracts/auction_context/processor/finish/standard_contract_spec.rb +59 -0
  12. data/spec/auction_fun_core/contracts/auction_context/processor/pause_contract_spec.rb +39 -0
  13. data/spec/auction_fun_core/contracts/auction_context/processor/start_contract_spec.rb +59 -0
  14. data/spec/auction_fun_core/contracts/auction_context/processor/unpause_contract_spec.rb +39 -0
  15. data/spec/auction_fun_core/contracts/bid_context/create_bid_closed_contract_spec.rb +130 -0
  16. data/spec/auction_fun_core/contracts/bid_context/create_bid_penny_contract_spec.rb +118 -0
  17. data/spec/auction_fun_core/contracts/bid_context/create_bid_standard_contract_spec.rb +154 -0
  18. data/spec/auction_fun_core/contracts/staff_context/authentication_contract_spec.rb +89 -0
  19. data/spec/auction_fun_core/contracts/staff_context/registration_contract_spec.rb +24 -0
  20. data/spec/auction_fun_core/contracts/user_context/authentication_contract_spec.rb +89 -0
  21. data/spec/auction_fun_core/contracts/user_context/email_confirmation_contract_spec.rb +54 -0
  22. data/spec/auction_fun_core/contracts/user_context/phone_confirmation_contract_spec.rb +54 -0
  23. data/spec/auction_fun_core/contracts/user_context/registration_contract_spec.rb +27 -0
  24. data/spec/auction_fun_core/entities/auction_spec.rb +75 -0
  25. data/spec/auction_fun_core/entities/bid_spec.rb +7 -0
  26. data/spec/auction_fun_core/entities/staff_spec.rb +38 -0
  27. data/spec/auction_fun_core/entities/user_spec.rb +106 -0
  28. data/spec/auction_fun_core/operations/auction_context/create_operation_spec.rb +126 -0
  29. data/spec/auction_fun_core/operations/auction_context/post_auction/participant_operation_spec.rb +88 -0
  30. data/spec/auction_fun_core/operations/auction_context/post_auction/winner_operation_spec.rb +76 -0
  31. data/spec/auction_fun_core/operations/auction_context/pre_auction/auction_start_reminder_operation_spec.rb +98 -0
  32. data/spec/auction_fun_core/operations/auction_context/processor/finish/closed_operation_spec.rb +107 -0
  33. data/spec/auction_fun_core/operations/auction_context/processor/finish/penny_operation_spec.rb +107 -0
  34. data/spec/auction_fun_core/operations/auction_context/processor/finish/standard_operation_spec.rb +106 -0
  35. data/spec/auction_fun_core/operations/auction_context/processor/pause_operation_spec.rb +83 -0
  36. data/spec/auction_fun_core/operations/auction_context/processor/start_operation_spec.rb +147 -0
  37. data/spec/auction_fun_core/operations/auction_context/processor/unpause_operation_spec.rb +80 -0
  38. data/spec/auction_fun_core/operations/bid_context/create_bid_closed_operation_spec.rb +95 -0
  39. data/spec/auction_fun_core/operations/bid_context/create_bid_penny_operation_spec.rb +133 -0
  40. data/spec/auction_fun_core/operations/bid_context/create_bid_standard_operation_spec.rb +95 -0
  41. data/spec/auction_fun_core/operations/staff_context/authentication_operation_spec.rb +74 -0
  42. data/spec/auction_fun_core/operations/staff_context/registration_operation_spec.rb +93 -0
  43. data/spec/auction_fun_core/operations/user_context/authentication_operation_spec.rb +74 -0
  44. data/spec/auction_fun_core/operations/user_context/email_confirmation_operation_spec.rb +76 -0
  45. data/spec/auction_fun_core/operations/user_context/phone_confirmation_operation_spec.rb +76 -0
  46. data/spec/auction_fun_core/operations/user_context/registration_operation_spec.rb +100 -0
  47. data/spec/auction_fun_core/relations/auctions_spec.rb +471 -0
  48. data/spec/auction_fun_core/repos/auction_context/auction_repository_spec.rb +64 -0
  49. data/spec/auction_fun_core/repos/bid_context/bid_repository_spec.rb +64 -0
  50. data/spec/auction_fun_core/repos/staff_context/staff_repository_spec.rb +118 -0
  51. data/spec/auction_fun_core/repos/user_context/user_repository_spec.rb +117 -0
  52. data/spec/auction_fun_core/services/mail/auction_context/post_auction/participant_mailer_spec.rb +48 -0
  53. data/spec/auction_fun_core/services/mail/auction_context/post_auction/winner_mailer_spec.rb +48 -0
  54. data/spec/auction_fun_core/services/mail/auction_context/pre_auction/auction_start_reminder_mailer_spec.rb +40 -0
  55. data/spec/auction_fun_core/services/mail/user_context/registration_mailer_spec.rb +33 -0
  56. data/spec/auction_fun_core/workers/operations/auction_context/post_auction/participation_operation_job_spec.rb +54 -0
  57. data/spec/auction_fun_core/workers/operations/auction_context/post_auction/winner_operation_job_spec.rb +48 -0
  58. data/spec/auction_fun_core/workers/operations/auction_context/pre_auction/auction_start_reminder_operation_job_spec.rb +53 -0
  59. data/spec/auction_fun_core/workers/operations/auction_context/processor/finish/closed_operation_job_spec.rb +47 -0
  60. data/spec/auction_fun_core/workers/operations/auction_context/processor/finish/penny_operation_job_spec.rb +47 -0
  61. data/spec/auction_fun_core/workers/operations/auction_context/processor/finish/standard_operation_job_spec.rb +47 -0
  62. data/spec/auction_fun_core/workers/operations/auction_context/processor/start_operation_job_spec.rb +47 -0
  63. data/spec/auction_fun_core/workers/services/mail/auction_context/post_auction/participant_mailer_job_spec.rb +62 -0
  64. data/spec/auction_fun_core/workers/services/mail/auction_context/post_auction/pre_auction/auction_start_reminder_mailer_job_spec.rb +59 -0
  65. data/spec/auction_fun_core/workers/services/mail/auction_context/post_auction/winner_mailer_job_spec.rb +62 -0
  66. data/spec/auction_fun_core/workers/services/mail/user_context/registration_mailer_job_spec.rb +53 -0
  67. data/spec/auction_fun_core_spec.rb +7 -0
  68. data/spec/spec_helper.rb +61 -0
  69. data/spec/support/background_job.rb +7 -0
  70. data/spec/support/factories/auctions.rb +143 -0
  71. data/spec/support/factories/bids.rb +6 -0
  72. data/spec/support/factories/staffs.rb +18 -0
  73. data/spec/support/factories/users.rb +43 -0
  74. data/spec/support/faker.rb +6 -0
  75. data/spec/support/mail.rb +13 -0
  76. data/spec/support/shared_examples/validate_email_contract.rb +25 -0
  77. data/spec/support/shared_examples/validate_name_contract.rb +19 -0
  78. data/spec/support/shared_examples/validate_password_confirmation_contract.rb +16 -0
  79. data/spec/support/shared_examples/validate_password_contract.rb +18 -0
  80. data/spec/support/shared_examples/validate_phone_contract.rb +25 -0
  81. data/spec/support/shared_examples/validate_stopwatch_contract.rb +32 -0
  82. metadata +79 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a93057cdc62225a319b45c2836b5cfd713935664c8a7d9bdf2d39678909dacc7
4
- data.tar.gz: 87f51a7eb83f0b47bc13394c36e37f36821a8ef5f4c429ec18e272155d9a1261
3
+ metadata.gz: 51265464431c461d76cdb8ea73db67d5c0e89b5940c40234a91bca69c8340824
4
+ data.tar.gz: 3412345a03d4524a63a25540a883476793c72e60acc8da1d5819168d8a9a6082
5
5
  SHA512:
6
- metadata.gz: 70b11f00396f1195ae8e7060eb8316141abbe3e3f30621d80769d94b63b4d1469695b6ca0a35a9910419e7579f047b2bd9d4f7a3ad469803cf47cb3aae4efc75
7
- data.tar.gz: 520de3854f324a0e79bca1c4bfdfe69288077e208de37831b3c25cd84e75acb2664f79cf87372cee2ffb4a4a3800398b0fd72c537cb83a330b925c2d0113cdbe
6
+ metadata.gz: dd567b1504d755539f5f3f277bfb763816b23b5b725aee4c84b3ccae0722be04565aba2eb4d419dd0a33e3d8c024dc49b261d152e839755b4669fe80f36f9a4a
7
+ data.tar.gz: c7bcec000da4c4fee6f51b4bc511b23caa89760d9b1559c7754d37f7cc9f4f3556b4e3060a6e0aba66131563da3c65a8908135c411a65f242a9b0f59042e6b26
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.8.10] - 2024-04-30
4
+
5
+ ### Changed
6
+
7
+ - Allow spec files when publishing the gem;
8
+
3
9
  ## [0.8.9] - 2024-04-29
4
10
 
5
11
  ### Added
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.files = Dir.chdir(__dir__) do
26
26
  `git ls-files -z`.split("\x0").reject do |f|
27
27
  (File.expand_path(f) == __FILE__) ||
28
- f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
28
+ f.start_with?(*%w[bin/ test/ features/ .git .github appveyor Gemfile])
29
29
  end
30
30
  end
31
31
  spec.bindir = "exe"
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AuctionFunCore
4
- VERSION = "0.8.9"
4
+ VERSION = "0.8.10"
5
5
 
6
6
  # Required class module is a gem dependency
7
7
  class Version; end
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::CreateContract, type: :contract do
4
+ let(:min) { described_class::AUCTION_MIN_TITLE_LENGTH }
5
+ let(:max) { described_class::AUCTION_MAX_TITLE_LENGTH }
6
+ let(:stopwatch_min_value) { described_class::AUCTION_STOPWATCH_MIN_VALUE }
7
+ let(:stopwatch_max_value) { described_class::AUCTION_STOPWATCH_MAX_VALUE }
8
+ let(:kinds) { described_class::AUCTION_KINDS.join(", ") }
9
+
10
+ describe "#call" do
11
+ subject(:contract) { described_class.new.call(attributes) }
12
+
13
+ context "when params are blank" do
14
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
15
+
16
+ it "expect failure with error messages" do
17
+ expect(contract).to be_failure
18
+
19
+ expect(contract.errors[:title]).to include(I18n.t("contracts.errors.key?"))
20
+ expect(contract.errors[:kind]).to include(I18n.t("contracts.errors.key?"))
21
+ expect(contract.errors[:started_at]).to include(I18n.t("contracts.errors.key?"))
22
+ expect(contract.errors[:staff_id]).to include(I18n.t("contracts.errors.key?"))
23
+ end
24
+ end
25
+
26
+ context "with default values" do
27
+ let(:attributes) { {initial_bid_cents: 100} }
28
+
29
+ it "expect minimal_bid_cents to be equal initial_bid_cents" do
30
+ expect(contract[:minimal_bid_cents]).to eq(100)
31
+ end
32
+ end
33
+
34
+ describe "#staff_id" do
35
+ context "when staff is not found on database" do
36
+ let(:attributes) { {staff_id: 1} }
37
+
38
+ it "expect failure with error messages" do
39
+ expect(contract).to be_failure
40
+ expect(contract.errors[:staff_id])
41
+ .to include(I18n.t("contracts.errors.custom.default.not_found"))
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "#title" do
47
+ let(:attributes) { {title: "abc"} }
48
+
49
+ context "when the characters in the title are outside the allowed range" do
50
+ it "expect failure with error messages" do
51
+ expect(subject).to be_failure
52
+
53
+ expect(subject.errors[:title]).to include(
54
+ I18n.t("contracts.errors.size?.value.string.arg.range", size_left: min, size_right: max)
55
+ )
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "#kind" do
61
+ context "when kind is outside of default list" do
62
+ let(:attributes) { {kind: "unknown"} }
63
+
64
+ it "expect failure with error messages" do
65
+ expect(contract).to be_failure
66
+ expect(contract.errors[:kind]).to include(
67
+ I18n.t("contracts.errors.included_in?.arg.default", list: kinds)
68
+ )
69
+ end
70
+ end
71
+
72
+ context "when kind is standard or closed and finished_at is blank" do
73
+ let(:attributes) { {kind: "standard", started_at: 3.hours.from_now} }
74
+
75
+ it "expect failure with error messages" do
76
+ expect(contract).to be_failure
77
+ expect(contract.errors[:finished_at]).to include(I18n.t("contracts.errors.filled?"))
78
+ end
79
+ end
80
+
81
+ context "when kind is closed and finished_at is blank" do
82
+ let(:attributes) { {kind: "closed", started_at: 3.hours.from_now} }
83
+
84
+ it "expect failure with error messages" do
85
+ expect(contract).to be_failure
86
+ expect(contract.errors[:finished_at]).to include(I18n.t("contracts.errors.filled?"))
87
+ end
88
+ end
89
+ end
90
+
91
+ describe "#started_at" do
92
+ context "when is less than or equal to now" do
93
+ let(:attributes) { {started_at: 3.days.ago} }
94
+
95
+ it "expect failure with error messages" do
96
+ expect(contract).to be_failure
97
+ expect(contract.errors[:started_at])
98
+ .to include(I18n.t("contracts.errors.custom.default.future"))
99
+ end
100
+ end
101
+ end
102
+
103
+ describe "#finished_at" do
104
+ context "when started_at is less than or equal to finished_at" do
105
+ let(:same_time) { 3.hours.from_now }
106
+ let(:attributes) { {kind: "standard", started_at: same_time, finished_at: same_time} }
107
+
108
+ it "expect failure with error messages" do
109
+ expect(contract).to be_failure
110
+ expect(contract.errors[:finished_at])
111
+ .to include(I18n.t("contracts.errors.custom.auction_context.create.finished_at"))
112
+ end
113
+ end
114
+ end
115
+
116
+ describe "#initial_bid_cents" do
117
+ context "when kind is standard or closed and initial_bid_cents is blank" do
118
+ let(:attributes) { {kind: "standard"} }
119
+
120
+ it "expect failure with error messages" do
121
+ expect(contract).to be_failure
122
+ expect(contract.errors[:initial_bid_cents]).to include(I18n.t("contracts.errors.filled?"))
123
+ end
124
+ end
125
+
126
+ context "when kind is standard or closed and initial_bid_cents is less than or equal to zero" do
127
+ let(:attributes) { {kind: "standard", initial_bid_cents: 0} }
128
+
129
+ it "expect failure with error messages" do
130
+ expect(contract).to be_failure
131
+ expect(contract.errors[:initial_bid_cents]).to include(I18n.t("contracts.errors.gt?", num: 0))
132
+ end
133
+ end
134
+
135
+ context "when kind is penny and initial_bid_cents is blank" do
136
+ let(:attributes) { {kind: "penny"} }
137
+
138
+ it "expect failure without error message in field" do
139
+ expect(contract).to be_failure
140
+ expect(contract.errors[:initial_bid_cents]).to be_blank
141
+ end
142
+ end
143
+
144
+ context "when kind is penny and initial_bid_cents is not zero" do
145
+ let(:attributes) { {kind: "penny", initial_bid_cents: 1000} }
146
+
147
+ it "expect failure with error message" do
148
+ expect(contract).to be_failure
149
+ expect(contract.errors[:initial_bid_cents]).to include(I18n.t("contracts.errors.eql?", left: 0))
150
+ end
151
+ end
152
+ end
153
+
154
+ it_behaves_like "validate_stopwatch_contract" do
155
+ let(:auction) { Factory.structs[:auction, :with_kind_penny, :with_status_scheduled, initial_bid_cents: 1000] }
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::PostAuction::ParticipantContract, type: :contract do
4
+ let(:auction) { Factory[:auction, :default_finished_standard, :with_winner] }
5
+ let(:participant) { Factory[:user] }
6
+
7
+ describe "#call" do
8
+ subject(:contract) { described_class.new.call(attributes) }
9
+
10
+ context "when attributes are invalid" do
11
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
12
+
13
+ it "expect failure with error messages" do
14
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.key?"))
15
+ expect(contract.errors[:participant_id]).to include(I18n.t("contracts.errors.key?"))
16
+ end
17
+ end
18
+
19
+ context "when auction is not found on database" do
20
+ let(:attributes) do
21
+ {
22
+ auction_id: 2_234_231,
23
+ participant_id: participant.id
24
+ }
25
+ end
26
+
27
+ it "expect failure with error messages" do
28
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.custom.not_found"))
29
+ end
30
+ end
31
+
32
+ context "when participant is not found on database" do
33
+ let(:attributes) do
34
+ {
35
+ auction_id: auction.id,
36
+ participant_id: 2_234_231
37
+ }
38
+ end
39
+
40
+ it "expect failure with error messages" do
41
+ expect(contract.errors[:participant_id]).to include(I18n.t("contracts.errors.custom.not_found"))
42
+ end
43
+ end
44
+
45
+ context "when the user did not bid in the auction" do
46
+ let(:attributes) do
47
+ {
48
+ auction_id: auction.id,
49
+ participant_id: participant.id
50
+ }
51
+ end
52
+
53
+ it "expect failure with error messages" do
54
+ expect(contract.errors[:participant_id]).to include(I18n.t("none", scope: described_class::I18N_SCOPE))
55
+ end
56
+ end
57
+
58
+ context "when the user placed at least one bid in the auction" do
59
+ let(:attributes) do
60
+ {
61
+ auction_id: auction.id,
62
+ participant_id: participant.id
63
+ }
64
+ end
65
+
66
+ before do
67
+ Factory[:bid, auction: auction, user_id: participant.id, value_cents: auction.minimal_bid_cents]
68
+ end
69
+
70
+ it "expect return success" do
71
+ expect(contract).to be_success
72
+ expect(contract.context[:auction]).to be_a(AuctionFunCore::Entities::Auction)
73
+ expect(contract.context[:participant]).to be_a(AuctionFunCore::Entities::User)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::PostAuction::WinnerContract, type: :contract do
4
+ let(:auction) { Factory[:auction, :default_finished_standard, :with_winner] }
5
+ let(:winner) { auction.winner }
6
+
7
+ describe "#call" do
8
+ subject(:contract) { described_class.new.call(attributes) }
9
+
10
+ context "when attributes are invalid" do
11
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
12
+
13
+ it "expect failure with error messages" do
14
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.key?"))
15
+ expect(contract.errors[:winner_id]).to include(I18n.t("contracts.errors.key?"))
16
+ end
17
+ end
18
+
19
+ context "when auction is not found on database" do
20
+ let(:attributes) do
21
+ {
22
+ auction_id: 2_234_231,
23
+ winner_id: winner.id
24
+ }
25
+ end
26
+
27
+ it "expect failure with error messages" do
28
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.custom.not_found"))
29
+ end
30
+ end
31
+
32
+ context "when winner is not found on database" do
33
+ let(:attributes) do
34
+ {
35
+ auction_id: auction.id,
36
+ winner_id: 2_234_231
37
+ }
38
+ end
39
+
40
+ it "expect failure with error messages" do
41
+ expect(contract.errors[:winner_id]).to include(I18n.t("contracts.errors.custom.not_found"))
42
+ end
43
+ end
44
+
45
+ context "when the informed winner is different from the one set in the auction" do
46
+ let(:real_winner) { Factory[:user] }
47
+ let(:fake_winner) { Factory[:user] }
48
+ let(:auction) { Factory[:auction, :default_scheduled_standard, winner_id: real_winner.id] }
49
+ let(:attributes) do
50
+ {
51
+ auction_id: auction.id,
52
+ winner_id: fake_winner.id
53
+ }
54
+ end
55
+
56
+ it "expect failure with error messages" do
57
+ expect(contract.errors[:winner_id]).to include(I18n.t("wrong", scope: described_class::I18N_SCOPE))
58
+ end
59
+ end
60
+
61
+ context "when the informed winner is the same as the one set in the auction" do
62
+ let(:attributes) do
63
+ {
64
+ auction_id: auction.id,
65
+ winner_id: winner.id
66
+ }
67
+ end
68
+
69
+ it "expect return sucess" do
70
+ expect(contract).to be_success
71
+ expect(contract.context[:auction]).to be_a(AuctionFunCore::Entities::Auction)
72
+ expect(contract.context[:winner]).to be_a(AuctionFunCore::Entities::User)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::PreAuction::AuctionStartReminderContract, type: :contract do
4
+ describe "#call" do
5
+ subject(:contract) { described_class.new.call(attributes) }
6
+
7
+ describe "#call" do
8
+ subject(:contract) { described_class.new.call(attributes) }
9
+
10
+ context "when attributes are invalid" do
11
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
12
+
13
+ it "expect failure with error messages" do
14
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.key?"))
15
+ end
16
+ end
17
+
18
+ context "when auction is not found on database" do
19
+ let(:attributes) { {auction_id: 2_234_231} }
20
+
21
+ it "expect failure with error messages" do
22
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.custom.not_found"))
23
+ end
24
+ end
25
+
26
+ context "when the auction has already started" do
27
+ let(:auction) { Factory[:auction, :default_finished_standard, started_at: 3.hours.ago] }
28
+ let(:attributes) { {auction_id: auction.id} }
29
+
30
+ it "expect failure with error messages" do
31
+ expect(contract.errors[:base]).to include(
32
+ I18n.t("contracts.errors.custom.auction_context.pre_auction.auction_start_reminder.auction_already_started")
33
+ )
34
+ end
35
+ end
36
+
37
+ context "when the auction has not started" do
38
+ let(:auction) { Factory[:auction, :default_scheduled_standard, started_at: 3.hours.from_now] }
39
+ let(:attributes) { {auction_id: auction.id} }
40
+
41
+ it "expect return success" do
42
+ expect(contract).to be_success
43
+ expect(contract.context[:auction]).to be_a(AuctionFunCore::Entities::Auction)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::Processor::Finish::ClosedContract, type: :contract do
4
+ describe "#call" do
5
+ subject(:contract) { described_class.new.call(attributes) }
6
+
7
+ context "when attributes are invalid" do
8
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
9
+
10
+ it "expect failure with error messages" do
11
+ expect(contract).to be_failure
12
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.key?"))
13
+ end
14
+ end
15
+
16
+ context "when auction is not found on database" do
17
+ let(:attributes) { {auction_id: rand(10_000..1_000_000)} }
18
+
19
+ it "expect failure with error messages" do
20
+ expect(contract).to be_failure
21
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.custom.not_found"))
22
+ end
23
+ end
24
+
25
+ context "when auction kind is not equal to 'closed'" do
26
+ let(:auction) { Factory[:auction, :default_running_standard] }
27
+ let(:attributes) { {auction_id: auction.id} }
28
+
29
+ it "expect failure with error messages" do
30
+ expect(contract).to be_failure
31
+ expect(contract.errors[:base]).to include(
32
+ I18n.t("contracts.errors.custom.auction_context.processor.finish.invalid_kind")
33
+ )
34
+ end
35
+ end
36
+
37
+ context "when auction status is not equal to 'running'" do
38
+ let(:auction) { Factory[:auction, :default_paused_standard] }
39
+ let(:attributes) { {auction_id: auction.id} }
40
+
41
+ it "expect failure with error messages" do
42
+ expect(contract).to be_failure
43
+ expect(contract.errors[:base]).to include(
44
+ I18n.t("contracts.errors.custom.auction_context.processor.finish.invalid_status")
45
+ )
46
+ end
47
+ end
48
+
49
+ context "when attributes are valid" do
50
+ let(:auction) { Factory[:auction, :default_running_closed] }
51
+ let(:attributes) { {auction_id: auction.id} }
52
+
53
+ it "expect return success" do
54
+ expect(contract).to be_success
55
+ expect(contract.context[:auction]).to be_a(AuctionFunCore::Entities::Auction)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::Processor::Finish::PennyContract, type: :contract do
4
+ describe "#call" do
5
+ subject(:contract) { described_class.new.call(attributes) }
6
+
7
+ context "when attributes are invalid" do
8
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
9
+
10
+ it "expect failure with error messages" do
11
+ expect(contract).to be_failure
12
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.key?"))
13
+ end
14
+ end
15
+
16
+ context "when auction is not found on database" do
17
+ let(:attributes) { {auction_id: rand(10_000..1_000_000)} }
18
+
19
+ it "expect failure with error messages" do
20
+ expect(contract).to be_failure
21
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.custom.not_found"))
22
+ end
23
+ end
24
+
25
+ context "when auction kind is not equal to 'penny'" do
26
+ let(:auction) { Factory[:auction, :default_running_standard] }
27
+ let(:attributes) { {auction_id: auction.id} }
28
+
29
+ it "expect failure with error messages" do
30
+ expect(contract).to be_failure
31
+ expect(contract.errors[:base]).to include(
32
+ I18n.t("contracts.errors.custom.auction_context.processor.finish.invalid_kind")
33
+ )
34
+ end
35
+ end
36
+
37
+ context "when auction status is not equal to 'running'" do
38
+ let(:auction) { Factory[:auction, :default_paused_standard] }
39
+ let(:attributes) { {auction_id: auction.id} }
40
+
41
+ it "expect failure with error messages" do
42
+ expect(contract).to be_failure
43
+ expect(contract.errors[:base]).to include(
44
+ I18n.t("contracts.errors.custom.auction_context.processor.finish.invalid_status")
45
+ )
46
+ end
47
+ end
48
+
49
+ context "when attributes are valid" do
50
+ let(:auction) { Factory[:auction, :default_running_penny] }
51
+ let(:attributes) { {auction_id: auction.id} }
52
+
53
+ it "expect return success" do
54
+ expect(contract).to be_success
55
+ expect(contract.context[:auction]).to be_a(AuctionFunCore::Entities::Auction)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::Processor::Finish::StandardContract, type: :contract do
4
+ describe "#call" do
5
+ subject(:contract) { described_class.new.call(attributes) }
6
+
7
+ context "when attributes are invalid" do
8
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
9
+
10
+ it "expect failure with error messages" do
11
+ expect(contract).to be_failure
12
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.key?"))
13
+ end
14
+ end
15
+
16
+ context "when auction is not found on database" do
17
+ let(:attributes) { {auction_id: rand(10_000..1_000_000)} }
18
+
19
+ it "expect failure with error messages" do
20
+ expect(contract).to be_failure
21
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.custom.not_found"))
22
+ end
23
+ end
24
+
25
+ context "when auction kind is not equal to 'standard'" do
26
+ let(:auction) { Factory[:auction, :default_running_penny] }
27
+ let(:attributes) { {auction_id: auction.id} }
28
+
29
+ it "expect failure with error messages" do
30
+ expect(contract).to be_failure
31
+ expect(contract.errors[:base]).to include(
32
+ I18n.t("contracts.errors.custom.auction_context.processor.finish.invalid_kind")
33
+ )
34
+ end
35
+ end
36
+
37
+ context "when auction status is not equal to 'running'" do
38
+ let(:auction) { Factory[:auction, :default_paused_standard] }
39
+ let(:attributes) { {auction_id: auction.id} }
40
+
41
+ it "expect failure with error messages" do
42
+ expect(contract).to be_failure
43
+ expect(contract.errors[:base]).to include(
44
+ I18n.t("contracts.errors.custom.auction_context.processor.finish.invalid_status")
45
+ )
46
+ end
47
+ end
48
+
49
+ context "when attributes are valid" do
50
+ let(:auction) { Factory[:auction, :default_running_standard] }
51
+ let(:attributes) { {auction_id: auction.id} }
52
+
53
+ it "expect return success" do
54
+ expect(contract).to be_success
55
+ expect(contract.context[:auction]).to be_a(AuctionFunCore::Entities::Auction)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::Processor::PauseContract, type: :contract do
4
+ let(:auction) { Factory[:auction, :default_scheduled_standard] }
5
+
6
+ describe "#call" do
7
+ subject(:contract) { described_class.new.call(attributes) }
8
+
9
+ context "when attributes are invalid" do
10
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
11
+
12
+ it "expect failure with error messages" do
13
+ expect(contract).to be_failure
14
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.key?"))
15
+ end
16
+ end
17
+
18
+ context "when auction status is different to 'running'" do
19
+ let(:attributes) { {auction_id: auction.id} }
20
+
21
+ it "expect failure with error messages" do
22
+ expect(contract).to be_failure
23
+ expect(contract.errors[:auction_id]).to include(
24
+ I18n.t("contracts.errors.custom.bids.invalid_status")
25
+ )
26
+ end
27
+ end
28
+
29
+ context "when auction status is equal to 'running'" do
30
+ let(:auction) { Factory[:auction, :default_running_standard] }
31
+ let(:attributes) { {auction_id: auction.id} }
32
+
33
+ it "expect return success" do
34
+ expect(contract).to be_success
35
+ expect(contract.context[:auction]).to be_a(AuctionFunCore::Entities::Auction)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AuctionFunCore::Contracts::AuctionContext::Processor::StartContract, type: :contract do
4
+ let(:auction) { Factory[:auction, :default_scheduled_standard] }
5
+ let(:kinds) { described_class::AUCTION_KINDS.join(", ") }
6
+
7
+ describe "#call" do
8
+ subject(:contract) { described_class.new.call(attributes) }
9
+
10
+ context "when all attributes are blank" do
11
+ let(:attributes) { Dry::Core::Constants::EMPTY_HASH }
12
+
13
+ it "expect failure with error messages" do
14
+ expect(contract).to be_failure
15
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.key?"))
16
+ expect(contract.errors[:kind]).to include(I18n.t("contracts.errors.key?"))
17
+ end
18
+ end
19
+
20
+ it_behaves_like "validate_stopwatch_contract" do
21
+ let(:auction) { Factory[:auction, :default_scheduled_penny] }
22
+ end
23
+
24
+ context "when auction_id is not founded on database" do
25
+ let(:attributes) { {auction_id: 2_234_231} }
26
+
27
+ it "expect failure with error messages" do
28
+ expect(contract).to be_failure
29
+ expect(contract.errors[:auction_id]).to include(I18n.t("contracts.errors.custom.not_found"))
30
+ end
31
+ end
32
+
33
+ describe "when auction kind is invalid" do
34
+ let(:attributes) { {auction_id: auction.id, auction: "invalid"} }
35
+
36
+ it "expect failure with error messages" do
37
+ expect(contract).to be_failure
38
+ expect(contract.errors[:kind]).to include(
39
+ I18n.t("contracts.errors.included_in?.arg.default", list: kinds)
40
+ )
41
+ end
42
+ end
43
+
44
+ context "when attributes are valid" do
45
+ let(:attributes) do
46
+ {
47
+ auction_id: auction.id,
48
+ kind: auction.kind,
49
+ stopwatch: described_class::AUCTION_STOPWATCH_MIN_VALUE
50
+ }
51
+ end
52
+
53
+ it "expect return success" do
54
+ expect(contract).to be_success
55
+ expect(contract.context[:auction]).to be_a(AuctionFunCore::Entities::Auction)
56
+ end
57
+ end
58
+ end
59
+ end