|
| 1 | +/** Test UI batch 7 — InputGroup, InputAddon, Input (Checkbox/CheckboxGroup non esistono) */ |
| 2 | +import { describe, it, expect } from "vitest"; |
| 3 | +import fs from "node:fs"; |
| 4 | +import path from "node:path"; |
| 5 | + |
| 6 | +const WEB = path.resolve(__dirname, "../../../web"); |
| 7 | +function readSrc(rel: string) { return fs.readFileSync(path.join(WEB, rel), "utf-8"); } |
| 8 | + |
| 9 | +/* ── InputGroup ── */ |
| 10 | +describe("InputGroup", () => { |
| 11 | + const src = readSrc("app/components/InputGroup.tsx"); |
| 12 | + |
| 13 | + it("export InputGroup + InputAddon + Input + tipi InputSize + 3 interface", () => { |
| 14 | + expect(src).toMatch(/export function InputGroup\b/); |
| 15 | + expect(src).toMatch(/export function InputAddon\b/); |
| 16 | + expect(src).toMatch(/export function Input\b/); |
| 17 | + expect(src).toContain("export type InputSize"); |
| 18 | + expect(src).toContain("export interface InputGroupProps"); |
| 19 | + expect(src).toContain("export interface InputAddonProps"); |
| 20 | + expect(src).toContain("export interface InputProps"); |
| 21 | + }); |
| 22 | + |
| 23 | + it("InputSize sm/md/lg + ADDON_CLS + INPUT_CLS maps con px/py/text per ogni size", () => { |
| 24 | + expect(src).toContain("ADDON_CLS"); expect(src).toContain("INPUT_CLS"); |
| 25 | + for (const s of ["sm", "md", "lg"]) expect(src).toContain(`${s}:`); |
| 26 | + expect(src).toContain("px-2 py-1"); expect(src).toContain("px-3 py-2"); expect(src).toContain("px-4 py-2.5"); |
| 27 | + }); |
| 28 | + |
| 29 | + it("SizeCtx: createContext('md') + Provider + useContext per passare size", () => { |
| 30 | + expect(src).toContain("createContext"); expect(src).toContain("useContext"); |
| 31 | + expect(src).toContain("SizeCtx"); expect(src).toContain("SizeCtx.Provider"); |
| 32 | + }); |
| 33 | + |
| 34 | + it("prefix + suffix addon con borderRight/borderLeft + background var(--color-row)", () => { |
| 35 | + expect(src).toContain("{prefix}"); expect(src).toContain("{suffix}"); |
| 36 | + expect(src).toContain("borderRight"); expect(src).toContain("borderLeft"); |
| 37 | + expect(src).toContain("var(--color-row)"); expect(src).toContain("var(--color-dim)"); |
| 38 | + }); |
| 39 | + |
| 40 | + it("error state: border red + focus green condizionale", () => { |
| 41 | + expect(src).toContain("error ? 'var(--color-red)' : 'var(--color-border)'"); |
| 42 | + expect(src).toContain("error ? 'var(--color-red)' : 'var(--color-green)'"); |
| 43 | + expect(src).toContain("{error}"); // error message rendered |
| 44 | + }); |
| 45 | + |
| 46 | + it("React.Children.map + cloneElement per iniettare stili nell'input child", () => { |
| 47 | + expect(src).toContain("React.Children.map"); expect(src).toContain("React.cloneElement"); |
| 48 | + expect(src).toContain("React.isValidElement"); |
| 49 | + expect(src).toContain("border: 'none'"); expect(src).toContain("borderRadius: 0"); |
| 50 | + }); |
| 51 | + |
| 52 | + it("focus/blur: onFocusCapture + onBlurCapture cambiano borderColor", () => { |
| 53 | + expect(src).toContain("onFocusCapture"); expect(src).toContain("onBlurCapture"); |
| 54 | + expect(src).toContain("e.currentTarget"); expect(src).toContain("focusBorder"); |
| 55 | + }); |
| 56 | + |
| 57 | + it("InputAddon standalone: position left/right + useContext(SizeCtx)", () => { |
| 58 | + expect(src).toContain("position?: 'left' | 'right'"); |
| 59 | + expect(src).toContain("useContext(SizeCtx)"); |
| 60 | + expect(src).toContain("position === 'left' ? 'borderRight' : 'borderLeft'"); |
| 61 | + }); |
| 62 | + |
| 63 | + it("Input standalone: extends InputHTMLAttributes + focus/blur con callback originali", () => { |
| 64 | + expect(src).toContain("React.InputHTMLAttributes<HTMLInputElement>"); |
| 65 | + expect(src).toContain("rest.onFocus?.(e)"); expect(src).toContain("rest.onBlur?.(e)"); |
| 66 | + expect(src).toContain("fullWidth ? 'w-full'"); |
| 67 | + }); |
| 68 | + |
| 69 | + it("styling coerente: font-mono + placeholder dim + bg card + transition-colors", () => { |
| 70 | + expect(src).toContain("font-mono"); |
| 71 | + expect(src).toContain("placeholder:text-[var(--color-dim)]"); |
| 72 | + expect(src).toContain("bg-[var(--color-card)]"); |
| 73 | + expect(src).toContain("transition-colors"); |
| 74 | + }); |
| 75 | +}); |
0 commit comments