tests: homepage & partial prisma
This commit is contained in:
parent
aaae417189
commit
b012b95e71
9 changed files with 233 additions and 10 deletions
12
plice/BUILD
12
plice/BUILD
|
@ -5,6 +5,7 @@ files(
|
||||||
sources=[
|
sources=[
|
||||||
"prisma/**",
|
"prisma/**",
|
||||||
"src/**/*.ts",
|
"src/**/*.ts",
|
||||||
|
"vite.config.ts",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -48,7 +49,14 @@ adhoc_tool(
|
||||||
|
|
||||||
experimental_test_shell_command(
|
experimental_test_shell_command(
|
||||||
name="test",
|
name="test",
|
||||||
tools=["pnpm", "node", "sh", "sed", "dirname", "uname"],
|
tools=[
|
||||||
command="pnpm vitest run",
|
"pnpm",
|
||||||
|
"node",
|
||||||
|
"sh",
|
||||||
|
"sed",
|
||||||
|
"dirname",
|
||||||
|
"uname",
|
||||||
|
],
|
||||||
|
command="pnpm prisma generate && pnpm vitest run",
|
||||||
execution_dependencies=[":sources", ":package-config", ":node-modules"],
|
execution_dependencies=[":sources", ":package-config", ":node-modules"],
|
||||||
)
|
)
|
||||||
|
|
64
plice/prisma/mock.sql
Normal file
64
plice/prisma/mock.sql
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
PRAGMA foreign_keys=OFF;
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
CREATE TABLE IF NOT EXISTS "User" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"username" TEXT NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO User VALUES('afo41yngw19cjh2','fake');
|
||||||
|
CREATE TABLE IF NOT EXISTS "Session" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"user_id" TEXT NOT NULL,
|
||||||
|
"active_expires" BIGINT NOT NULL,
|
||||||
|
"idle_expires" BIGINT NOT NULL,
|
||||||
|
CONSTRAINT "Session_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
INSERT INTO Session VALUES('lwigbqkcyudn0h2xksfjmqomf28mwsq3hjge8xaf','afo41yngw19cjh2',1705150414256,1706360014256);
|
||||||
|
CREATE TABLE IF NOT EXISTS "Key" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"hashed_password" TEXT,
|
||||||
|
"user_id" TEXT NOT NULL,
|
||||||
|
CONSTRAINT "Key_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
INSERT INTO "Key" VALUES('username:fake','s2:1wc2gp27g4q9vur0:39545e2a52143d9027dafb8dc8a427cfd2a3cce55eb536506ac868c96ed665289cc75a022b967fd5bc24603c4cde8a152a8d94022a7e0c95c22ffd718aadbf21','afo41yngw19cjh2');
|
||||||
|
CREATE TABLE IF NOT EXISTS "Track" (
|
||||||
|
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"title" TEXT NOT NULL,
|
||||||
|
"objectKey" TEXT NOT NULL,
|
||||||
|
"producerId" TEXT NOT NULL,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" DATETIME NOT NULL,
|
||||||
|
CONSTRAINT "Track_producerId_fkey" FOREIGN KEY ("producerId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
INSERT INTO Track VALUES(1,'Meow','507ebeff-6f8e-45a0-9c1b-021a262f350a.mp3','afo41yngw19cjh2',1705065010419,1705065010419);
|
||||||
|
CREATE TABLE IF NOT EXISTS "TrackVersion" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"trackId" INTEGER NOT NULL,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" DATETIME NOT NULL,
|
||||||
|
CONSTRAINT "TrackVersion_trackId_fkey" FOREIGN KEY ("trackId") REFERENCES "Track" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
INSERT INTO TrackVersion VALUES('700ab0a6-fbf4-482e-b283-8b3d3984324f',1,1705065010424,1705065010424);
|
||||||
|
CREATE TABLE IF NOT EXISTS "Comment" (
|
||||||
|
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"content" TEXT NOT NULL,
|
||||||
|
"authorId" TEXT NOT NULL,
|
||||||
|
"trackVersionId" TEXT NOT NULL,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" DATETIME NOT NULL,
|
||||||
|
CONSTRAINT "Comment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
CONSTRAINT "Comment_trackVersionId_fkey" FOREIGN KEY ("trackVersionId") REFERENCES "TrackVersion" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
INSERT INTO Comment VALUES (1,'UwU','afo41yngw19cjh2','700ab0a6-fbf4-482e-b283-8b3d3984324f',1705078453000,1705078453000);
|
||||||
|
DELETE FROM sqlite_sequence;
|
||||||
|
INSERT INTO sqlite_sequence VALUES('Track',1);
|
||||||
|
CREATE UNIQUE INDEX "User_id_key" ON "User"("id");
|
||||||
|
CREATE UNIQUE INDEX "User_username_key" ON "User"("username");
|
||||||
|
CREATE INDEX "User_username_idx" ON "User"("username");
|
||||||
|
CREATE UNIQUE INDEX "Session_id_key" ON "Session"("id");
|
||||||
|
CREATE INDEX "Session_user_id_idx" ON "Session"("user_id");
|
||||||
|
CREATE UNIQUE INDEX "Key_id_key" ON "Key"("id");
|
||||||
|
CREATE INDEX "Key_user_id_idx" ON "Key"("user_id");
|
||||||
|
CREATE INDEX "Track_producerId_idx" ON "Track"("producerId");
|
||||||
|
CREATE INDEX "TrackVersion_trackId_idx" ON "TrackVersion"("trackId");
|
||||||
|
CREATE INDEX "Comment_authorId_trackVersionId_idx" ON "Comment"("authorId", "trackVersionId");
|
||||||
|
COMMIT;
|
|
@ -1,7 +0,0 @@
|
||||||
import { describe, it, expect } from 'vitest';
|
|
||||||
|
|
||||||
describe('sum test', () => {
|
|
||||||
it('adds 1 + 2 to equal 3', () => {
|
|
||||||
expect(1 + 2).toBe(3);
|
|
||||||
});
|
|
||||||
});
|
|
53
plice/src/lib/server/db/__snapshots__/prisma.test.ts.snap
Normal file
53
plice/src/lib/server/db/__snapshots__/prisma.test.ts.snap
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
|
exports[`homepage fetch 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"_count": {
|
||||||
|
"versions": 1,
|
||||||
|
},
|
||||||
|
"id": 1,
|
||||||
|
"producer": {
|
||||||
|
"username": "fake",
|
||||||
|
},
|
||||||
|
"title": "Meow",
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"comments": [
|
||||||
|
{
|
||||||
|
"author": {
|
||||||
|
"username": "fake",
|
||||||
|
},
|
||||||
|
"content": "UwU",
|
||||||
|
"createdAt": 2024-01-12T16:54:13.000Z,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`track page fetch 1`] = `
|
||||||
|
{
|
||||||
|
"createdAt": 2024-01-12T13:10:10.419Z,
|
||||||
|
"producer": {
|
||||||
|
"username": "fake",
|
||||||
|
},
|
||||||
|
"title": "Meow",
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"comments": [
|
||||||
|
{
|
||||||
|
"author": {
|
||||||
|
"username": "fake",
|
||||||
|
},
|
||||||
|
"content": "UwU",
|
||||||
|
"createdAt": 2024-01-12T16:54:13.000Z,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"id": "700ab0a6-fbf4-482e-b283-8b3d3984324f",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
`;
|
13
plice/src/lib/server/db/prisma.test.ts
Normal file
13
plice/src/lib/server/db/prisma.test.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import { expect, test } from 'vitest';
|
||||||
|
import { DatabasePrisma } from './prisma';
|
||||||
|
|
||||||
|
const TEST_USER_ID = 'afo41yngw19cjh2';
|
||||||
|
const TEST_TRACK_ID = 1;
|
||||||
|
|
||||||
|
const readOnlyDatabase = new DatabasePrisma('file:/tmp/larsen/readonly.db');
|
||||||
|
|
||||||
|
test('homepage fetch', async () =>
|
||||||
|
expect(await readOnlyDatabase.fetchHomepageData(TEST_USER_ID)).toMatchSnapshot());
|
||||||
|
|
||||||
|
test('track page fetch', async () =>
|
||||||
|
expect(await readOnlyDatabase.fetchTrackPageData(TEST_TRACK_ID)).toMatchSnapshot());
|
27
plice/src/routes/__snapshots__/page.server.test.ts.snap
Normal file
27
plice/src/routes/__snapshots__/page.server.test.ts.snap
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
|
exports[`anonymous homepage load 1`] = `
|
||||||
|
{
|
||||||
|
"tracks": [],
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`user homepage load 1`] = `
|
||||||
|
{
|
||||||
|
"tracks": [
|
||||||
|
{
|
||||||
|
"comments": [
|
||||||
|
{
|
||||||
|
"author": "other-fake-user",
|
||||||
|
"content": "Lorem ipsum dolar",
|
||||||
|
"createdAt": 2024-02-10T13:20:43.426Z,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"id": 1,
|
||||||
|
"producer": "fake-user",
|
||||||
|
"title": "Fake Song",
|
||||||
|
"version": 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
`;
|
36
plice/src/routes/page.server.test.ts
Normal file
36
plice/src/routes/page.server.test.ts
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
import { expect, test } from 'vitest';
|
||||||
|
import { load } from './+page.server';
|
||||||
|
|
||||||
|
import { MockHomepageFetch } from '$lib/server/db/mock';
|
||||||
|
|
||||||
|
test('anonymous homepage load', async () => {
|
||||||
|
const db = new MockHomepageFetch();
|
||||||
|
const locals = {
|
||||||
|
// TODO: Replace with authentication adapter
|
||||||
|
authReq: {
|
||||||
|
validate: () => {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
database: db
|
||||||
|
};
|
||||||
|
|
||||||
|
// @ts-expect-error: Faking authentication object
|
||||||
|
expect(await load({ locals })).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('user homepage load', async () => {
|
||||||
|
const db = new MockHomepageFetch();
|
||||||
|
const locals = {
|
||||||
|
// TODO: Replace with authentication adapter
|
||||||
|
authReq: {
|
||||||
|
validate: () => {
|
||||||
|
return { user: { userId: 'fake' } };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
database: db
|
||||||
|
};
|
||||||
|
|
||||||
|
// @ts-expect-error: Faking authentication object
|
||||||
|
expect(await load({ locals })).toMatchSnapshot();
|
||||||
|
});
|
28
plice/src/setup.ts
Normal file
28
plice/src/setup.ts
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import { DatabasePrisma } from '$lib/server/db/prisma';
|
||||||
|
import fs from 'node:fs';
|
||||||
|
|
||||||
|
const setup = async () => {
|
||||||
|
fs.mkdirSync('/tmp/larsen', { recursive: true });
|
||||||
|
const sql = fs
|
||||||
|
.readFileSync('prisma/mock.sql')
|
||||||
|
.toString()
|
||||||
|
.split('\n')
|
||||||
|
.filter((line) => line.indexOf('--') !== 0)
|
||||||
|
.join('\n')
|
||||||
|
.replace(/(\r\n|\n|\r)/gm, ' ')
|
||||||
|
.replace(/\s+/g, ' ')
|
||||||
|
.split(';')
|
||||||
|
.filter((line) => line != ' ');
|
||||||
|
|
||||||
|
const db = new DatabasePrisma('file:/tmp/larsen/readonly.db');
|
||||||
|
|
||||||
|
for (const statement of sql) {
|
||||||
|
await db.client.$executeRawUnsafe(statement);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const teardown = () => {
|
||||||
|
fs.rmSync('/tmp/larsen/readonly.db');
|
||||||
|
};
|
||||||
|
|
||||||
|
export { setup, teardown };
|
|
@ -4,6 +4,7 @@ import { defineConfig } from 'vitest/config';
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [sveltekit()],
|
plugins: [sveltekit()],
|
||||||
test: {
|
test: {
|
||||||
include: ['src/**/*.{test,spec}.{js,ts}']
|
include: ['src/**/*.{test,spec}.{js,ts}'],
|
||||||
|
globalSetup: './src/setup.ts'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue