163 lines
7.3 KiB
Ruby
163 lines
7.3 KiB
Ruby
require "test_helper"
|
||
require "tempfile"
|
||
|
||
class CampaignImportMatchlivetvLaunchTest < ActiveSupport::TestCase
|
||
test "imports campaign rows onto MatchLiveTV" do
|
||
csv = Tempfile.new(["campagna", ".csv"])
|
||
csv.write(<<~CSV)
|
||
N.,Regione,Prov.,Società,M/F,Email verificata,Sito / profilo,Streaming rilevato,Evidenza / fit commerciale,Test A/B,Stato invio,Data invio,Esito,Demo / Trial,Conversione,Piano,Fonte contatto / ricerca,Data verifica,Note follow-up
|
||
1,Piemonte,TO,Vol-Ley Academy Volpiano,F,volley.academy.to@gmail.com,https://www.facebook.com/p/Vol-Ley-Academy-100063526780569/,NON RILEVATO,Academy giovanile,A,DA INVIARE,,,NO,NO,,https://example.com/fonte,2026-08-17,
|
||
7,Lombardia,MB,Volley Brianza Est,F,ds@volleybrianzaest.it,https://www.volleybrianzaest.it/,SÌ / PARZIALE,U16/U18 nazionale,A,DA INVIARE,,,NO,NO,,https://www.volleybrianzaest.it/,46251,
|
||
100,Valle d'Aosta,AO,Cogne Aosta Volley,F,cogneaostavolley@gmail.com,https://www.youtube.com/@CogneAostaVolley,SÌ – SPORTCAM,Vivaio prolifico,B,DA INVIARE,,,NO,NO,,https://www.fipav-vda.com/societa,2026-08-17,
|
||
CSV
|
||
csv.flush
|
||
|
||
result = CampaignImport::MatchlivetvLaunch.new(
|
||
path: csv.path,
|
||
user: users(:admin),
|
||
project: projects(:matchlivetv),
|
||
wipe: false
|
||
).call
|
||
|
||
assert_empty result.errors, result.errors.inspect
|
||
assert_equal 3, result.imported
|
||
|
||
org = Organization.find_by!(name: "Vol-Ley Academy Volpiano")
|
||
assert_equal "female", org.team_gender
|
||
assert_equal "not_detected", org.streaming_status
|
||
assert_equal 1, org.list_position
|
||
assert_equal Date.new(2026, 8, 17), org.verified_at
|
||
assert_equal "campaign", org.lead_source
|
||
assert org.projects.exists?(code: "matchlivetv")
|
||
assert_equal "volley.academy.to@gmail.com", org.contacts.primary_first.first.email
|
||
|
||
opp = org.campaign_opportunity(projects(:matchlivetv))
|
||
assert_equal "A", opp.ab_variant
|
||
assert_equal "to_send", opp.send_status
|
||
assert_equal "to_contact", opp.pipeline_stage
|
||
assert_not opp.demo_trial
|
||
assert_not opp.converted
|
||
|
||
brianza = Organization.find_by!(name: "Volley Brianza Est")
|
||
assert_equal "yes_partial", brianza.streaming_status
|
||
assert_equal Date.new(2026, 8, 17), brianza.verified_at
|
||
|
||
cogne = Organization.find_by!(name: "Cogne Aosta Volley")
|
||
assert_equal "yes_sportcam", cogne.streaming_status
|
||
assert_equal "B", cogne.campaign_opportunity(projects(:matchlivetv)).ab_variant
|
||
ensure
|
||
csv.close!
|
||
end
|
||
|
||
test "imports with a distinct sport and skips duplicate clubs" do
|
||
csv = Tempfile.new(["calcioa5", ".csv"])
|
||
csv.write(<<~CSV)
|
||
N.,Regione,Prov.,Società,M/F,Email verificata,Sito / profilo,Streaming rilevato,Evidenza / fit commerciale,Test A/B,Stato invio,Data invio,Esito,Demo / Trial,Conversione,Piano,Fonte contatto / ricerca,Data verifica,Note follow-up
|
||
101,Lazio,RM,Ecocity Futsal Genzano,M,info@ecocityfutsal.it,ecocityfutsal.it,LIMITATO,Attiva,A,DA INVIARE,,,NO,NO,,fonte,2026-09-06,
|
||
129,Lazio,RM,Ecocity Futsal Genzano,M,amministrazione@pec.ecocityfutsal.it,ecocityfutsal.it,LIMITATO,PEC,A,DA INVIARE,,,NO,NO,,fonte,2026-09-06,
|
||
157,Valle d'Aosta,AO,SSDARL AOSTA CALCIO 511,M/F,aostacalcio511@gmail.com,divisionecalcioa5.it,NON RILEVATO,U19,A,DA INVIARE,,,NO,NO,NO,fonte,2026-09-06,
|
||
CSV
|
||
csv.flush
|
||
|
||
create_campaign_org(name: "Aosta Calcio 511", email: "esistente@example.com", list_position: 97)
|
||
|
||
result = CampaignImport::MatchlivetvLaunch.new(
|
||
path: csv.path,
|
||
user: users(:admin),
|
||
project: projects(:matchlivetv),
|
||
wipe: false,
|
||
sport: "Calcio a 5",
|
||
campaign_name: "Campagna Calcio a 5"
|
||
).call
|
||
|
||
assert_empty result.errors, result.errors.inspect
|
||
assert_equal 1, result.imported
|
||
assert_equal 2, result.skipped
|
||
|
||
org = Organization.find_by!(name: "Ecocity Futsal Genzano")
|
||
assert_equal "Calcio a 5", org.sport
|
||
assert_equal "Campagna Calcio a 5", org.campaign_opportunity(projects(:matchlivetv)).name
|
||
assert_nil org.campaign_opportunity(projects(:matchlivetv)).product
|
||
assert_equal 1, Organization.where("LOWER(name) = ?", "ecocity futsal genzano").count
|
||
assert_nil Organization.find_by(name: "SSDARL AOSTA CALCIO 511")
|
||
ensure
|
||
csv.close!
|
||
end
|
||
|
||
test "strips spaces inside campaign emails" do
|
||
csv = Tempfile.new(["email", ".csv"])
|
||
csv.write(<<~CSV)
|
||
N.,Regione,Prov.,Società,M/F,Email verificata,Sito / profilo,Streaming rilevato,Evidenza / fit commerciale,Test A/B,Stato invio,Data invio,Esito,Demo / Trial,Conversione,Piano,Fonte contatto / ricerca,Data verifica,Note follow-up
|
||
144,Emilia-Romagna,RE,Real Casalgrandese C5,M,REAL CASALGRANDESEC5@LIBERO.IT,divisionecalcioa5.it,NON RILEVATO,Attiva,B,DA INVIARE,,,NO,NO,,fonte,2026-09-06,
|
||
CSV
|
||
csv.flush
|
||
|
||
result = CampaignImport::MatchlivetvLaunch.new(
|
||
path: csv.path,
|
||
user: users(:admin),
|
||
project: projects(:matchlivetv),
|
||
wipe: false,
|
||
sport: "Calcio a 5",
|
||
campaign_name: "Campagna Calcio a 5"
|
||
).call
|
||
|
||
assert_empty result.errors, result.errors.inspect
|
||
org = Organization.find_by!(name: "Real Casalgrandese C5")
|
||
assert_equal "realcasalgrandesec5@libero.it", org.email
|
||
ensure
|
||
csv.close!
|
||
end
|
||
|
||
test "skips clubs without a verified email" do
|
||
csv = Tempfile.new(["basket", ".csv"])
|
||
csv.write(<<~CSV)
|
||
N.,Regione,Prov.,Società,M/F,Email verificata,Sito / profilo,Streaming rilevato,Evidenza / fit commerciale,Test A/B,Stato invio,Data invio,Esito,Demo / Trial,Conversione,Piano,Fonte contatto / ricerca,Data verifica,Note follow-up
|
||
1,Lombardia,MI,Olimpia Milano,M,olimpia@olimpiamilano.com,olimpiamilano.com,RILEVATO,Serie A,A,DA INVIARE,,,NO,NO,,fonte,2026-09-07,
|
||
89,Lombardia,CR,Pallacanestro Crema,M,,cremabasket.it,NON RILEVATO,Serie B,B,DA INVIARE,,,NO,NO,,fonte,2026-09-07,
|
||
CSV
|
||
csv.flush
|
||
|
||
result = CampaignImport::MatchlivetvLaunch.new(
|
||
path: csv.path,
|
||
user: users(:admin),
|
||
project: projects(:matchlivetv),
|
||
wipe: false,
|
||
sport: "Basket",
|
||
campaign_name: "Campagna Basket"
|
||
).call
|
||
|
||
assert_empty result.errors, result.errors.inspect
|
||
assert_equal 1, result.imported
|
||
assert_equal 1, result.skipped
|
||
assert Organization.exists?(name: "Olimpia Milano")
|
||
assert_equal "yes", Organization.find_by!(name: "Olimpia Milano").streaming_status
|
||
assert_nil Organization.find_by(name: "Pallacanestro Crema")
|
||
ensure
|
||
csv.close!
|
||
end
|
||
|
||
test "transliterates accented characters in campaign emails" do
|
||
csv = Tempfile.new(["frascati", ".csv"])
|
||
csv.write(<<~CSV)
|
||
N.,Regione,Prov.,Società,M/F,Email verificata,Sito / profilo,Streaming rilevato,Evidenza / fit commerciale,Test A/B,Stato invio,Data invio,Esito,Demo / Trial,Conversione,Piano,Fonte contatto / ricerca,Data verifica,Note follow-up
|
||
127,Lazio,RM,Club Basket Frascati,M/F,società@basketfrascati.com,basketfrascati.com,NON RILEVATO,Giovanile,A,DA INVIARE,,,NO,NO,,fonte,2026-09-07,
|
||
CSV
|
||
csv.flush
|
||
|
||
result = CampaignImport::MatchlivetvLaunch.new(
|
||
path: csv.path,
|
||
user: users(:admin),
|
||
project: projects(:matchlivetv),
|
||
wipe: false,
|
||
sport: "Basket",
|
||
campaign_name: "Campagna Basket"
|
||
).call
|
||
|
||
assert_empty result.errors, result.errors.inspect
|
||
assert_equal 1, result.imported
|
||
assert_equal "societa@basketfrascati.com", Organization.find_by!(name: "Club Basket Frascati").email
|
||
ensure
|
||
csv.close!
|
||
end
|
||
end
|