diff --git a/app/models/solidus_friendly_promotions/promotion_code/batch_builder.rb b/app/models/solidus_friendly_promotions/promotion_code/batch_builder.rb index f40dcd43..3d913cdc 100644 --- a/app/models/solidus_friendly_promotions/promotion_code/batch_builder.rb +++ b/app/models/solidus_friendly_promotions/promotion_code/batch_builder.rb @@ -33,7 +33,8 @@ def build_promotion_codes private def generate_random_codes - created_codes = 0 + created_codes = promotion_code_batch.promotion_codes.count + batch_size = @options[:batch_size] while created_codes < number_of_codes @@ -42,13 +43,15 @@ def generate_random_codes new_codes = Array.new(max_codes_to_generate) { generate_random_code }.uniq codes_for_current_batch = get_unique_codes(new_codes) - codes_for_current_batch.each do |value| - PromotionCode.create!( + codes_for_current_batch = codes_for_current_batch.map do |value| + SolidusFriendlyPromotions::PromotionCode.create!( value: value, promotion: promotion, promotion_code_batch: promotion_code_batch ) - end + rescue ActiveRecord::RecordInvalid + nil + end.compact created_codes += codes_for_current_batch.size end end diff --git a/spec/models/solidus_friendly_promotions/promotion_code/batch_builder_spec.rb b/spec/models/solidus_friendly_promotions/promotion_code/batch_builder_spec.rb index cea4f8a7..0eda9ed9 100644 --- a/spec/models/solidus_friendly_promotions/promotion_code/batch_builder_spec.rb +++ b/spec/models/solidus_friendly_promotions/promotion_code/batch_builder_spec.rb @@ -104,4 +104,34 @@ end end end + + context "when promotion_code creation returns an error" do + before do + @raise_exception = true + allow(SolidusFriendlyPromotions::PromotionCode).to receive(:create!) do + if @raise_exception + @raise_exception = false + raise(ActiveRecord::RecordInvalid) + else + create(:friendly_promotion_code, promotion: promotion) + end + end + end + + it "creates the correct number of codes anyway" do + subject.build_promotion_codes + expect(promotion.codes.size).to eq(number_of_codes) + end + end + + context "when same promotion_codes are already present" do + let(:number_of_codes) { 50 } + before do + create_list(:friendly_promotion_code, 11, promotion: promotion, promotion_code_batch: code_batch) + end + + it "creates only the missing promotion_codes" do + expect { subject.build_promotion_codes }.to change { promotion.codes.size }.by(39) + end + end end