/// const tenderId = "507f1f77bcf86cd799439055"; const makeTenderDetailsResponse = ( overrides: Partial> = {}, ) => ({ success: true, message: "ok", data: { id: tenderId, buyer_organization: { name: "ACME Procurement" }, application_deadline: 1710001000, country_code: "IR", currency: "USD", description: "Original description", duration: "12", duration_unit: "month", estimated_value: 100000, notice_publication_id: "NP-123", procedure_code: "OPEN", procurement_type_code: "GOODS", publication_date: 1710000000, status: "open", submission_deadline: 1710002000, submission_url: "https://example.com/submit", tender_deadline: 1710003000, created_at: 1710000000, tender_id: "TDR-9001", title: "Original title", ...overrides, }, }); describe("tender details - translation and summary", () => { beforeEach(() => { cy.setAuthCookies(); }); it("renders details with summary fallback and translated metadata", () => { cy.intercept("GET", `**/api/proxy/tenders/${tenderId}**`, (req) => { expect(req.query.lang).to.eq("en"); req.reply({ statusCode: 200, body: makeTenderDetailsResponse({ title: "Translated title EN", description: "Translated description EN", language: "en", overall_summary: undefined, }), }); }).as("getTenderDetailsEn"); cy.visit(`/tenders/${tenderId}?lang=en`); cy.wait("@getTenderDetailsEn"); cy.contains("h1", "Translated title EN").should("be.visible"); cy.contains("Resolved language").should("be.visible"); cy.contains("en").should("be.visible"); cy.contains("AI summary").should("be.visible"); cy.contains("Summary not ready yet").should("be.visible"); cy.contains("Translated description EN").should("be.visible"); }); it("switches language from selector and reloads details with new lang query", () => { cy.intercept("GET", `**/api/proxy/tenders/${tenderId}**`, (req) => { const lang = String(req.query.lang ?? "en"); req.alias = lang === "fr" ? "getTenderDetailsFr" : "getTenderDetailsEn"; req.reply({ statusCode: 200, body: makeTenderDetailsResponse({ title: lang === "fr" ? "Titre FR" : "Title EN", description: lang === "fr" ? "Description FR" : "Description EN", language: lang, overall_summary: lang === "fr" ? "Resume FR" : "Summary EN", }), }); }); cy.visit(`/tenders/${tenderId}?lang=en`); cy.wait("@getTenderDetailsEn"); cy.get('select[name="lang"]').select("fr"); cy.location("search").should("include", "lang=fr"); cy.wait("@getTenderDetailsFr"); cy.contains("h1", "Titre FR").should("be.visible"); cy.contains("Resume FR").should("be.visible"); }); it("triggers translate endpoint with selected language", () => { cy.intercept("GET", `**/api/proxy/tenders/${tenderId}**`, { statusCode: 200, body: makeTenderDetailsResponse({ title: "Before translate", description: "Before translate description", language: "de", }), }).as("getTenderDetails"); cy.intercept( "POST", `**/api/proxy/tenders/${tenderId}/ai-translate`, (req) => { expect(req.body).to.deep.equal({ language: "de" }); req.reply({ statusCode: 200, body: { success: true, message: "ok", data: { notice_id: "NP-123", language: "de", translated_title: "Ubersetzter Titel", translated_description: "Ubersetzte Beschreibung", }, }, }); }, ).as("translateTender"); cy.visit(`/tenders/${tenderId}?lang=de`); cy.wait("@getTenderDetails"); cy.contains("button", "Translate metadata").click(); cy.wait("@translateTender"); }); it("redirects legacy /translation URL to tender details with lang preserved", () => { cy.intercept("GET", `**/api/proxy/tenders/${tenderId}**`, { statusCode: 200, body: makeTenderDetailsResponse({ title: "Redirect check", language: "fa", }), }).as("getTenderAfterRedirect"); cy.visit(`/tenders/${tenderId}/translation?lang=fa`); cy.location("pathname", { timeout: 15000 }).should( "eq", `/tenders/${tenderId}`, ); cy.location("search").should("include", "lang=fa"); cy.wait("@getTenderAfterRedirect"); cy.contains("h1", "Redirect check").should("be.visible"); }); });