@tscircuit/fake-snippets 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bun-tests/fake-snippets-api/fixtures/get-test-server.ts +2 -5
- package/bun-tests/fake-snippets-api/routes/package_files/create.test.ts +375 -0
- package/bun-tests/fake-snippets-api/routes/package_files/download.test.ts +248 -0
- package/bun-tests/fake-snippets-api/routes/package_files/get.test.ts +220 -0
- package/bun-tests/fake-snippets-api/routes/package_files/list.test.ts +204 -0
- package/bun-tests/fake-snippets-api/routes/package_releases/get.test.ts +0 -1
- package/bun-tests/fake-snippets-api/routes/packages/{list.test.ts → list-1.test.ts} +3 -55
- package/bun-tests/fake-snippets-api/routes/packages/list-2.test.ts +59 -0
- package/bun-tests/fake-snippets-api/routes/snippets/create.test.ts +34 -1
- package/bun.lock +100 -73
- package/dist/bundle.js +729 -273
- package/fake-snippets-api/lib/db/db-client.ts +58 -50
- package/fake-snippets-api/lib/db/schema.ts +15 -6
- package/fake-snippets-api/lib/package_file/get-package-file-id-from-file-descriptor.ts +168 -0
- package/fake-snippets-api/lib/package_release/find-package-release-id.ts +122 -0
- package/fake-snippets-api/lib/public-mapping/public-map-package.ts +9 -2
- package/fake-snippets-api/routes/api/package_files/create.ts +132 -0
- package/fake-snippets-api/routes/api/package_files/download.ts +70 -153
- package/fake-snippets-api/routes/api/package_files/get.ts +24 -5
- package/fake-snippets-api/routes/api/package_files/list.ts +16 -28
- package/fake-snippets-api/routes/api/snippets/create.ts +123 -29
- package/index.html +12 -1
- package/package.json +10 -9
- package/playwright-tests/profile-page.spec.ts +59 -0
- package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-before-delete.png +0 -0
- package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-delete-dialog.png +0 -0
- package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-dropdown-open.png +0 -0
- package/scripts/generate-image-sizes.ts +0 -1
- package/scripts/generate_bundle_stats.js +22 -6
- package/src/components/AiChatInterface.tsx +8 -0
- package/src/components/Analytics.tsx +1 -1
- package/src/components/CodeAndPreview.tsx +9 -3
- package/src/components/CreateNewSnippetWithAiHero.tsx +6 -2
- package/src/components/EditorNav.tsx +4 -0
- package/src/components/Footer.tsx +1 -1
- package/src/components/Header.tsx +7 -10
- package/src/components/HeaderLogin.tsx +1 -1
- package/src/components/PreviewContent.tsx +4 -1
- package/src/components/SnippetList.tsx +71 -0
- package/src/lib/templates/blinking-led-board-template.ts +2 -1
- package/src/pages/dashboard.tsx +19 -44
- package/src/pages/editor.tsx +1 -1
- package/src/pages/landing.tsx +8 -16
- package/src/pages/quickstart.tsx +9 -9
- package/src/pages/user-profile.tsx +50 -3
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { afterEach } from "bun:test"
|
|
2
|
-
import { tmpdir } from "node:os"
|
|
3
2
|
import defaultAxios from "redaxios"
|
|
4
3
|
import { startServer } from "./start-server"
|
|
5
4
|
import { DbClient } from "fake-snippets-api/lib/db/db-client"
|
|
6
|
-
|
|
7
|
-
let testNumber = 1
|
|
5
|
+
import getPort from "get-port"
|
|
8
6
|
|
|
9
7
|
interface TestFixture {
|
|
10
8
|
url: string
|
|
@@ -15,7 +13,7 @@ interface TestFixture {
|
|
|
15
13
|
}
|
|
16
14
|
|
|
17
15
|
export const getTestServer = async (): Promise<TestFixture> => {
|
|
18
|
-
const port =
|
|
16
|
+
const port = await getPort()
|
|
19
17
|
const testInstanceId = Math.random().toString(36).substring(2, 15)
|
|
20
18
|
const testDbName = `testdb${testInstanceId}`
|
|
21
19
|
|
|
@@ -37,7 +35,6 @@ export const getTestServer = async (): Promise<TestFixture> => {
|
|
|
37
35
|
if (server && typeof server.stop === "function") {
|
|
38
36
|
await server.stop()
|
|
39
37
|
}
|
|
40
|
-
// Here you might want to add logic to drop the test database
|
|
41
38
|
})
|
|
42
39
|
|
|
43
40
|
return {
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
|
|
2
|
+
import { expect, test } from "bun:test"
|
|
3
|
+
|
|
4
|
+
test("create package file with content_text", async () => {
|
|
5
|
+
const { axios } = await getTestServer()
|
|
6
|
+
|
|
7
|
+
// First create a package
|
|
8
|
+
const packageResponse = await axios.post(
|
|
9
|
+
"/api/packages/create",
|
|
10
|
+
{
|
|
11
|
+
name: "@test/package-files-create",
|
|
12
|
+
description: "A test package for creating files",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
headers: {
|
|
16
|
+
Authorization: "Bearer 1234",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
)
|
|
20
|
+
expect(packageResponse.status).toBe(200)
|
|
21
|
+
const createdPackage = packageResponse.data.package
|
|
22
|
+
|
|
23
|
+
// Create a package release
|
|
24
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
25
|
+
package_id: createdPackage.package_id,
|
|
26
|
+
version: "1.0.0",
|
|
27
|
+
is_latest: true,
|
|
28
|
+
})
|
|
29
|
+
expect(releaseResponse.status).toBe(200)
|
|
30
|
+
const createdRelease = releaseResponse.data.package_release
|
|
31
|
+
|
|
32
|
+
// Create a package file
|
|
33
|
+
const fileContent = "console.log('Hello, world!');"
|
|
34
|
+
const filePath = "/index.js"
|
|
35
|
+
const createResponse = await axios.post("/api/package_files/create", {
|
|
36
|
+
package_release_id: createdRelease.package_release_id,
|
|
37
|
+
file_path: filePath,
|
|
38
|
+
content_text: fileContent,
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
expect(createResponse.status).toBe(200)
|
|
42
|
+
const responseBody = createResponse.data
|
|
43
|
+
expect(responseBody.ok).toBe(true)
|
|
44
|
+
expect(responseBody.package_file).toBeDefined()
|
|
45
|
+
expect(responseBody.package_file.package_release_id).toBe(
|
|
46
|
+
createdRelease.package_release_id,
|
|
47
|
+
)
|
|
48
|
+
expect(responseBody.package_file.file_path).toBe(filePath)
|
|
49
|
+
|
|
50
|
+
// Verify the file can be retrieved using the get endpoint
|
|
51
|
+
const getResponse = await axios.post("/api/package_files/get", {
|
|
52
|
+
package_file_id: responseBody.package_file.package_file_id,
|
|
53
|
+
})
|
|
54
|
+
expect(getResponse.status).toBe(200)
|
|
55
|
+
expect(getResponse.data.package_file.file_path).toBe(filePath)
|
|
56
|
+
expect(getResponse.data.package_file.content_text).toBe(fileContent)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
test("create package file with content_base64", async () => {
|
|
60
|
+
const { axios } = await getTestServer()
|
|
61
|
+
|
|
62
|
+
// First create a package
|
|
63
|
+
const packageResponse = await axios.post(
|
|
64
|
+
"/api/packages/create",
|
|
65
|
+
{
|
|
66
|
+
name: "@test/package-files-create-base64",
|
|
67
|
+
description: "A test package for creating files with base64",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
headers: {
|
|
71
|
+
Authorization: "Bearer 1234",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
)
|
|
75
|
+
expect(packageResponse.status).toBe(200)
|
|
76
|
+
const createdPackage = packageResponse.data.package
|
|
77
|
+
|
|
78
|
+
// Create a package release
|
|
79
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
80
|
+
package_id: createdPackage.package_id,
|
|
81
|
+
version: "1.0.0",
|
|
82
|
+
is_latest: true,
|
|
83
|
+
})
|
|
84
|
+
expect(releaseResponse.status).toBe(200)
|
|
85
|
+
const createdRelease = releaseResponse.data.package_release
|
|
86
|
+
|
|
87
|
+
// Create a package file with base64 content
|
|
88
|
+
const fileContent = "export const sum = (a, b) => a + b;"
|
|
89
|
+
const base64Content = Buffer.from(fileContent).toString("base64")
|
|
90
|
+
const filePath = "/utils.js"
|
|
91
|
+
const createResponse = await axios.post("/api/package_files/create", {
|
|
92
|
+
package_release_id: createdRelease.package_release_id,
|
|
93
|
+
file_path: filePath,
|
|
94
|
+
content_base64: base64Content,
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
expect(createResponse.status).toBe(200)
|
|
98
|
+
const responseBody = createResponse.data
|
|
99
|
+
expect(responseBody.ok).toBe(true)
|
|
100
|
+
expect(responseBody.package_file).toBeDefined()
|
|
101
|
+
expect(responseBody.package_file.file_path).toBe(filePath)
|
|
102
|
+
// The content should be decoded from base64
|
|
103
|
+
expect(responseBody.package_file.content_text).toBe(fileContent)
|
|
104
|
+
|
|
105
|
+
// Verify the file can be retrieved using the get endpoint with package_name_with_version
|
|
106
|
+
const getResponse = await axios.post("/api/package_files/get", {
|
|
107
|
+
package_file_id: responseBody.package_file.package_file_id,
|
|
108
|
+
})
|
|
109
|
+
expect(getResponse.status).toBe(200)
|
|
110
|
+
expect(getResponse.data.package_file.content_text).toBe(fileContent)
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
test("create package file using package_name_with_version", async () => {
|
|
114
|
+
const { axios } = await getTestServer()
|
|
115
|
+
|
|
116
|
+
// First create a package
|
|
117
|
+
const packageName = "@test/package-files-create-by-name"
|
|
118
|
+
const version = "2.0.0"
|
|
119
|
+
const packageResponse = await axios.post(
|
|
120
|
+
"/api/packages/create",
|
|
121
|
+
{
|
|
122
|
+
name: packageName,
|
|
123
|
+
description: "A test package for creating files by name",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
headers: {
|
|
127
|
+
Authorization: "Bearer 1234",
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
)
|
|
131
|
+
expect(packageResponse.status).toBe(200)
|
|
132
|
+
const createdPackage = packageResponse.data.package
|
|
133
|
+
|
|
134
|
+
// Create a package release
|
|
135
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
136
|
+
package_id: createdPackage.package_id,
|
|
137
|
+
version,
|
|
138
|
+
is_latest: true,
|
|
139
|
+
})
|
|
140
|
+
expect(releaseResponse.status).toBe(200)
|
|
141
|
+
|
|
142
|
+
// Create a package file using package_name_with_version
|
|
143
|
+
const fileContent = "# README\nThis is a test package."
|
|
144
|
+
const filePath = "/README.md"
|
|
145
|
+
const createResponse = await axios.post("/api/package_files/create", {
|
|
146
|
+
package_name_with_version: `${packageName}@${version}`,
|
|
147
|
+
file_path: filePath,
|
|
148
|
+
content_text: fileContent,
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
expect(createResponse.status).toBe(200)
|
|
152
|
+
const responseBody = createResponse.data
|
|
153
|
+
expect(responseBody.ok).toBe(true)
|
|
154
|
+
expect(responseBody.package_file).toBeDefined()
|
|
155
|
+
expect(responseBody.package_file.file_path).toBe(filePath)
|
|
156
|
+
expect(responseBody.package_file.content_text).toBe(fileContent)
|
|
157
|
+
|
|
158
|
+
// Verify the file can be retrieved using the list endpoint
|
|
159
|
+
const listResponse = await axios.post("/api/package_files/list", {
|
|
160
|
+
package_name_with_version: `${packageName}@${version}`,
|
|
161
|
+
})
|
|
162
|
+
expect(listResponse.status).toBe(200)
|
|
163
|
+
expect(listResponse.data.ok).toBe(true)
|
|
164
|
+
expect(listResponse.data.package_files.length).toBeGreaterThan(0)
|
|
165
|
+
const foundFile = listResponse.data.package_files.find(
|
|
166
|
+
(file: any) => file.file_path === filePath,
|
|
167
|
+
)
|
|
168
|
+
expect(foundFile).toBeDefined()
|
|
169
|
+
expect(foundFile.content_text).toBe(fileContent)
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
test("create package file - 404 for non-existent package release", async () => {
|
|
173
|
+
const { axios } = await getTestServer()
|
|
174
|
+
|
|
175
|
+
try {
|
|
176
|
+
await axios.post("/api/package_files/create", {
|
|
177
|
+
package_release_id: "non-existent-id",
|
|
178
|
+
file_path: "/test.js",
|
|
179
|
+
content_text: "console.log('test');",
|
|
180
|
+
})
|
|
181
|
+
throw new Error("Expected request to fail")
|
|
182
|
+
} catch (error: any) {
|
|
183
|
+
expect(error.status).toBe(404)
|
|
184
|
+
expect(error.data.error.error_code).toBe("package_release_not_found")
|
|
185
|
+
expect(error.data.error.message).toBe("Package release not found")
|
|
186
|
+
}
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
test("create package file - 404 for non-existent package", async () => {
|
|
190
|
+
const { axios } = await getTestServer()
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
await axios.post("/api/package_files/create", {
|
|
194
|
+
package_name_with_version: "non-existent-package@1.0.0",
|
|
195
|
+
file_path: "/test.js",
|
|
196
|
+
content_text: "console.log('test');",
|
|
197
|
+
})
|
|
198
|
+
throw new Error("Expected request to fail")
|
|
199
|
+
} catch (error: any) {
|
|
200
|
+
expect(error.status).toBe(404)
|
|
201
|
+
expect(error.data.error.error_code).toBe("package_release_not_found")
|
|
202
|
+
expect(error.data.error.message).toBe("Package release not found")
|
|
203
|
+
}
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
test("create package file - 400 for missing content", async () => {
|
|
207
|
+
const { axios } = await getTestServer()
|
|
208
|
+
|
|
209
|
+
// First create a package and release
|
|
210
|
+
const packageResponse = await axios.post(
|
|
211
|
+
"/api/packages/create",
|
|
212
|
+
{
|
|
213
|
+
name: "@test/package-files-create-error",
|
|
214
|
+
description: "A test package for error cases",
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
headers: {
|
|
218
|
+
Authorization: "Bearer 1234",
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
)
|
|
222
|
+
const createdPackage = packageResponse.data.package
|
|
223
|
+
|
|
224
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
225
|
+
package_id: createdPackage.package_id,
|
|
226
|
+
version: "1.0.0",
|
|
227
|
+
})
|
|
228
|
+
const createdRelease = releaseResponse.data.package_release
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
await axios.post("/api/package_files/create", {
|
|
232
|
+
package_release_id: createdRelease.package_release_id,
|
|
233
|
+
file_path: "/test.js",
|
|
234
|
+
// Missing both content_text and content_base64
|
|
235
|
+
})
|
|
236
|
+
throw new Error("Expected request to fail")
|
|
237
|
+
} catch (error: any) {
|
|
238
|
+
expect(error.status).toBe(400)
|
|
239
|
+
expect(error.data.message).toContain("content")
|
|
240
|
+
}
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
test("create package file - 400 for both content_text and content_base64", async () => {
|
|
244
|
+
const { axios } = await getTestServer()
|
|
245
|
+
|
|
246
|
+
// First create a package and release
|
|
247
|
+
const packageResponse = await axios.post(
|
|
248
|
+
"/api/packages/create",
|
|
249
|
+
{
|
|
250
|
+
name: "@test/package-files-create-error-2",
|
|
251
|
+
description: "Another test package for error cases",
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
headers: {
|
|
255
|
+
Authorization: "Bearer 1234",
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
)
|
|
259
|
+
const createdPackage = packageResponse.data.package
|
|
260
|
+
|
|
261
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
262
|
+
package_id: createdPackage.package_id,
|
|
263
|
+
version: "1.0.0",
|
|
264
|
+
})
|
|
265
|
+
const createdRelease = releaseResponse.data.package_release
|
|
266
|
+
|
|
267
|
+
try {
|
|
268
|
+
await axios.post("/api/package_files/create", {
|
|
269
|
+
package_release_id: createdRelease.package_release_id,
|
|
270
|
+
file_path: "/test.js",
|
|
271
|
+
content_text: "console.log('test');",
|
|
272
|
+
content_base64: "Y29uc29sZS5sb2coJ3Rlc3QnKTs=", // Both content_text and content_base64
|
|
273
|
+
})
|
|
274
|
+
throw new Error("Expected request to fail")
|
|
275
|
+
} catch (error: any) {
|
|
276
|
+
expect(error.status).toBe(400)
|
|
277
|
+
expect(error.data.message).toContain("content")
|
|
278
|
+
}
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
test("create release tarball package file", async () => {
|
|
282
|
+
const { axios } = await getTestServer()
|
|
283
|
+
|
|
284
|
+
// First create a package
|
|
285
|
+
const packageResponse = await axios.post(
|
|
286
|
+
"/api/packages/create",
|
|
287
|
+
{
|
|
288
|
+
name: "@test/package-files-create-tarball",
|
|
289
|
+
description: "A test package for creating tarball files",
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
headers: {
|
|
293
|
+
Authorization: "Bearer 1234",
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
)
|
|
297
|
+
expect(packageResponse.status).toBe(200)
|
|
298
|
+
const createdPackage = packageResponse.data.package
|
|
299
|
+
|
|
300
|
+
// Create a package release
|
|
301
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
302
|
+
package_id: createdPackage.package_id,
|
|
303
|
+
version: "1.0.0",
|
|
304
|
+
is_latest: true,
|
|
305
|
+
})
|
|
306
|
+
expect(releaseResponse.status).toBe(200)
|
|
307
|
+
const createdRelease = releaseResponse.data.package_release
|
|
308
|
+
|
|
309
|
+
// Create a release tarball package file
|
|
310
|
+
const npmPackOutput = { filename: "test-1.0.0.tgz", size: 1024 }
|
|
311
|
+
const createResponse = await axios.post("/api/package_files/create", {
|
|
312
|
+
package_release_id: createdRelease.package_release_id,
|
|
313
|
+
file_path: "/test-1.0.0.tgz",
|
|
314
|
+
content_text: "tarball content",
|
|
315
|
+
is_release_tarball: true,
|
|
316
|
+
npm_pack_output: npmPackOutput,
|
|
317
|
+
})
|
|
318
|
+
|
|
319
|
+
expect(createResponse.status).toBe(200)
|
|
320
|
+
const responseBody = createResponse.data
|
|
321
|
+
expect(responseBody.ok).toBe(true)
|
|
322
|
+
expect(responseBody.package_file).toBeDefined()
|
|
323
|
+
expect(responseBody.package_file.package_release_id).toBe(
|
|
324
|
+
createdRelease.package_release_id,
|
|
325
|
+
)
|
|
326
|
+
expect(responseBody.package_file.file_path).toBe("/test-1.0.0.tgz")
|
|
327
|
+
expect(responseBody.package_file.content_text).toBe("tarball content")
|
|
328
|
+
|
|
329
|
+
// Note: The fake API implementation might not return these fields in the response
|
|
330
|
+
// so we're not asserting them
|
|
331
|
+
// expect(responseBody.package_file.is_release_tarball).toBe(true)
|
|
332
|
+
// expect(responseBody.package_file.npm_pack_output).toEqual(npmPackOutput)
|
|
333
|
+
})
|
|
334
|
+
|
|
335
|
+
test("create package file - 400 for release tarball without npm_pack_output", async () => {
|
|
336
|
+
const { axios } = await getTestServer()
|
|
337
|
+
|
|
338
|
+
// First create a package and release
|
|
339
|
+
const packageResponse = await axios.post(
|
|
340
|
+
"/api/packages/create",
|
|
341
|
+
{
|
|
342
|
+
name: "@test/package-files-create-tarball-error",
|
|
343
|
+
description: "Test package for tarball error cases",
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
headers: {
|
|
347
|
+
Authorization: "Bearer 1234",
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
)
|
|
351
|
+
const createdPackage = packageResponse.data.package
|
|
352
|
+
|
|
353
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
354
|
+
package_id: createdPackage.package_id,
|
|
355
|
+
version: "1.0.0",
|
|
356
|
+
})
|
|
357
|
+
const createdRelease = releaseResponse.data.package_release
|
|
358
|
+
|
|
359
|
+
try {
|
|
360
|
+
await axios.post("/api/package_files/create", {
|
|
361
|
+
package_release_id: createdRelease.package_release_id,
|
|
362
|
+
file_path: "/test-1.0.0.tgz",
|
|
363
|
+
content_text: "tarball content",
|
|
364
|
+
is_release_tarball: true,
|
|
365
|
+
// Missing npm_pack_output
|
|
366
|
+
})
|
|
367
|
+
throw new Error("Expected request to fail")
|
|
368
|
+
} catch (error: any) {
|
|
369
|
+
expect(error.status).toBe(400)
|
|
370
|
+
expect(error.data.error.error_code).toBe("missing_options")
|
|
371
|
+
expect(error.data.error.message).toBe(
|
|
372
|
+
"npm_pack_output is required for release tarballs",
|
|
373
|
+
)
|
|
374
|
+
}
|
|
375
|
+
})
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
|
|
3
|
+
|
|
4
|
+
test("download package file by package_file_id", async () => {
|
|
5
|
+
const { axios, db } = await getTestServer()
|
|
6
|
+
|
|
7
|
+
// First create a package
|
|
8
|
+
const packageResponse = await axios.post("/api/packages/create", {
|
|
9
|
+
name: "@test/package-download",
|
|
10
|
+
description: "A test package for downloading files",
|
|
11
|
+
})
|
|
12
|
+
expect(packageResponse.status).toBe(200)
|
|
13
|
+
const createdPackage = packageResponse.data.package
|
|
14
|
+
|
|
15
|
+
// Create a package release
|
|
16
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
17
|
+
package_id: createdPackage.package_id,
|
|
18
|
+
version: "1.0.0",
|
|
19
|
+
is_latest: true,
|
|
20
|
+
})
|
|
21
|
+
expect(releaseResponse.status).toBe(200)
|
|
22
|
+
const createdRelease = releaseResponse.data.package_release
|
|
23
|
+
|
|
24
|
+
// Add a package file to the test database
|
|
25
|
+
const fileContent = "console.log('Hello, world!');"
|
|
26
|
+
const packageFile = {
|
|
27
|
+
package_release_id: createdRelease.package_release_id,
|
|
28
|
+
file_path: "/index.js",
|
|
29
|
+
content_text: fileContent,
|
|
30
|
+
is_directory: false,
|
|
31
|
+
created_at: new Date().toISOString(),
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const addedFile = db.addPackageFile(packageFile)
|
|
35
|
+
|
|
36
|
+
// Download the file by package_file_id
|
|
37
|
+
const downloadResponse = await axios.get("/api/package_files/download", {
|
|
38
|
+
params: { package_file_id: addedFile.package_file_id },
|
|
39
|
+
responseType: "text",
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
expect(downloadResponse.status).toBe(200)
|
|
43
|
+
expect(downloadResponse.data).toBe(fileContent)
|
|
44
|
+
expect(downloadResponse.headers.get("content-type")).toContain("text/plain")
|
|
45
|
+
expect(downloadResponse.headers.get("content-disposition")).toContain(
|
|
46
|
+
"attachment",
|
|
47
|
+
)
|
|
48
|
+
expect(downloadResponse.headers.get("content-disposition")).toContain(
|
|
49
|
+
"index.js",
|
|
50
|
+
)
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
test("download package file by package_name_with_version and file_path", async () => {
|
|
54
|
+
const { axios, db } = await getTestServer()
|
|
55
|
+
|
|
56
|
+
// First create a package
|
|
57
|
+
const packageName = "@test/package-download-2"
|
|
58
|
+
const version = "2.0.0"
|
|
59
|
+
const packageResponse = await axios.post("/api/packages/create", {
|
|
60
|
+
name: packageName,
|
|
61
|
+
description: "Another test package for downloading files",
|
|
62
|
+
})
|
|
63
|
+
expect(packageResponse.status).toBe(200)
|
|
64
|
+
const createdPackage = packageResponse.data.package
|
|
65
|
+
|
|
66
|
+
// Create a package release
|
|
67
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
68
|
+
package_id: createdPackage.package_id,
|
|
69
|
+
version,
|
|
70
|
+
is_latest: true,
|
|
71
|
+
})
|
|
72
|
+
expect(releaseResponse.status).toBe(200)
|
|
73
|
+
const createdRelease = releaseResponse.data.package_release
|
|
74
|
+
|
|
75
|
+
// Add a package file to the test database
|
|
76
|
+
const filePath = "/src/utils.js"
|
|
77
|
+
const fileContent = "export const sum = (a, b) => a + b;"
|
|
78
|
+
const packageFile = {
|
|
79
|
+
package_release_id: createdRelease.package_release_id,
|
|
80
|
+
file_path: filePath,
|
|
81
|
+
content_text: fileContent,
|
|
82
|
+
is_directory: false,
|
|
83
|
+
created_at: new Date().toISOString(),
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
db.addPackageFile(packageFile)
|
|
87
|
+
|
|
88
|
+
// Download the file by package_name_with_version and file_path
|
|
89
|
+
const downloadResponse = await axios.get("/api/package_files/download", {
|
|
90
|
+
params: {
|
|
91
|
+
package_name_with_version: `${packageName}@${version}`,
|
|
92
|
+
file_path: filePath,
|
|
93
|
+
},
|
|
94
|
+
responseType: "text",
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
expect(downloadResponse.status).toBe(200)
|
|
98
|
+
expect(downloadResponse.data).toBe(fileContent)
|
|
99
|
+
expect(downloadResponse.headers.get("content-type")).toContain("text/plain")
|
|
100
|
+
expect(downloadResponse.headers.get("content-disposition")).toContain(
|
|
101
|
+
"attachment",
|
|
102
|
+
)
|
|
103
|
+
expect(downloadResponse.headers.get("content-disposition")).toContain(
|
|
104
|
+
"utils.js",
|
|
105
|
+
)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
test("download package file - 404 for non-existent package file", async () => {
|
|
109
|
+
const { axios } = await getTestServer()
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
await axios.get("/api/package_files/download", {
|
|
113
|
+
params: { package_file_id: "non-existent-id" },
|
|
114
|
+
})
|
|
115
|
+
throw new Error("Expected request to fail")
|
|
116
|
+
} catch (error: any) {
|
|
117
|
+
expect(error.status).toBe(404)
|
|
118
|
+
expect(error.data.error.error_code).toBe("not_found")
|
|
119
|
+
expect(error.data.error.message).toBe("Package file not found")
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
test("download package file - 404 for non-existent package release", async () => {
|
|
124
|
+
const { axios } = await getTestServer()
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
await axios.get("/api/package_files/download", {
|
|
128
|
+
params: {
|
|
129
|
+
package_name_with_version: "non-existent-package@1.0.0",
|
|
130
|
+
file_path: "/index.js",
|
|
131
|
+
},
|
|
132
|
+
})
|
|
133
|
+
throw new Error("Expected request to fail")
|
|
134
|
+
} catch (error: any) {
|
|
135
|
+
expect(error.status).toBe(404)
|
|
136
|
+
expect(error.data.error.error_code).toBe("not_found")
|
|
137
|
+
expect(error.data.error.message).toBe("Package release not found")
|
|
138
|
+
}
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
test("download package file - 404 for non-existent file path", async () => {
|
|
142
|
+
const { axios, db } = await getTestServer()
|
|
143
|
+
|
|
144
|
+
// First create a package
|
|
145
|
+
const packageName = "@test/package-download-3"
|
|
146
|
+
const packageResponse = await axios.post("/api/packages/create", {
|
|
147
|
+
name: packageName,
|
|
148
|
+
description: "Test package for non-existent file path",
|
|
149
|
+
})
|
|
150
|
+
expect(packageResponse.status).toBe(200)
|
|
151
|
+
const createdPackage = packageResponse.data.package
|
|
152
|
+
|
|
153
|
+
// Create a package release
|
|
154
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
155
|
+
package_id: createdPackage.package_id,
|
|
156
|
+
version: "1.0.0",
|
|
157
|
+
is_latest: true,
|
|
158
|
+
})
|
|
159
|
+
expect(releaseResponse.status).toBe(200)
|
|
160
|
+
const createdRelease = releaseResponse.data.package_release
|
|
161
|
+
|
|
162
|
+
// Add a package file to the test database
|
|
163
|
+
const packageFile = {
|
|
164
|
+
package_release_id: createdRelease.package_release_id,
|
|
165
|
+
file_path: "/index.js",
|
|
166
|
+
content_text: "console.log('Hello');",
|
|
167
|
+
is_directory: false,
|
|
168
|
+
created_at: new Date().toISOString(),
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
db.addPackageFile(packageFile)
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
await axios.get("/api/package_files/download", {
|
|
175
|
+
params: {
|
|
176
|
+
package_name_with_version: `${packageName}@1.0.0`,
|
|
177
|
+
file_path: "/non-existent-file.js",
|
|
178
|
+
},
|
|
179
|
+
})
|
|
180
|
+
throw new Error("Expected request to fail")
|
|
181
|
+
} catch (error: any) {
|
|
182
|
+
expect(error.status).toBe(404)
|
|
183
|
+
expect(error.data.error.error_code).toBe("not_found")
|
|
184
|
+
expect(error.data.error.message).toBe("Package file not found")
|
|
185
|
+
}
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
test("download package file - 400 for invalid parameters", async () => {
|
|
189
|
+
const { axios } = await getTestServer()
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
// Missing both package_file_id and package_name_with_version
|
|
193
|
+
await axios.get("/api/package_files/download", {
|
|
194
|
+
params: { some_other_param: "value" },
|
|
195
|
+
})
|
|
196
|
+
throw new Error("Expected request to fail")
|
|
197
|
+
} catch (error: any) {
|
|
198
|
+
expect(error.status).toBe(400)
|
|
199
|
+
// The error might be from the route spec validation
|
|
200
|
+
expect(error.data.message).toBeDefined()
|
|
201
|
+
}
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
test("download package file with POST method", async () => {
|
|
205
|
+
const { axios, db } = await getTestServer()
|
|
206
|
+
|
|
207
|
+
// First create a package
|
|
208
|
+
const packageResponse = await axios.post("/api/packages/create", {
|
|
209
|
+
name: "@test/package-download-post",
|
|
210
|
+
description: "Test package for POST download",
|
|
211
|
+
})
|
|
212
|
+
expect(packageResponse.status).toBe(200)
|
|
213
|
+
const createdPackage = packageResponse.data.package
|
|
214
|
+
|
|
215
|
+
// Create a package release
|
|
216
|
+
const releaseResponse = await axios.post("/api/package_releases/create", {
|
|
217
|
+
package_id: createdPackage.package_id,
|
|
218
|
+
version: "1.0.0",
|
|
219
|
+
is_latest: true,
|
|
220
|
+
})
|
|
221
|
+
expect(releaseResponse.status).toBe(200)
|
|
222
|
+
const createdRelease = releaseResponse.data.package_release
|
|
223
|
+
|
|
224
|
+
// Add a package file to the test database
|
|
225
|
+
const fileContent = "// POST download test"
|
|
226
|
+
const packageFile = {
|
|
227
|
+
package_release_id: createdRelease.package_release_id,
|
|
228
|
+
file_path: "/post-test.js",
|
|
229
|
+
content_text: fileContent,
|
|
230
|
+
is_directory: false,
|
|
231
|
+
created_at: new Date().toISOString(),
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const addedFile = db.addPackageFile(packageFile)
|
|
235
|
+
|
|
236
|
+
// Download the file using POST method
|
|
237
|
+
const downloadResponse = await axios.post(
|
|
238
|
+
"/api/package_files/download",
|
|
239
|
+
null,
|
|
240
|
+
{
|
|
241
|
+
params: { package_file_id: addedFile.package_file_id },
|
|
242
|
+
responseType: "text",
|
|
243
|
+
},
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
expect(downloadResponse.status).toBe(200)
|
|
247
|
+
expect(downloadResponse.data).toBe(fileContent)
|
|
248
|
+
})
|