mirror of
https://github.com/Dictionarry-Hub/profilarr.git
synced 2026-06-18 02:08:46 -04:00
159 lines
5.0 KiB
TypeScript
159 lines
5.0 KiB
TypeScript
/**
|
|
* PCD write tests: media settings create (radarr + sonarr).
|
|
*/
|
|
|
|
import { assert, assertEquals } from '@std/assert';
|
|
import { startServer, stopServer } from '$test-harness/server.ts';
|
|
import { run, setup, teardown, test } from '$test-harness/runner.ts';
|
|
import { PORTS } from '$test-harness/ports.ts';
|
|
import { base } from '../../harness/fixtures.ts';
|
|
import {
|
|
compilePcd,
|
|
normalizeSql,
|
|
opCheckpoint,
|
|
parseDesiredState,
|
|
parseMetadata
|
|
} from '../../harness/pcd.ts';
|
|
import { write } from '../../harness/write.ts';
|
|
import {
|
|
assertActionFailed,
|
|
createScenarioFactory,
|
|
entityForArrType,
|
|
MEDIA_SETTINGS_ARR_TYPES,
|
|
tableForArrType,
|
|
userOpsSince
|
|
} from './helpers.ts';
|
|
|
|
const PORT = PORTS.pcd.writeMediaSettingsCreate;
|
|
const ORIGIN = `http://localhost:${PORT}`;
|
|
|
|
const { newPcd, seededPcd } = createScenarioFactory(PORT, 'pcd-write-media-settings-create');
|
|
|
|
setup(async () => {
|
|
await startServer(PORT, { AUTH: 'off', ORIGIN }, 'preview');
|
|
});
|
|
|
|
teardown(async () => {
|
|
await stopServer(PORT);
|
|
});
|
|
|
|
/**
|
|
* Context
|
|
* Empty PCD (only schema seeded), compiled once.
|
|
*
|
|
* Submit (per arr-type)
|
|
* POST /media-management/{ctx.dbId}/media-settings/new with form fields:
|
|
* arrType = 'radarr' | 'sonarr'
|
|
* name = 'Created Media'
|
|
* propersRepacks = 'doNotPrefer'
|
|
* enableMediaInfo = 'false'
|
|
* layer = 'user'
|
|
*
|
|
* Expect
|
|
* - userOpsSince(checkpoint).length === 1
|
|
* - op.metadata.operation === 'create'
|
|
* - op.metadata.entity === '<arrType>_media_settings'
|
|
* - op.metadata.name === 'Created Media'
|
|
* - op.desired_state.name === 'Created Media'
|
|
* - op.desired_state.propers_repacks === 'doNotPrefer'
|
|
* - op.desired_state.enable_media_info === false
|
|
* - op.sql matches /insert into "?<arrType>_media_settings"?/i
|
|
*/
|
|
for (const arrType of MEDIA_SETTINGS_ARR_TYPES) {
|
|
test(`minimal ${arrType} media settings emits one create op`, async () => {
|
|
const ctx = await newPcd(`minimal-${arrType}`);
|
|
await compilePcd(ctx);
|
|
const checkpoint = opCheckpoint(ctx);
|
|
|
|
await write.mediaSettings.create(ctx, arrType, { name: 'Created Media' });
|
|
|
|
const ops = userOpsSince(ctx, checkpoint);
|
|
assertEquals(ops.length, 1);
|
|
const op = ops[0];
|
|
const metadata = parseMetadata(op);
|
|
assertEquals(metadata.operation, 'create');
|
|
assertEquals(metadata.entity, entityForArrType(arrType));
|
|
assertEquals(metadata.name, 'Created Media');
|
|
const desired = parseDesiredState(op);
|
|
assertEquals(desired.name, 'Created Media');
|
|
assertEquals(desired.propers_repacks, 'doNotPrefer');
|
|
assertEquals(desired.enable_media_info, false);
|
|
const sql = normalizeSql(op.sql);
|
|
const insertPattern = new RegExp(`insert into "?${tableForArrType(arrType)}"?`, 'i');
|
|
assert(insertPattern.test(sql));
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Context (per arr-type)
|
|
* Empty PCD (only schema seeded), compiled once.
|
|
*
|
|
* Submit
|
|
* POST /media-management/{ctx.dbId}/media-settings/new with form fields:
|
|
* arrType = 'radarr' | 'sonarr'
|
|
* name = 'Tuned Media'
|
|
* propersRepacks = 'preferAndUpgrade'
|
|
* enableMediaInfo = 'true'
|
|
* layer = 'user'
|
|
*
|
|
* Expect
|
|
* - userOpsSince(checkpoint).length === 1
|
|
* - op.desired_state.propers_repacks === 'preferAndUpgrade'
|
|
* - op.desired_state.enable_media_info === true
|
|
*/
|
|
for (const arrType of MEDIA_SETTINGS_ARR_TYPES) {
|
|
test(`${arrType} media settings non-default values are recorded`, async () => {
|
|
const ctx = await newPcd(`tuned-${arrType}`);
|
|
await compilePcd(ctx);
|
|
const checkpoint = opCheckpoint(ctx);
|
|
|
|
await write.mediaSettings.create(ctx, arrType, {
|
|
name: 'Tuned Media',
|
|
propersRepacks: 'preferAndUpgrade',
|
|
enableMediaInfo: true
|
|
});
|
|
|
|
const ops = userOpsSince(ctx, checkpoint);
|
|
assertEquals(ops.length, 1);
|
|
const desired = parseDesiredState(ops[0]);
|
|
assertEquals(desired.propers_repacks, 'preferAndUpgrade');
|
|
assertEquals(desired.enable_media_info, true);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Context (per arr-type)
|
|
* Base layer seeded with a row named 'Existing Media' for the arr-type.
|
|
* Compiled.
|
|
*
|
|
* Submit
|
|
* POST /media-management/{ctx.dbId}/media-settings/new with form fields:
|
|
* arrType = 'radarr' | 'sonarr'
|
|
* name = 'existing media' // lowercase duplicate
|
|
* layer = 'user'
|
|
*
|
|
* Expect
|
|
* - response.status >= 400 OR body contains '"type":"failure"'
|
|
* - userOpsSince(checkpoint).length === 0
|
|
*/
|
|
for (const arrType of MEDIA_SETTINGS_ARR_TYPES) {
|
|
test(`duplicate ${arrType} media settings name fails without writing ops`, async () => {
|
|
const seed =
|
|
arrType === 'radarr'
|
|
? base.radarrMediaSettings({ name: 'Existing Media' })
|
|
: base.sonarrMediaSettings({ name: 'Existing Media' });
|
|
|
|
const ctx = await seededPcd(`duplicate-${arrType}`, [seed]);
|
|
const checkpoint = opCheckpoint(ctx);
|
|
|
|
const response = await write.mediaSettings.submitCreate(ctx, arrType, {
|
|
name: 'existing media'
|
|
});
|
|
|
|
await assertActionFailed(response);
|
|
assertEquals(userOpsSince(ctx, checkpoint).length, 0);
|
|
});
|
|
}
|
|
|
|
await run();
|