123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- const {spawn} = require("child_process");
- const kill = require('tree-kill');
- let etapiAuthToken;
- const getEtapiAuthorizationHeader = () => "Basic " + Buffer.from(`etapi:${etapiAuthToken}`).toString('base64');
- const PORT = '9999';
- const HOST = 'http://localhost:' + PORT;
- function describeEtapi(description, specDefinitions) {
- describe(description, () => {
- let appProcess;
- beforeAll(async () => {
- appProcess = spawn('npm', ['run', 'start-test-server']);
- await new Promise(res => {
- appProcess.stdout.on('data', data => {
- console.log("Trilium: " + data.toString().trim());
- if (data.toString().includes('Listening on port')) {
- res();
- }
- });
- });
- await fetch(HOST + '/api/setup/new-document', { method: 'POST' });
- const formData = new URLSearchParams();
- formData.append('password1', '1234');
- formData.append('password2', '1234');
- await fetch(HOST + '/set-password', { method: 'POST', body: formData });
- etapiAuthToken = (await (await fetch(HOST + '/etapi/auth/login', {
- method: 'POST',
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({ password: '1234' })
- })).json()).authToken;
- });
- afterAll(() => {
- console.log("Attempting to kill the Trilium process as part of the cleanup...");
- kill(appProcess.pid, 'SIGKILL', () => { console.log("Trilium process killed.") });
- });
- specDefinitions();
- });
- }
- async function getEtapiResponse(url) {
- return await fetch(`${HOST}/etapi/${url}`, {
- method: 'GET',
- headers: {
- Authorization: getEtapiAuthorizationHeader()
- }
- });
- }
- async function getEtapi(url) {
- const response = await getEtapiResponse(url);
- return await processEtapiResponse(response);
- }
- async function getEtapiContent(url) {
- const response = await fetch(`${HOST}/etapi/${url}`, {
- method: 'GET',
- headers: {
- Authorization: getEtapiAuthorizationHeader()
- }
- });
- checkStatus(response);
- return response;
- }
- async function postEtapi(url, data = {}) {
- const response = await fetch(`${HOST}/etapi/${url}`, {
- method: 'POST',
- headers: {
- "Content-Type": "application/json",
- Authorization: getEtapiAuthorizationHeader()
- },
- body: JSON.stringify(data)
- });
- return await processEtapiResponse(response);
- }
- async function postEtapiContent(url, data) {
- const response = await fetch(`${HOST}/etapi/${url}`, {
- method: 'POST',
- headers: {
- "Content-Type": "application/octet-stream",
- Authorization: getEtapiAuthorizationHeader()
- },
- body: data
- });
- checkStatus(response);
- return response;
- }
- async function putEtapi(url, data = {}) {
- const response = await fetch(`${HOST}/etapi/${url}`, {
- method: 'PUT',
- headers: {
- "Content-Type": "application/json",
- Authorization: getEtapiAuthorizationHeader()
- },
- body: JSON.stringify(data)
- });
- return await processEtapiResponse(response);
- }
- async function putEtapiContent(url, data) {
- const response = await fetch(`${HOST}/etapi/${url}`, {
- method: 'PUT',
- headers: {
- "Content-Type": "application/octet-stream",
- Authorization: getEtapiAuthorizationHeader()
- },
- body: data
- });
- checkStatus(response);
- return response;
- }
- async function patchEtapi(url, data = {}) {
- const response = await fetch(`${HOST}/etapi/${url}`, {
- method: 'PATCH',
- headers: {
- "Content-Type": "application/json",
- Authorization: getEtapiAuthorizationHeader()
- },
- body: JSON.stringify(data)
- });
- return await processEtapiResponse(response);
- }
- async function deleteEtapi(url) {
- const response = await fetch(`${HOST}/etapi/${url}`, {
- method: 'DELETE',
- headers: {
- Authorization: getEtapiAuthorizationHeader()
- }
- });
- return await processEtapiResponse(response);
- }
- async function processEtapiResponse(response) {
- const text = await response.text();
- if (response.status < 200 || response.status >= 300) {
- throw new Error(`ETAPI error ${response.status}: ` + text);
- }
- return text?.trim() ? JSON.parse(text) : null;
- }
- function checkStatus(response) {
- if (response.status < 200 || response.status >= 300) {
- throw new Error(`ETAPI error ${response.status}`);
- }
- }
- module.exports = {
- describeEtapi,
- getEtapi,
- getEtapiResponse,
- getEtapiContent,
- postEtapi,
- postEtapiContent,
- putEtapi,
- putEtapiContent,
- patchEtapi,
- deleteEtapi
- };
|