const customer = require("../../app/validation/customer.schemas"); const business = require("../../app/validation/business.schemas"); const wrap = (body) => ({ body, params: {}, query: {} }); describe("Phase 3 strict customer and business inputs", () => { test("accepts supported locales and rejects unsupported locales", () => { expect(customer.profileUpdate.safeParse(wrap({ preferredLanguage: "si" })).success).toBe(true); expect(customer.profileUpdate.safeParse(wrap({ preferredLanguage: "fr" })).success).toBe(false); }); test.each(["accountType", "accountStatus", "roles", "permissions", "tokenVersion", "creditLimit", "partnerId"])("profile rejects %s mass assignment", (field) => { expect(customer.profileUpdate.safeParse(wrap({ [field]: "unsafe" })).success).toBe(false); }); test("validates and normalizes an international address", () => { const result = customer.addressCreate.safeParse(wrap({ label:" Home ",recipientName:" Asha Perera ",phoneNumber:"+94 77 000 0000",addressLine1:" 1 Main Road ",city:"Colombo",countryCode:"lk" })); expect(result.success).toBe(true); expect(result.data.body.countryCode).toBe("LK"); expect(result.data.body.recipientName).toBe("Asha Perera"); }); test("address rejects arbitrary fields", () => { expect(customer.addressCreate.safeParse(wrap({ label:"Home",recipientName:"Asha",phoneNumber:"+94770000000",addressLine1:"Road",city:"Colombo",countryCode:"LK",userId:"other" })).success).toBe(false); }); test("deactivation requires explicit confirmation", () => { expect(customer.deactivate.safeParse(wrap({ confirmation:"DEACTIVATE" })).success).toBe(true); expect(customer.deactivate.safeParse(wrap({ confirmation:"yes" })).success).toBe(false); }); test("business applications reject approval and identity fields", () => { const base={businessName:"Acme",legalName:"Acme Ltd",registrationNumber:"PV-1",businessType:"Retail",contactEmail:"owner@example.com",contactPhone:"+94770000000"}; expect(business.application.safeParse(wrap(base)).success).toBe(true); expect(business.application.safeParse(wrap({...base,status:"APPROVED",accountType:"business_customer"})).success).toBe(false); }); test("business self-update rejects partner, approval, and credit fields", () => { expect(business.businessUpdate.safeParse(wrap({ businessName:"New Name" })).success).toBe(true); expect(business.businessUpdate.safeParse(wrap({ partnerId:"ZUM-BIZ-9" })).success).toBe(false); expect(business.businessUpdate.safeParse(wrap({ creditLimit:5000 })).success).toBe(false); }); test("credit configuration rejects negative values and normalizes currency", () => { expect(business.credit.safeParse(wrap({creditLimit:-1,currency:"lkr",status:"ACTIVE"})).success).toBe(false); const result=business.credit.safeParse(wrap({creditLimit:1000.25,currency:"lkr",status:"ACTIVE"}));expect(result.success).toBe(true);expect(result.data.body.currency).toBe("LKR"); }); test("rejection requires a reason", () => { expect(business.reject.safeParse(wrap({reason:"Insufficient registration evidence"})).success).toBe(true); expect(business.reject.safeParse(wrap({})).success).toBe(false); }); });