1- /* eslint-disable @typescript-eslint/no-var-requires */
2- import { getSchema } from "." ;
1+ import winston from 'winston' ;
2+ import { join } from 'path' ;
33
4- import type Joi from "@hapi/joi" ;
5- import { join } from "path" ;
4+ import { getSchema , localFsMiddleware } from '.' ;
5+ import { listRepoFiles } from '../utils/fs' ;
6+
7+ import type Joi from 'joi' ;
8+ import type express from 'express' ;
9+
10+ jest . mock ( '../utils/fs' ) ;
611
712function assetFailure ( result : Joi . ValidationResult , expectedMessage : string ) {
813 const { error } = result ;
@@ -13,81 +18,208 @@ function assetFailure(result: Joi.ValidationResult, expectedMessage: string) {
1318}
1419
1520const defaultParams = {
16- branch : " master" ,
21+ branch : ' master' ,
1722} ;
1823
19- describe ( " localFsMiddleware" , ( ) => {
24+ describe ( ' localFsMiddleware' , ( ) => {
2025 beforeEach ( ( ) => {
2126 jest . clearAllMocks ( ) ;
2227 } ) ;
2328
24- describe ( " getSchema" , ( ) => {
25- it ( " should throw on path traversal" , ( ) => {
26- const schema = getSchema ( { repoPath : join ( " Users" , " user" , " documents" , " code" , " repo" ) } ) ;
29+ describe ( ' getSchema' , ( ) => {
30+ it ( ' should throw on path traversal' , ( ) => {
31+ const schema = getSchema ( { repoPath : join ( ' Users' , ' user' , ' documents' , ' code' , ' repo' ) } ) ;
2732
2833 assetFailure (
2934 schema . validate ( {
30- action : " getEntry" ,
31- params : { ...defaultParams , path : " ../" } ,
35+ action : ' getEntry' ,
36+ params : { ...defaultParams , path : ' ../' } ,
3237 } ) ,
33- '"params.path" must resolve to a path under the configured repository'
38+ '"params.path" must resolve to a path under the configured repository' ,
3439 ) ;
3540 } ) ;
3641
37- it ( " should not throw on valid path" , ( ) => {
38- const schema = getSchema ( { repoPath : join ( " Users" , " user" , " documents" , " code" , " repo" ) } ) ;
42+ it ( ' should not throw on valid path' , ( ) => {
43+ const schema = getSchema ( { repoPath : join ( ' Users' , ' user' , ' documents' , ' code' , ' repo' ) } ) ;
3944
4045 const { error } = schema . validate ( {
41- action : " getEntry" ,
42- params : { ...defaultParams , path : " src/content/posts/title.md" } ,
46+ action : ' getEntry' ,
47+ params : { ...defaultParams , path : ' src/content/posts/title.md' } ,
4348 } ) ;
4449
4550 expect ( error ) . toBeUndefined ( ) ;
4651 } ) ;
4752
48- it ( " should throw on folder traversal" , ( ) => {
49- const schema = getSchema ( { repoPath : join ( " Users" , " user" , " documents" , " code" , " repo" ) } ) ;
53+ it ( ' should throw on folder traversal' , ( ) => {
54+ const schema = getSchema ( { repoPath : join ( ' Users' , ' user' , ' documents' , ' code' , ' repo' ) } ) ;
5055
5156 assetFailure (
5257 schema . validate ( {
53- action : " entriesByFolder" ,
54- params : { ...defaultParams , folder : " ../" , extension : "md" , depth : 1 } ,
58+ action : ' entriesByFolder' ,
59+ params : { ...defaultParams , folder : ' ../' , extension : 'md' , depth : 1 } ,
5560 } ) ,
56- '"params.folder" must resolve to a path under the configured repository'
61+ '"params.folder" must resolve to a path under the configured repository' ,
5762 ) ;
5863 } ) ;
5964
60- it ( " should not throw on valid folder" , ( ) => {
61- const schema = getSchema ( { repoPath : join ( " Users" , " user" , " documents" , " code" , " repo" ) } ) ;
65+ it ( ' should not throw on valid folder' , ( ) => {
66+ const schema = getSchema ( { repoPath : join ( ' Users' , ' user' , ' documents' , ' code' , ' repo' ) } ) ;
6267
6368 const { error } = schema . validate ( {
64- action : " entriesByFolder" ,
65- params : { ...defaultParams , folder : " src/posts" , extension : "md" , depth : 1 } ,
69+ action : ' entriesByFolder' ,
70+ params : { ...defaultParams , folder : ' src/posts' , extension : 'md' , depth : 1 } ,
6671 } ) ;
6772
6873 expect ( error ) . toBeUndefined ( ) ;
6974 } ) ;
7075
71- it ( " should throw on media folder traversal" , ( ) => {
72- const schema = getSchema ( { repoPath : join ( " Users" , " user" , " documents" , " code" , " repo" ) } ) ;
76+ it ( ' should throw on media folder traversal' , ( ) => {
77+ const schema = getSchema ( { repoPath : join ( ' Users' , ' user' , ' documents' , ' code' , ' repo' ) } ) ;
7378
7479 assetFailure (
7580 schema . validate ( {
76- action : " getMedia" ,
77- params : { ...defaultParams , mediaFolder : " ../" } ,
81+ action : ' getMedia' ,
82+ params : { ...defaultParams , mediaFolder : ' ../' } ,
7883 } ) ,
79- '"params.mediaFolder" must resolve to a path under the configured repository'
84+ '"params.mediaFolder" must resolve to a path under the configured repository' ,
8085 ) ;
8186 } ) ;
8287
83- it ( " should not throw on valid folder" , ( ) => {
84- const schema = getSchema ( { repoPath : join ( " Users" , " user" , " documents" , " code" , " repo" ) } ) ;
88+ it ( ' should not throw on valid folder' , ( ) => {
89+ const schema = getSchema ( { repoPath : join ( ' Users' , ' user' , ' documents' , ' code' , ' repo' ) } ) ;
8590 const { error } = schema . validate ( {
86- action : " getMedia" ,
87- params : { ...defaultParams , mediaFolder : " static/images" } ,
91+ action : ' getMedia' ,
92+ params : { ...defaultParams , mediaFolder : ' static/images' } ,
8893 } ) ;
8994
9095 expect ( error ) . toBeUndefined ( ) ;
9196 } ) ;
9297 } ) ;
98+
99+ describe ( 'getMedia' , ( ) => {
100+ it ( 'should get media files' , async ( ) => {
101+ ( listRepoFiles as jest . Mock ) . mockResolvedValue ( [
102+ 'mediaFolder/asset1.jpg' ,
103+ 'mediaFolder/asset2.jpg' ,
104+ 'mediaFolder/asset3.jpg' ,
105+ ] ) ;
106+
107+ const json = jest . fn ( ) ;
108+ const res : express . Response = { json } as unknown as express . Response ;
109+
110+ const req = {
111+ body : {
112+ action : 'getMedia' ,
113+ params : {
114+ mediaFolder : 'mediaFolder' ,
115+ branch : 'main' ,
116+ } ,
117+ } ,
118+ } as express . Request ;
119+
120+ const repoPath = '.' ;
121+
122+ await localFsMiddleware ( { repoPath, logger : winston . createLogger ( ) } ) ( req , res ) ;
123+
124+ expect ( json ) . toHaveBeenCalledTimes ( 1 ) ;
125+ expect ( json ) . toHaveBeenCalledWith ( [
126+ {
127+ path : 'mediaFolder/asset1.jpg' ,
128+ url : 'mediaFolder/asset1.jpg' ,
129+ } ,
130+ {
131+ path : 'mediaFolder/asset2.jpg' ,
132+ url : 'mediaFolder/asset2.jpg' ,
133+ } ,
134+ {
135+ path : 'mediaFolder/asset3.jpg' ,
136+ url : 'mediaFolder/asset3.jpg' ,
137+ } ,
138+ ] ) ;
139+ } ) ;
140+
141+ it ( 'should translate media path to public path even when media path is absolute' , async ( ) => {
142+ ( listRepoFiles as jest . Mock ) . mockResolvedValue ( [
143+ 'mediaFolder/asset1.jpg' ,
144+ 'mediaFolder/asset2.jpg' ,
145+ 'mediaFolder/asset3.jpg' ,
146+ ] ) ;
147+
148+ const json = jest . fn ( ) ;
149+ const res : express . Response = { json } as unknown as express . Response ;
150+
151+ const req = {
152+ body : {
153+ action : 'getMedia' ,
154+ params : {
155+ mediaFolder : '/mediaFolder' ,
156+ publicFolder : '/publicFolder' ,
157+ branch : 'main' ,
158+ } ,
159+ } ,
160+ } as express . Request ;
161+
162+ const repoPath = '.' ;
163+
164+ await localFsMiddleware ( { repoPath, logger : winston . createLogger ( ) } ) ( req , res ) ;
165+
166+ expect ( json ) . toHaveBeenCalledTimes ( 1 ) ;
167+ expect ( json ) . toHaveBeenCalledWith ( [
168+ {
169+ path : 'mediaFolder/asset1.jpg' ,
170+ url : '/publicFolder/asset1.jpg' ,
171+ } ,
172+ {
173+ path : 'mediaFolder/asset2.jpg' ,
174+ url : '/publicFolder/asset2.jpg' ,
175+ } ,
176+ {
177+ path : 'mediaFolder/asset3.jpg' ,
178+ url : '/publicFolder/asset3.jpg' ,
179+ } ,
180+ ] ) ;
181+ } ) ;
182+
183+ it ( 'should translate media path to public path' , async ( ) => {
184+ ( listRepoFiles as jest . Mock ) . mockResolvedValue ( [
185+ 'mediaFolder/asset1.jpg' ,
186+ 'mediaFolder/asset2.jpg' ,
187+ 'mediaFolder/asset3.jpg' ,
188+ ] ) ;
189+
190+ const json = jest . fn ( ) ;
191+ const res : express . Response = { json } as unknown as express . Response ;
192+
193+ const req = {
194+ body : {
195+ action : 'getMedia' ,
196+ params : {
197+ mediaFolder : 'mediaFolder' ,
198+ publicFolder : '/publicFolder' ,
199+ branch : 'main' ,
200+ } ,
201+ } ,
202+ } as express . Request ;
203+
204+ const repoPath = '.' ;
205+
206+ await localFsMiddleware ( { repoPath, logger : winston . createLogger ( ) } ) ( req , res ) ;
207+
208+ expect ( json ) . toHaveBeenCalledTimes ( 1 ) ;
209+ expect ( json ) . toHaveBeenCalledWith ( [
210+ {
211+ path : 'mediaFolder/asset1.jpg' ,
212+ url : '/publicFolder/asset1.jpg' ,
213+ } ,
214+ {
215+ path : 'mediaFolder/asset2.jpg' ,
216+ url : '/publicFolder/asset2.jpg' ,
217+ } ,
218+ {
219+ path : 'mediaFolder/asset3.jpg' ,
220+ url : '/publicFolder/asset3.jpg' ,
221+ } ,
222+ ] ) ;
223+ } ) ;
224+ } ) ;
93225} ) ;
0 commit comments