@@ -2,6 +2,7 @@ import type { Context } from '@/presentation/protocols/http'
22import { OrdersRouter } from '.'
33import { FileClient } from '@/infra/file'
44import { OrderClient } from '@/infra/order'
5+ import { ZodError } from 'zod'
56
67const makeSut = ( ) => {
78 const sut = new OrdersRouter ( )
@@ -10,6 +11,41 @@ const makeSut = () => {
1011 }
1112}
1213
14+ const makeFileClientStub = ( ) : FileClient => {
15+ class FileClientStub extends FileClient {
16+ verify = vi . fn ( ) . mockReturnValue ( [ ] )
17+ read = vi . fn ( ) . mockReturnValue ( [ ] )
18+ }
19+
20+ return new FileClientStub ( )
21+ }
22+
23+ const makeOrderClientStub = ( ) : OrderClient => {
24+ class OrderClientStub extends OrderClient {
25+ verifyFilters = vi . fn ( ) . mockReturnValue ( { } )
26+ processRaw = vi . fn ( ) . mockReturnValue ( [ ] )
27+ group = vi . fn ( ) . mockReturnValue ( [ ] )
28+ getOrderBetweenDates = vi . fn ( ) . mockReturnValue ( [ ] )
29+ }
30+
31+ return new OrderClientStub ( )
32+ }
33+
34+ const files = [
35+ {
36+ fieldname : 'file' ,
37+ originalname : 'invalid-file.txt' ,
38+ encoding : 'utf-8' ,
39+ mimetype : 'text/plain' ,
40+ buffer : Buffer . from ( '' ) ,
41+ size : 0 ,
42+ destination : '' ,
43+ filename : 'invalid-file.txt' ,
44+ path : '' ,
45+ stream : { } as unknown as Express . Multer . File [ 'stream' ] ,
46+ } ,
47+ ]
48+
1349const makeCtx = ( ) : Context => {
1450 return {
1551 headers : { } ,
@@ -21,8 +57,8 @@ const makeCtx = (): Context => {
2157 url : '/orders' ,
2258 body : { } ,
2359 clients : {
24- file : vi . mocked ( new FileClient ( ) ) , // Mock FileClient
25- order : vi . mocked ( new OrderClient ( ) ) , // Mock OrderClient
60+ file : makeFileClientStub ( ) ,
61+ order : makeOrderClientStub ( ) ,
2662 } ,
2763 }
2864}
@@ -53,6 +89,8 @@ describe('OrdersController', () => {
5389 orderId : 'invalid-order-id' ,
5490 }
5591
92+ ctx . clients . order . verifyFilters = vi . fn ( ) . mockReturnValue ( new ZodError ( [ ] ) )
93+
5694 const response = await sut . handle ( ctx )
5795
5896 expect ( response . statusCode ) . toBe ( 400 )
@@ -62,23 +100,190 @@ describe('OrdersController', () => {
62100 const { sut } = makeSut ( )
63101 const ctx = makeCtx ( )
64102
65- ctx . req . files = [
66- {
67- fieldname : 'file' ,
68- originalname : 'invalid-file.txt' ,
69- encoding : 'utf-8' ,
70- mimetype : 'text/plain' ,
71- buffer : Buffer . from ( '' ) ,
72- size : 0 ,
73- destination : '' ,
74- filename : 'invalid-file.txt' ,
75- path : '' ,
76- stream : { } as unknown as Express . Multer . File [ 'stream' ] ,
77- } ,
78- ]
103+ ctx . req . files = files
104+
105+ ctx . clients . file . verify = vi . fn ( ) . mockReturnValue ( new ZodError ( [ ] ) )
106+
107+ const response = await sut . handle ( ctx )
108+
109+ expect ( response . statusCode ) . toBe ( 400 )
110+ } )
111+
112+ test ( 'should return 400 if processRaw is invalid' , async ( ) => {
113+ const { sut } = makeSut ( )
114+ const ctx = makeCtx ( )
115+
116+ ctx . req . files = files
117+
118+ ctx . clients . order . processRaw = vi . fn ( ) . mockReturnValue ( new ZodError ( [ ] ) )
79119
80120 const response = await sut . handle ( ctx )
81121
82122 expect ( response . statusCode ) . toBe ( 400 )
83123 } )
124+
125+ test ( 'should return 400 if group is invalid' , async ( ) => {
126+ const { sut } = makeSut ( )
127+ const ctx = makeCtx ( )
128+
129+ ctx . req . files = files
130+
131+ ctx . clients . order . group = vi . fn ( ) . mockReturnValue ( new ZodError ( [ ] ) )
132+
133+ const response = await sut . handle ( ctx )
134+
135+ expect ( response . statusCode ) . toBe ( 400 )
136+ } )
137+
138+ test ( 'should return 200 if filters startDate and endDate are valid' , async ( ) => {
139+ const { sut } = makeSut ( )
140+ const ctx = makeCtx ( )
141+
142+ ctx . req . query = {
143+ startDate : '2023-01-01' ,
144+ endDate : '2023-12-31' ,
145+ }
146+
147+ ctx . clients . order . verifyFilters = vi . fn ( ) . mockReturnValue ( {
148+ startDate : new Date ( '2023-01-01' ) ,
149+ endDate : new Date ( '2023-12-31' ) ,
150+ } )
151+
152+ ctx . clients . file . verify = vi . fn ( ) . mockReturnValue ( files )
153+ ctx . clients . file . read = vi . fn ( ) . mockReturnValue ( [ ] )
154+ ctx . clients . order . processRaw = vi . fn ( ) . mockReturnValue ( [ ] )
155+ ctx . clients . order . group = vi . fn ( ) . mockReturnValue ( [ ] )
156+
157+ const response = await sut . handle ( ctx )
158+
159+ expect ( response . statusCode ) . toBe ( 200 )
160+ } )
161+
162+ test ( 'should return 200 if filters orderId is valid' , async ( ) => {
163+ const { sut } = makeSut ( )
164+ const ctx = makeCtx ( )
165+
166+ ctx . req . query = {
167+ orderId : 'valid-order-id' ,
168+ }
169+
170+ ctx . clients . order . verifyFilters = vi . fn ( ) . mockReturnValue ( {
171+ orderId : 'valid-order-id' ,
172+ } )
173+
174+ ctx . clients . file . verify = vi . fn ( ) . mockReturnValue ( files )
175+ ctx . clients . file . read = vi . fn ( ) . mockReturnValue ( [ ] )
176+ ctx . clients . order . processRaw = vi . fn ( ) . mockReturnValue ( [ ] )
177+ ctx . clients . order . group = vi . fn ( ) . mockReturnValue ( [ ] )
178+
179+ const response = await sut . handle ( ctx )
180+
181+ expect ( response . statusCode ) . toBe ( 200 )
182+ } )
183+
184+ test ( 'should return 200 if filters are empty' , async ( ) => {
185+ const { sut } = makeSut ( )
186+ const ctx = makeCtx ( )
187+
188+ ctx . req . query = { }
189+
190+ ctx . clients . order . verifyFilters = vi . fn ( ) . mockReturnValue ( { } )
191+
192+ ctx . clients . file . verify = vi . fn ( ) . mockReturnValue ( files )
193+ ctx . clients . file . read = vi . fn ( ) . mockReturnValue ( [ ] )
194+ ctx . clients . order . processRaw = vi . fn ( ) . mockReturnValue ( [ ] )
195+ ctx . clients . order . group = vi . fn ( ) . mockReturnValue ( [ ] )
196+
197+ const response = await sut . handle ( ctx )
198+
199+ expect ( response . statusCode ) . toBe ( 200 )
200+ } )
201+
202+ test ( 'should return 500 if an unexpected error occurs' , async ( ) => {
203+ const { sut } = makeSut ( )
204+ const ctx = makeCtx ( )
205+
206+ ctx . req . files = files
207+
208+ ctx . clients . file . verify = vi . fn ( ) . mockReturnValue ( files )
209+ ctx . clients . file . read = vi . fn ( ) . mockReturnValue ( [ ] )
210+ ctx . clients . order . processRaw = vi . fn ( ) . mockImplementation ( ( ) => {
211+ throw new Error ( 'Unexpected error' )
212+ } )
213+ ctx . clients . order . group = vi . fn ( ) . mockReturnValue ( [ ] )
214+
215+ const response = await sut . handle ( ctx )
216+
217+ expect ( response . statusCode ) . toBe ( 500 )
218+ } )
219+
220+ test ( 'should return empty data if no orders are found for the given orderId' , async ( ) => {
221+ const { sut } = makeSut ( )
222+ const ctx = makeCtx ( )
223+
224+ ctx . req . query = {
225+ orderId : 'non-existing-order-id' ,
226+ }
227+
228+ ctx . clients . order . verifyFilters = vi . fn ( ) . mockReturnValue ( {
229+ orderId : 'non-existing-order-id' ,
230+ } )
231+
232+ ctx . clients . file . verify = vi . fn ( ) . mockReturnValue ( files )
233+ ctx . clients . file . read = vi . fn ( ) . mockReturnValue ( [ ] )
234+ ctx . clients . order . processRaw = vi . fn ( ) . mockReturnValue ( [ ] )
235+ ctx . clients . order . group = vi . fn ( ) . mockReturnValue ( [ ] )
236+
237+ ctx . clients . order . getOrderById = vi . fn ( ) . mockReturnValue ( undefined )
238+
239+ const response = await sut . handle ( ctx )
240+
241+ expect ( response . statusCode ) . toBe ( 200 )
242+ expect ( response . body ) . toEqual ( {
243+ data : [ ] ,
244+ } )
245+ } )
246+
247+ test ( 'should return a valid responde for a existing orderId' , async ( ) => {
248+ const { sut } = makeSut ( )
249+ const ctx = makeCtx ( )
250+
251+ ctx . req . query = {
252+ orderId : 'non-existing-order-id' ,
253+ }
254+
255+ ctx . clients . order . verifyFilters = vi . fn ( ) . mockReturnValue ( {
256+ orderId : 'non-existing-order-id' ,
257+ } )
258+
259+ ctx . clients . file . verify = vi . fn ( ) . mockReturnValue ( files )
260+ ctx . clients . file . read = vi . fn ( ) . mockReturnValue ( [ ] )
261+ ctx . clients . order . processRaw = vi . fn ( ) . mockReturnValue ( [ ] )
262+ ctx . clients . order . group = vi . fn ( ) . mockReturnValue ( [ ] )
263+
264+ ctx . clients . order . getOrderById = vi . fn ( ) . mockReturnValue ( { } )
265+
266+ const response = await sut . handle ( ctx )
267+
268+ expect ( response . statusCode ) . toBe ( 200 )
269+ expect ( response . body ) . toEqual ( {
270+ data : [ { } ] ,
271+ } )
272+ } )
273+
274+ test ( 'should return 200 if everything is ok' , async ( ) => {
275+ const { sut } = makeSut ( )
276+ const ctx = makeCtx ( )
277+
278+ ctx . req . files = files
279+
280+ ctx . clients . file . verify = vi . fn ( ) . mockReturnValue ( files )
281+ ctx . clients . file . read = vi . fn ( ) . mockReturnValue ( [ ] )
282+ ctx . clients . order . processRaw = vi . fn ( ) . mockReturnValue ( [ ] )
283+ ctx . clients . order . group = vi . fn ( ) . mockReturnValue ( [ ] )
284+
285+ const response = await sut . handle ( ctx )
286+
287+ expect ( response . statusCode ) . toBe ( 200 )
288+ } )
84289} )
0 commit comments