spree_cm_commissioner 2.8.2.pre.pre.2 → 2.8.2

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 (152) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -4
  3. data/Gemfile.lock +1 -1
  4. data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
  5. data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -19
  6. data/app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb +0 -1
  7. data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
  8. data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
  9. data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
  10. data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
  11. data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
  12. data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
  13. data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
  14. data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
  15. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -2
  16. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -10
  17. data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
  18. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -39
  19. data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
  20. data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -15
  21. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -10
  22. data/app/models/spree_cm_commissioner/tenant.rb +0 -9
  23. data/app/models/spree_cm_commissioner/user_decorator.rb +0 -5
  24. data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
  25. data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -4
  26. data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
  27. data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +1 -1
  28. data/app/serializers/spree/v2/storefront/role_serializer.rb +1 -1
  29. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -2
  30. data/app/serializers/spree/v2/tenant/homepage_section_serializer.rb +1 -1
  31. data/app/serializers/spree/v2/tenant/role_serializer.rb +1 -1
  32. data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +0 -12
  33. data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
  34. data/config/initializers/spree_permitted_attributes.rb +0 -8
  35. data/config/locales/en.yml +0 -14
  36. data/config/locales/km.yml +0 -10
  37. data/config/routes.rb +0 -26
  38. data/lib/spree_cm_commissioner/version.rb +1 -1
  39. data/lib/spree_cm_commissioner.rb +1 -7
  40. data/spree_cm_commissioner.gemspec +1 -1
  41. metadata +4 -116
  42. data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
  43. data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
  44. data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
  45. data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
  46. data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
  47. data/app/controllers/spree/api/v2/tenant/free_vote_claims_controller.rb +0 -37
  48. data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
  49. data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
  50. data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
  51. data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
  52. data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -52
  53. data/app/controllers/spree/api/v2/tenant/show_elimination_sessions_controller.rb +0 -57
  54. data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
  55. data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
  56. data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -34
  57. data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
  58. data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -40
  59. data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
  60. data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
  61. data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
  62. data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
  63. data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
  64. data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -36
  65. data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
  66. data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
  67. data/app/models/spree_cm_commissioner/show.rb +0 -159
  68. data/app/models/spree_cm_commissioner/show_contestant.rb +0 -39
  69. data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
  70. data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
  71. data/app/models/spree_cm_commissioner/show_episode.rb +0 -135
  72. data/app/models/spree_cm_commissioner/show_person.rb +0 -15
  73. data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -20
  74. data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
  75. data/app/models/spree_cm_commissioner/vote.rb +0 -16
  76. data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -19
  77. data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -46
  78. data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
  79. data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
  80. data/app/models/spree_cm_commissioner/voting_session.rb +0 -223
  81. data/app/models/spree_cm_commissioner/voting_session_stat.rb +0 -8
  82. data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
  83. data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
  84. data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
  85. data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -17
  86. data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
  87. data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
  88. data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -26
  89. data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
  90. data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
  91. data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -22
  92. data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
  93. data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
  94. data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -18
  95. data/app/services/spree_cm_commissioner/fraud_check.rb +0 -279
  96. data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
  97. data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -44
  98. data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
  99. data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
  100. data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
  101. data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -68
  102. data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
  103. data/app/services/spree_cm_commissioner/vote_counters/snapshot_to_db.rb +0 -113
  104. data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
  105. data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
  106. data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
  107. data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
  108. data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -334
  109. data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -32
  110. data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -106
  111. data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
  112. data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -119
  113. data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
  114. data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
  115. data/app/services/spree_cm_commissioner/voting_leaderboards/calculate_score.rb +0 -74
  116. data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -66
  117. data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
  118. data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
  119. data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
  120. data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
  121. data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
  122. data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
  123. data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
  124. data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
  125. data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
  126. data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
  127. data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
  128. data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
  129. data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
  130. data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
  131. data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
  132. data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
  133. data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
  134. data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
  135. data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
  136. data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
  137. data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
  138. data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
  139. data/db/migrate/20260518090920_add_unique_voter_count_to_voting_contestants.rb +0 -5
  140. data/db/migrate/20260518094322_create_cm_voting_session_stats.rb +0 -17
  141. data/db/migrate/20260520000001_add_scoring_model_to_cm_voting_sessions.rb +0 -5
  142. data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
  143. data/db/migrate/20260525042257_add_vote_number_to_cm_voting_contestants.rb +0 -18
  144. data/db/migrate/20260527035430_add_confirmed_rank_to_cm_voting_contestants.rb +0 -5
  145. data/db/migrate/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
  146. data/docs/sql/jsonb_query_guide.md +0 -57
  147. data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
  148. data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -120
  149. data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
  150. data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
  151. data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
  152. data/lib/spree_cm_commissioner/test_helper/factories/voting_session_factory.rb +0 -11
