package mapping import ( "testing" "qctextbuilder/internal/domain" ) func TestMapTemplateFieldsToSemanticSlots(t *testing.T) { t.Parallel() fields := []domain.TemplateField{ { Path: "text.textTitle_m1710_1", KeyName: "textTitle_m1710_1", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionHero, }, { Path: "text.introTitle_c7886_1", KeyName: "introTitle_c7886_1", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionIntro, }, { Path: "text.introDescription_c7886_2", KeyName: "introDescription_c7886_2", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionIntro, }, { Path: "services.serviceTitle_r4830_1", KeyName: "serviceTitle_r4830_1", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionServices, }, { Path: "services.serviceDescription_r4830_2", KeyName: "serviceDescription_r4830_2", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionServices, }, { Path: "team.teamMemberName_r4748_1", KeyName: "teamMemberName_r4748_1", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTeam, }, { Path: "team.teamDescription_r4748_2", KeyName: "teamDescription_r4748_2", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTeam, }, { Path: "testimonials.testimonialTitle_r1508_1", KeyName: "testimonialTitle_r1508_1", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialDescription_r1508_2", KeyName: "testimonialDescription_r1508_2", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialName_r1508_3", KeyName: "testimonialName_r1508_3", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "text.buttonText_c1165_1", KeyName: "buttonText_c1165_1", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionCTA, }, } got := MapTemplateFieldsToSemanticSlots(fields) if len(got.Targets) != 11 { t.Fatalf("expected 11 targets, got %d", len(got.Targets)) } assertHasSlotPath(t, got, "hero.title", "text.textTitle_m1710_1") assertHasSlotPath(t, got, "intro.title", "text.introTitle_c7886_1") assertHasSlotPath(t, got, "intro.description", "text.introDescription_c7886_2") assertHasSlotPath(t, got, "service_items[0].title", "services.serviceTitle_r4830_1") assertHasSlotPath(t, got, "service_items[0].description", "services.serviceDescription_r4830_2") assertHasSlotPath(t, got, "team_items[0].name", "team.teamMemberName_r4748_1") assertHasSlotPath(t, got, "team_items[0].description", "team.teamDescription_r4748_2") assertHasSlotPath(t, got, "testimonial_items[0].title", "testimonials.testimonialTitle_r1508_1") assertHasSlotPath(t, got, "testimonial_items[0].description", "testimonials.testimonialDescription_r1508_2") assertHasSlotPath(t, got, "testimonial_items[0].name", "testimonials.testimonialName_r1508_3") assertHasSlotPath(t, got, "cta.text", "text.buttonText_c1165_1") } func TestMapTemplateFieldsToSemanticSlots_UsesSuggestedSection(t *testing.T) { t.Parallel() fields := []domain.TemplateField{ { Path: "welcome.headline_m1710_1", KeyName: "headline_m1710_1", Section: "welcome", FieldKind: "text", IsEnabled: true, }, } got := MapTemplateFieldsToSemanticSlots(fields) assertHasSlotPath(t, got, "hero.title", "welcome.headline_m1710_1") } func TestMapTemplateFieldsToSemanticSlots_RepeatedBlocksStaySeparatedAndTypePure(t *testing.T) { t.Parallel() fields := []domain.TemplateField{ { Path: "services.servicesTitle_r4830_8", KeyName: "servicesTitle_r4830_8", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionServices, }, { Path: "services.servicesDescription_r4830_9", KeyName: "servicesDescription_r4830_9", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionServices, }, { Path: "services.servicesTitle_r4830_10", KeyName: "servicesTitle_r4830_10", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionServices, }, { Path: "services.servicesDescription_r4830_11", KeyName: "servicesDescription_r4830_11", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionServices, }, { Path: "services.servicesTitle_r4830_12", KeyName: "servicesTitle_r4830_12", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionServices, }, { Path: "services.servicesDescription_r4830_13", KeyName: "servicesDescription_r4830_13", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionServices, }, { Path: "text.textName_r4748_17", KeyName: "textName_r4748_17", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTeam, }, { Path: "text.textDescription_r4748_18", KeyName: "textDescription_r4748_18", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTeam, }, { Path: "text.textName_r4748_19", KeyName: "textName_r4748_19", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTeam, }, { Path: "text.textDescription_r4748_20", KeyName: "textDescription_r4748_20", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTeam, }, { Path: "text.textName_r4748_21", KeyName: "textName_r4748_21", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTeam, }, { Path: "text.textDescription_r4748_22", KeyName: "textDescription_r4748_22", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTeam, }, { Path: "testimonials.testimonialsName_r1508_23", KeyName: "testimonialsName_r1508_23", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsTitle_r1508_24", KeyName: "testimonialsTitle_r1508_24", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsDescription_r1508_25", KeyName: "testimonialsDescription_r1508_25", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsName_r1508_26", KeyName: "testimonialsName_r1508_26", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsTitle_r1508_27", KeyName: "testimonialsTitle_r1508_27", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsDescription_r1508_28", KeyName: "testimonialsDescription_r1508_28", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsName_r1508_29", KeyName: "testimonialsName_r1508_29", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsTitle_r1508_30", KeyName: "testimonialsTitle_r1508_30", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsDescription_r1508_31", KeyName: "testimonialsDescription_r1508_31", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsName_r1508_32", KeyName: "testimonialsName_r1508_32", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsTitle_r1508_33", KeyName: "testimonialsTitle_r1508_33", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, { Path: "testimonials.testimonialsDescription_r1508_34", KeyName: "testimonialsDescription_r1508_34", FieldKind: "text", IsEnabled: true, WebsiteSection: domain.WebsiteSectionTestimonials, }, } got := MapTemplateFieldsToSemanticSlots(fields) assertHasSlotPath(t, got, "service_items[0].title", "services.servicesTitle_r4830_8") assertHasSlotPath(t, got, "service_items[0].description", "services.servicesDescription_r4830_9") assertHasSlotPath(t, got, "service_items[1].title", "services.servicesTitle_r4830_10") assertHasSlotPath(t, got, "service_items[1].description", "services.servicesDescription_r4830_11") assertHasSlotPath(t, got, "service_items[2].title", "services.servicesTitle_r4830_12") assertHasSlotPath(t, got, "service_items[2].description", "services.servicesDescription_r4830_13") assertHasSlotPath(t, got, "team_items[0].name", "text.textName_r4748_17") assertHasSlotPath(t, got, "team_items[0].description", "text.textDescription_r4748_18") assertHasSlotPath(t, got, "team_items[1].name", "text.textName_r4748_19") assertHasSlotPath(t, got, "team_items[1].description", "text.textDescription_r4748_20") assertHasSlotPath(t, got, "team_items[2].name", "text.textName_r4748_21") assertHasSlotPath(t, got, "team_items[2].description", "text.textDescription_r4748_22") assertHasSlotPath(t, got, "testimonial_items[0].name", "testimonials.testimonialsName_r1508_23") assertHasSlotPath(t, got, "testimonial_items[0].title", "testimonials.testimonialsTitle_r1508_24") assertHasSlotPath(t, got, "testimonial_items[0].description", "testimonials.testimonialsDescription_r1508_25") assertHasSlotPath(t, got, "testimonial_items[1].name", "testimonials.testimonialsName_r1508_26") assertHasSlotPath(t, got, "testimonial_items[1].title", "testimonials.testimonialsTitle_r1508_27") assertHasSlotPath(t, got, "testimonial_items[1].description", "testimonials.testimonialsDescription_r1508_28") assertHasSlotPath(t, got, "testimonial_items[2].name", "testimonials.testimonialsName_r1508_29") assertHasSlotPath(t, got, "testimonial_items[2].title", "testimonials.testimonialsTitle_r1508_30") assertHasSlotPath(t, got, "testimonial_items[2].description", "testimonials.testimonialsDescription_r1508_31") assertHasSlotPath(t, got, "testimonial_items[3].name", "testimonials.testimonialsName_r1508_32") assertHasSlotPath(t, got, "testimonial_items[3].title", "testimonials.testimonialsTitle_r1508_33") assertHasSlotPath(t, got, "testimonial_items[3].description", "testimonials.testimonialsDescription_r1508_34") assertSlotCount(t, got, "team_items[0].name", 1) assertSlotCount(t, got, "team_items[0].description", 1) assertSlotCount(t, got, "testimonial_items[0].name", 1) assertSlotCount(t, got, "testimonial_items[0].title", 1) assertSlotCount(t, got, "testimonial_items[0].description", 1) } func assertHasSlotPath(t *testing.T, mapping SemanticSlotMapping, slot string, path string) { t.Helper() candidates := mapping.BySlot[slot] for _, item := range candidates { if item.FieldPath == path { return } } t.Fatalf("slot %q missing path %q", slot, path) } func assertSlotCount(t *testing.T, mapping SemanticSlotMapping, slot string, expected int) { t.Helper() if got := len(mapping.BySlot[slot]); got != expected { t.Fatalf("slot %q has %d candidates, want %d", slot, got, expected) } }