11import { describe , it , expect , vi } from "vitest" ;
22import request from "supertest" ;
33import express from "express" ;
4- import { asAsync , typed , ValidateLocals , validatorMiddleware } from "./index" ;
4+ import {
5+ asAsync ,
6+ typed ,
7+ ZodValidateLocals ,
8+ validatorMiddleware ,
9+ } from "./index" ;
510import { ZodApiEndpoints } from "../zod" ;
6- import { z } from "zod" ;
11+ import { z , ZodError } from "zod" ;
712import { Request } from "express" ;
813import { ParseUrlParams } from "../common" ;
914
@@ -55,23 +60,29 @@ describe("validatorMiddleware", () => {
5560 middleware ( req as Request , res , next ) ;
5661 expect ( next ) . toHaveBeenCalled ( ) ;
5762 expect ( res . locals . validate ) . toEqual ( expect . any ( Function ) ) ;
58- const locals = res . locals as ValidateLocals <
63+ const locals = res . locals as ZodValidateLocals <
5964 ( typeof pathMap ) [ "/" ] [ "get" ] ,
6065 ParseUrlParams < "/" >
6166 > ;
6267 const validate = locals . validate ( req as Request ) ;
6368
64- const query = validate . query ( ) ;
65- expect ( query . success ) . toBe ( true ) ;
66- expect ( query . data ! . name ) . toBe ( "alice" ) ;
69+ {
70+ const r = validate . query ( ) ;
71+ expect ( r . error ) . toBeUndefined ( ) ;
72+ expect ( r . data ?. name ) . toBe ( "alice" ) ;
73+ }
6774
68- const body = validate . body ( ) ;
69- expect ( body . success ) . toBe ( true ) ;
70- expect ( body . data ! . name ) . toBe ( "alice" ) ;
75+ {
76+ const r = validate . body ( ) ;
77+ expect ( r . error ) . toBeUndefined ( ) ;
78+ expect ( r . data ?. name ) . toBe ( "alice" ) ;
79+ }
7180
72- const headers = validate . headers ( ) ;
73- expect ( headers . success ) . toBe ( true ) ;
74- expect ( headers . data ! [ "content-type" ] ) . toBe ( "application/json" ) ;
81+ {
82+ const r = validate . headers ( ) ;
83+ expect ( r . error ) . toBeUndefined ( ) ;
84+ expect ( r . data ?. [ "content-type" ] ) . toBe ( "application/json" ) ;
85+ }
7586 } ) ;
7687
7788 it ( "should fail if request schema is invalid" , ( ) => {
@@ -89,21 +100,57 @@ describe("validatorMiddleware", () => {
89100 middleware ( req as Request , res , next ) ;
90101 expect ( next ) . toHaveBeenCalled ( ) ;
91102 expect ( res . locals . validate ) . toEqual ( expect . any ( Function ) ) ;
92- const locals = res . locals as ValidateLocals <
103+ const locals = res . locals as ZodValidateLocals <
93104 ( typeof pathMap ) [ "/" ] [ "get" ] ,
94105 ParseUrlParams < "/" >
95106 > ;
96107 const validate = locals . validate ( req as Request ) ;
97108
98- console . log ( "validate" , validate ) ;
99- const query = validate . query ( ) ;
100- expect ( query . success ) . toBe ( false ) ;
109+ {
110+ const r = validate . query ( ) ;
111+ expect ( r . error ) . toEqual (
112+ new ZodError ( [
113+ {
114+ code : "invalid_type" ,
115+ expected : "string" ,
116+ received : "undefined" ,
117+ path : [ "name" ] ,
118+ message : "Required" ,
119+ } ,
120+ ] ) ,
121+ ) ;
122+ expect ( r . data ) . toBeUndefined ( ) ;
123+ }
101124
102- const body = validate . body ( ) ;
103- expect ( body . success ) . toBe ( false ) ;
125+ {
126+ const r = validate . body ( ) ;
127+ expect ( r . error ) . toEqual (
128+ new ZodError ( [
129+ {
130+ code : "invalid_type" ,
131+ expected : "string" ,
132+ received : "undefined" ,
133+ path : [ "name" ] ,
134+ message : "Required" ,
135+ } ,
136+ ] ) ,
137+ ) ;
138+ expect ( r . data ) . toBeUndefined ( ) ;
139+ }
104140
105- const headers = validate . headers ( ) ;
106- expect ( headers . success ) . toBe ( false ) ;
141+ const r = validate . headers ( ) ;
142+ expect ( r . error ) . toEqual (
143+ new ZodError ( [
144+ {
145+ code : "invalid_literal" ,
146+ expected : "application/json" ,
147+ received : undefined ,
148+ path : [ "content-type" ] ,
149+ message : `Invalid literal value, expected "application/json"` ,
150+ } ,
151+ ] ) ,
152+ ) ;
153+ expect ( r . data ) . toBeUndefined ( ) ;
107154 } ) ;
108155 } ) ;
109156
@@ -123,10 +170,8 @@ describe("validatorMiddleware", () => {
123170 middleware ( req as unknown as Request , res , next ) ;
124171 expect ( next ) . toHaveBeenCalled ( ) ;
125172 expect ( res . locals . validate ) . toEqual ( expect . any ( Function ) ) ;
126- const locals = res . locals as ValidateLocals <
127- undefined ,
128- ParseUrlParams < "" >
129- > ;
173+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
174+ const locals = res . locals as ZodValidateLocals < any , ParseUrlParams < "" > > ;
130175 const validate = locals . validate ( req as Request ) ;
131176
132177 const query = validate . query ;
@@ -157,10 +202,8 @@ describe("validatorMiddleware", () => {
157202 middleware ( req as unknown as Request , res , next ) ;
158203 expect ( next ) . toHaveBeenCalled ( ) ;
159204 expect ( res . locals . validate ) . toEqual ( expect . any ( Function ) ) ;
160- const locals = res . locals as ValidateLocals <
161- undefined ,
162- ParseUrlParams < "" >
163- > ;
205+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
206+ const locals = res . locals as ZodValidateLocals < any , ParseUrlParams < "" > > ;
164207 const validate = locals . validate ( req as Request ) ;
165208
166209 const query = validate . query ;
@@ -220,19 +263,19 @@ describe("typed", () => {
220263 return res . json ( [ { id : "1" , name : "alice" } ] ) ;
221264 } ) ;
222265 wApp . post ( "/users" , ( req , res ) => {
223- const body = res . locals . validate ( req ) . body ( ) ;
224- if ( ! body . success ) {
266+ const { data } = res . locals . validate ( req ) . body ( ) ;
267+ if ( data === undefined ) {
225268 return res . status ( 400 ) . json ( { message : "invalid body" } ) ;
226269 }
227- return res . json ( { id : "1" , name : body . data . name } ) ;
270+ return res . json ( { id : "1" , name : data . name } ) ;
228271 } ) ;
229272 wApp . get ( "/users/:id" , ( req , res ) => {
230273 const qResult = res . locals . validate ( req ) . query ( ) ;
231274 const pResult = res . locals . validate ( req ) . params ( ) ;
232- if ( ! pResult . success ) {
275+ if ( pResult . data === undefined ) {
233276 return res . status ( 400 ) . json ( { message : "invalid query" } ) ;
234277 }
235- if ( qResult . success ) {
278+ if ( qResult . data !== undefined ) {
236279 return res . status ( 200 ) . json ( { id : pResult . data . id , name : "alice" } ) ;
237280 }
238281 return res . status ( 200 ) . json ( { id : pResult . data . id , name : "alice" } ) ;
0 commit comments