159 lines
5.3 KiB
TypeScript
Raw Normal View History

2025-02-15 04:31:20 -08:00
import {
describe
, expect
, it
2025-02-19 13:09:53 -08:00
, beforeEach
2025-02-15 04:31:20 -08:00
} from 'bun:test'
import {
Elysia
} from 'elysia'
import {
treaty
} from '@elysiajs/eden'
import app from '../app.ts'
2025-02-19 13:09:53 -08:00
import Docker from 'dockerode'
2025-02-15 04:31:20 -08:00
2025-02-19 13:09:53 -08:00
if (!process.env.WL_FILE_PATH) throw new Error("WL_FILE_PATH is missing in env");
if (!process.env.WL_USERNAME) throw new Error("WL_USERNAME is missing in env.");
if (!process.env.WL_PASSWORD) throw new Error("WL_PASSWORD is missing in env.");
2025-02-15 04:31:20 -08:00
2025-02-19 13:09:53 -08:00
const whitelistFilePath = process.env.WL_FILE_PATH!
const fixture = "3aa5ad5e62eaffd148cff3dbe93ff2e1e9cbcf01"
2025-02-15 04:31:20 -08:00
2025-02-19 13:09:53 -08:00
const username = process.env.WL_USERNAME!
const password = process.env.WL_PASSWORD!
2025-02-15 04:31:20 -08:00
const opts = {
headers: {
authorization: "Basic " + btoa(username + ':' + password)
}
}
const api = treaty(app)
2025-02-19 13:09:53 -08:00
2025-02-15 04:31:20 -08:00
describe
2025-02-19 13:09:53 -08:00
('tracker-helper', () => {
beforeEach(() => {
let whitelistFilePath = process.env.WL_FILE_PATH!
console.log(`Asserting existance of whitelist at ${whitelistFilePath}`)
// create whitelist file if it doesn't exist
const assertWhitelistExists = async function assertWhitelistExists(whitelistFilePath: string) {
const wlFile = Bun.file(whitelistFilePath);
const exists = await wlFile.exists()
if (!exists) {
console.log(`creating whitelist file at ${whitelistFilePath}`)
await wlFile.write("")
}
}
const clearWhitelist = async function clearWhitelist(whitelistFilePath: string) {
const wlFile = Bun.file(whitelistFilePath);
await wlFile.write("")
}
assertWhitelistExists(whitelistFilePath)
clearWhitelist(whitelistFilePath)
});
2025-02-15 04:31:20 -08:00
it('return a health response', async () => {
const { data, status } = await api.health.get()
expect(status).toBe(200)
expect(data).toBe("OK")
})
it('return a version', async () => {
const { data, status } = await api.version.get(opts)
expect(status).toBe(200)
expect(data).toContain("version")
})
it('return a whitelist', async () => {
2025-02-19 13:09:53 -08:00
const seedWhitelist = async function clearWhitelist(p: string, f: string) {
const wlFile = Bun.file(p);
await wlFile.write(f)
}
await seedWhitelist(whitelistFilePath, fixture)
2025-02-15 04:31:20 -08:00
const { data, status } = await api.whitelist.get(opts)
expect(status).toBe(200)
2025-02-19 13:09:53 -08:00
expect(data).toContain("3aa5ad5e62eaffd148cff3dbe93ff2e1e9cbcf01")
2025-02-15 04:31:20 -08:00
})
2025-02-19 13:09:53 -08:00
it('expects the whitelist to already exist', async () => {
const whitelist = Bun.file(whitelistFilePath)
const whitelistExists = await whitelist.exists()
expect(whitelistExists).toBe(true)
})
2025-02-15 04:31:20 -08:00
2025-02-19 13:09:53 -08:00
it('appends a new info_hash to the whitelist file', async () => {
2025-02-15 04:31:20 -08:00
2025-02-19 13:09:53 -08:00
// make an api call which is supposed to add an entry to the whitelist
const { data, status } = await api.whitelist.post(fixture, opts)
2025-02-15 04:31:20 -08:00
2025-02-19 13:09:53 -08:00
// assert that the entry has been added to the whitelist
2025-02-15 04:31:20 -08:00
2025-02-19 13:09:53 -08:00
const w = Bun.file(whitelistFilePath)
const whitelistAfter = await w.text()
console.log('whitelistAfter as follows')
console.log(whitelistAfter)
expect(status).toBe(201)
expect(data).toMatch(fixture)
expect(whitelistAfter).toMatch(fixture)
2025-02-15 04:31:20 -08:00
})
2025-02-19 13:09:53 -08:00
// it('sends a SIGHUP to opentracker', async () => {
// const { data, status } = await api.whitelist.post(fixture, opts)
// const containerId = "act-ci-Tests-Checks-6e6f12196682961041a41a25b9d0dcf00e4d0f8e58f-7cb37eebfe9e1670328d58ad1f7c7bdf0fa078298ca6dd299e67d0141a4b9579"
// // await docker.getContainer(containerId).kill({ signal: 'SIGHUP' })
// let container = await docker.getContainer(containerId)
// container.inspect
// })
// // This is skipped because I couldn't figure out opentracker's whitelist add/delete via FIFO functionality.
// // I got as far as writing to the FIFO, and seeing opentracker acknowledge the line in it's logs.
// // Despite this, requests from qbittorrent to opentracker responded with,
// // "Requested download is not authorized for use with this tracker"
// // About a week on this problem, and I give up! Using the whitelist reloading strat instead.
// it.skip('writes a new info_hash to a fifo', async () => {
// const fifoFilePath = process.env.WL_FIFO_PATH!
// const fifo = Bun.file(fifoFilePath)
// const fifoExists = await fifo.exists();
// // create fifo if it doesn't exist
// if (!fifoExists) {
// await Bun.spawn(["mkfifo", fifoFilePath]).exited;
// }
// // Start a process to read from the FIFO
// const reader = Bun.spawn(["cat", fifoFilePath], { stdout: "pipe" });
// const { data, status } = await api.whitelist.post("3aa5ad5e62eaffd148cff3dbe93ff2e1e9cbcf01", opts)
// const text = await new Response(reader.stdout).text();
// expect(text).toBe("3aa5ad5e62eaffd148cff3dbe93ff2e1e9cbcf01\n")
// expect(status).toBe(200)
// expect(data).toBe("3aa5ad5e62eaffd148cff3dbe93ff2e1e9cbcf01")
// })
2025-02-15 04:31:20 -08:00
it('returns 401 when username/password is missing from GET /whitelist ', async () => {
const { status } = await api.whitelist.get()
expect(status).toBe(401)
})
it('returns 401 when username/password is missing from POST /whitelist ', async () => {
const { status } = await api.whitelist.post()
expect(status).toBe(401)
})
})