@@ -1,17 +0,0 @@
1
- class CreateCmVotingSessionStats < ActiveRecord::Migration[7.0]
2
- def change
3
- create_table :cm_voting_session_stats, if_not_exists: true do |t|
4
- t.bigint :voting_session_id, null: false
5
- t.integer :unique_voter_count, default: 0, null: false
6
- t.integer :total_vote_count, default: 0, null: false
7
- t.decimal :vote_velocity, precision: 8, scale: 2
8
- t.bigint :leading_contestant_id
9
-
10
- t.timestamps
11
- end
12
-
13
- add_index :cm_voting_session_stats, :voting_session_id, unique: true, if_not_exists: true
14
- add_foreign_key :cm_voting_session_stats, :cm_voting_sessions, column: :voting_session_id, if_not_exists: true
15
- add_foreign_key :cm_voting_session_stats, :cm_voting_contestants, column: :leading_contestant_id, if_not_exists: true
16
- end
17
- end
@@ -1,5 +0,0 @@
1
- class AddScoringModelToCmVotingSessions < ActiveRecord::Migration[7.0]
2
- def change
3
- add_column :cm_voting_sessions, :scoring_model, :integer, default: 0, null: false, if_not_exists: true
4
- end
5
- end
@@ -1,22 +0,0 @@
1
- # Optimizes cm_votes indexes for the leaderboard unique voter queries.
2
- #
3
- # Removes two unused indexes:
4
- # - voter_identifier: stored on the row for audit purposes but never queried from DB
5
- # (fraud detection is entirely Redis-based)
6
- # - created_at: only used in ORDER BY after a user_id filter, so Postgres prefers
7
- # the (user_id, voting_session_id) index over this one — never used
8
- #
9
- # Adds one targeted index:
10
- # - (voting_session_id, user_id): used by PerContestantCounter#session_unique_voter_count
11
- # which runs COUNT(DISTINCT user_id) WHERE voting_session_id = ? AND user_id IS NOT NULL
12
- # for the leaderboard total unique voters display
13
- #
14
- # Net result: 5 → 4 indexes — fewer write penalties per vote INSERT, better read coverage.
15
- class OptimizeCmVotesIndexes < ActiveRecord::Migration[7.0]
16
- def change
17
- remove_index :cm_votes, :voter_identifier, if_exists: true
18
- remove_index :cm_votes, :created_at, if_exists: true
19
-
20
- add_index :cm_votes, [:voting_session_id, :user_id], if_not_exists: true
21
- end
22
- end
@@ -1,18 +0,0 @@
1
- class AddVoteNumberToCmVotingContestants < ActiveRecord::Migration[7.0]
2
- def change
3
- add_column :cm_voting_contestants, :vote_number, :integer, if_not_exists: true
4
- add_index :cm_voting_contestants, :vote_number, if_not_exists: true, name: 'index_cm_voting_contestants_on_vote_number'
5
-
6
- # Composite unique index: ensures vote_number is unique per contestant per session
7
- add_index :cm_voting_contestants, [:show_contestant_id, :voting_session_id, :vote_number],
8
- unique: true,
9
- if_not_exists: true,
10
- name: 'idx_voting_contestants_show_session_vote'
11
-
12
- # Remove duplicate index on advanced_to_type, advanced_to_id
13
- remove_index :cm_voting_contestants,
14
- column: [:advanced_to_type, :advanced_to_id],
15
- name: 'idx_voting_contestants_advanced_to',
16
- if_exists: true
17
- end
18
- end
@@ -1,5 +0,0 @@
1
- class AddConfirmedRankToCmVotingContestants < ActiveRecord::Migration[7.0]
2
- def change
3
- add_column :cm_voting_contestants, :confirmed_rank, :integer, if_not_exists: true
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class AddEliminatedAtToCmShowContestants < ActiveRecord::Migration[7.0]
2
- def change
3
- add_column :cm_show_contestants, :eliminated_at, :datetime, default: nil
4
- end
5
- end
@@ -1,57 +0,0 @@
1
- # PostgreSQL Query Guide: Double-Encoded JSONB Metadata
2
-
3
- This document explains how to perform SQL queries on the `private_metadata` and `public_metadata` columns in the `SpreeCmCommissioner` system, addressing the double-encoded JSON issue.
4
-
5
- ## The Problem: Double-Encoding
6
-
7
- In some models, the `jsonb` metadata columns contain data that has been double-serialized. Instead of a native JSON object, the database stores a JSON string scalar.
8
-
9
- **Example of raw database content:**
10
- ```json
11
- "{\"scheduled_at\":\"2026-03-25 07:40:17 UTC\",\"ends_at\":\"2026-03-27 07:40:17 UTC\"}"
12
- ```
13
- Because this is stored as a "string" inside the `jsonb` column, standard JSON operators like `->>` will return `NULL` when attempting to access keys directly (e.g., `private_metadata ->> 'scheduled_at'`).
14
-
15
- ## The SQL Workaround: `#>> '{}'`
16
-
17
- To query this data at the database level, you must first "unwrap" the string and cast it back to `jsonb`.
18
-
19
- ### 1. Unwrap and Cast to JSONB
20
- Use the `#>> '{}'` operator to extract the top-level string content, then cast it to `::jsonb`.
21
-
22
- ```sql
23
- (private_metadata #>> '{}')::jsonb
24
- ```
25
-
26
- ### 2. Access Specific Keys
27
- Once casted, you can use the standard `->>` operator.
28
-
29
- ```sql
30
- (private_metadata #>> '{}')::jsonb ->> 'scheduled_at'
31
- ```
32
-
33
- ### 3. Handle Timestamps (with Casting)
34
- Since values are extracted as text, you must cast them to `timestamp` or `timestamptz` for comparison.
35
-
36
- ```sql
37
- WHERE CAST((private_metadata #>> '{}')::jsonb ->> 'scheduled_at' AS timestamp) <= '2026-03-26 15:00:00'
38
- ```
39
-
40
- ## Example: ActiveRecord Scopes
41
-
42
- When implementing this in Rails models, use `Arel.sql` or string fragments within your scopes:
43
-
44
- ```ruby
45
- scope :current, ->(now = Time.current) {
46
- where("CAST((private_metadata #>> '{}')::jsonb ->> 'scheduled_at' AS timestamp) <= ?", now)
47
- .where("(private_metadata #>> '{}')::jsonb ->> 'ends_at' IS NULL OR CAST((private_metadata #>> '{}')::jsonb ->> 'ends_at' AS timestamp) >= ?", now)
48
- }
49
- ```
50
-
51
- ## Why this happens?
52
- This occurs because `ActiveRecord::Store` is used with a manual `coder` on a column that is already defined as `jsonb` in the database.
53
- 1. The coder converts the Hash to a JSON string.
54
- 2. ActiveRecord sees the `jsonb` type and encodes that string into a JSON scalar to ensure it fits the column type, resulting in the double-encoded format.
55
-
56
- > [!TIP]
57
- > This workaround is safer than a system-wide data migration as it works correctly regardless of whether the data is single-encoded or double-encoded (PostgreSQL's `#>> '{}'` is idempotent for already-correct JSONB objects).
@@ -1,12 +0,0 @@
1
- FactoryBot.define do
2
- factory :show_episode, class: 'SpreeCmCommissioner::ShowEpisode', parent: :cm_product do
3
- sequence(:name) { |n| "episode_#{n}" }
4
-
5
- association :event, factory: :show
6
- product_type { :vote_package }
7
- available_on { 1.day.ago }
8
-
9
- shipping_category { Spree::ShippingCategory.first || create(:shipping_category) }
10
- price { 10.0 }
11
- end
12
- end
@@ -1,120 +0,0 @@
1
- FactoryBot.define do
2
- factory :cm_show, class: 'SpreeCmCommissioner::Show' do
3
- sequence(:name) { |n| "Show #{n}" }
4
- vendor { Spree::Vendor.first || create(:cm_vendor) }
5
-
6
- before(:create) do |show|
7
- taxonomy = Spree::Taxonomy.shows
8
- show.taxonomy_id ||= taxonomy.id
9
- show.parent_id ||= taxonomy.root.id
10
- show.type = 'SpreeCmCommissioner::Show'
11
- show.kind = :event
12
- end
13
-
14
- factory :cm_show_with_season do
15
- after(:create) do |show|
16
- create(:cm_show_season, parent: show)
17
- end
18
- end
19
- end
20
-
21
- factory :cm_show_season, class: 'SpreeCmCommissioner::Show' do
22
- sequence(:name) { |n| "Season #{n}" }
23
- association :parent, factory: :cm_show
24
- vendor { parent.vendor }
25
- season_number { 1 }
26
- season_year { Time.current.year }
27
-
28
- before(:create) do |season|
29
- season.taxonomy_id = season.parent.taxonomy_id
30
- season.type = 'SpreeCmCommissioner::Show'
31
- season.kind = :event
32
- end
33
- end
34
-
35
- factory :cm_show_episode, class: 'SpreeCmCommissioner::ShowEpisode', parent: :cm_product do
36
- sequence(:name) { |n| "Episode #{n}" }
37
- event { association :cm_show }
38
- vendor { event.vendor }
39
-
40
- before(:create) do |episode|
41
- episode.type = 'SpreeCmCommissioner::ShowEpisode'
42
- episode.scheduled_at ||= Time.current
43
- episode.ends_at ||= 1.day.from_now
44
- episode.shipping_category ||= Spree::ShippingCategory.first_or_create!(name: 'Default')
45
- end
46
-
47
- trait :current do
48
- after(:build) do |episode|
49
- episode.scheduled_at = 1.day.ago
50
- episode.ends_at = 1.day.from_now
51
- end
52
- end
53
-
54
- trait :upcoming do
55
- after(:build) do |episode|
56
- episode.scheduled_at = 1.day.from_now
57
- end
58
- end
59
- end
60
-
61
- factory :cm_show_person, class: 'SpreeCmCommissioner::ShowPerson' do
62
- sequence(:name) { |n| "Show Person #{n}" }
63
- end
64
-
65
- factory :cm_show_person_assignment, class: 'SpreeCmCommissioner::ShowPersonAssignment' do
66
- association :show_person, factory: :cm_show_person
67
- association :show, factory: :cm_show
68
- role { :coach }
69
- end
70
-
71
- factory :cm_show_contestant, class: 'SpreeCmCommissioner::ShowContestant' do
72
- sequence(:name) { |n| "Contestant #{n}" }
73
- association :show, factory: :cm_show
74
- sequence(:contestant_number) { |n| "CON-#{n}" }
75
- status { :active }
76
- position { 0 }
77
- video_highlights { [] }
78
- end
79
-
80
- factory :cm_voting_session, class: 'SpreeCmCommissioner::VotingSession' do
81
- sequence(:name) { |n| "Session #{n}" }
82
- association :episode, factory: :cm_show_episode
83
- show { episode.event }
84
- vendor { episode.vendor }
85
- opens_at { 1.hour.ago }
86
- closes_at { 1.hour.from_now }
87
- status { :enabled }
88
- end
89
-
90
- factory :cm_voting_session_stat, class: 'SpreeCmCommissioner::VotingSessionStat' do
91
- association :voting_session, factory: :cm_voting_session
92
- unique_voter_count { 0 }
93
- total_vote_count { 0 }
94
- vote_velocity { 0.0 }
95
- leading_contestant { nil }
96
- end
97
-
98
- factory :cm_voting_contestant, class: 'SpreeCmCommissioner::VotingContestant' do
99
- show { create(:cm_show) }
100
- show_contestant { create(:cm_show_contestant, show: show) }
101
- voting_session { create(:cm_voting_session, episode: create(:cm_show_episode, event: show), show: show, vendor: show.vendor) }
102
- show_id { show.id }
103
- eliminated { false }
104
-
105
- trait :eliminated do
106
- eliminated { true }
107
- eliminated_via { :public_vote }
108
- end
109
-
110
- trait :eliminated_by_judges do
111
- eliminated { true }
112
- eliminated_via { :judges_deadlock }
113
- end
114
-
115
- trait :eliminated_by_coach do
116
- eliminated { true }
117
- eliminated_via { :coach_decision }
118
- end
119
- end
120
- end
@@ -1,37 +0,0 @@
1
- FactoryBot.define do
2
- factory :voting_credit, class: 'SpreeCmCommissioner::VotingCredit' do
3
- tenant_id { 1 }
4
- association :user
5
- created_by { nil }
6
-
7
- category { :purchase }
8
- credit_type { nil }
9
-
10
- votable { nil }
11
-
12
- free_votes_amount { 0 }
13
- free_votes_used { 0 }
14
- paid_votes_amount { 10 }
15
- paid_votes_used { 0 }
16
- last_free_reset_at { nil }
17
-
18
- deleted_at { nil }
19
-
20
- trait :promo do
21
- category { :promo }
22
- end
23
-
24
- trait :bonus do
25
- category { :bonus }
26
- end
27
-
28
- trait :soft_deleted do
29
- deleted_at { Time.current }
30
- end
31
-
32
- trait :partially_used do
33
- paid_votes_amount { 10 }
34
- paid_votes_used { 3 }
35
- end
36
- end
37
- end
@@ -1,28 +0,0 @@
1
- FactoryBot.define do
2
- factory :vote, class: 'SpreeCmCommissioner::Vote' do
3
- tenant_id { 1 }
4
- association :voting_session, factory: :cm_voting_session
5
- contestant { create(:cm_voting_contestant, voting_session: voting_session) }
6
- association :user
7
- vote_credit { nil }
8
- channel { :web }
9
- quantity { 1 }
10
- voter_identifier { nil }
11
- device_fingerprint { nil }
12
- ip_address { nil }
13
- public_metadata { {} }
14
-
15
- trait :with_credit do
16
- association :vote_credit, factory: :voting_credit
17
- end
18
-
19
- trait :anonymous do
20
- user { nil }
21
- voter_identifier { SecureRandom.hex(8) }
22
- end
23
-
24
- trait :mobile do
25
- channel { :mobile }
26
- end
27
- end
28
- end
@@ -1,11 +0,0 @@
1
- FactoryBot.define do
2
- factory :voting_credit_transaction, class: 'SpreeCmCommissioner::VotingCreditTransaction' do
3
- association :vote_credit, factory: :voting_credit
4
- tenant_id { 1 }
5
- action { :use }
6
- amount { 10 }
7
- user_total_amount { 0 }
8
- idempotency_key { nil }
9
- deleted_at { nil }
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- FactoryBot.define do
2
- factory :voting_session, class: 'SpreeCmCommissioner::VotingSession' do
3
- association :episode, factory: :show_episode
4
- sequence(:session_key) { |n| "session_key_#{n}" }
5
- opens_at { 1.hour.ago }
6
- closes_at { 1.hour.from_now }
7
- status { :active }
8
- voting_config { {} }
9
- fraud_config { {} }
10
- end
11
- end