# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later require 'rails_helper' describe SlugP2pCampaignNamingAlgorithm do describe '.create_copy_name' do before(:all) { Timecop.freeze(2020,5,4) } after(:all) { Timecop.return } def set_name(name) @name = name end let(:short_slug) { "slug_name"} let(:short_slug_copy_today) { "slug_name_000"} let(:short_slug_copy_today_plus_1) { "slug_name_001"} let(:copy_base) {"slug_name"} let(:nonprofit) {force_create(:nonprofit)} describe 'campaigns' do let(:campaign) {force_create(:campaign, :slug => @name, nonprofit: nonprofit)} let(:campaign2) {force_create(:campaign, :slug => @name2, nonprofit:nonprofit)} let(:campaigns_at_max_copies) { (0..999).collect{|i| force_create(:campaign, slug: "#{@copy_base}_#{"%03d" % i}", nonprofit:nonprofit) }} let(:algo) {SlugP2pCampaignNamingAlgorithm.new( nonprofit.id)} describe 'campaign slugs' do it 'not a copy' do @name = short_slug campaign expect(algo.create_copy_name(@name)).to eq short_slug_copy_today end it 'one copy exists' do @name = short_slug @name2 = short_slug_copy_today campaign campaign2 expect(algo.create_copy_name(@name)).to eq short_slug_copy_today_plus_1 expect(algo.create_copy_name(@name2)).to eq short_slug_copy_today_plus_1 end it 'errors when at max copies' do @name = short_slug @copy_base = copy_base campaign campaigns_at_max_copies expect{ algo.create_copy_name(@name) }.to(raise_error{|error| expect(error).to be_a ArgumentError }) campaigns_at_max_copies.each {|i| expect {algo.create_copy_name(i.slug)}.to(raise_error{|error| expect(error).to be_a ArgumentError }) } end end end end end