import { describe, expect, it } from 'bun:test'; import { parseResults } from './run-script'; // The line protocol between a setup script and the installer. Pure, so it is tested without spawning // anything — and worth testing precisely, because a script's output is interleaved with `docker // compose`'s and a loose parser would pick up things that merely look like results. describe('parseResults', () => { it('reads the values a script hands back', () => { const out = parseResults( [ '==> Starting', 'OFFICER_RESULT_URL=http://127.0.0.1:18091', 'OFFICER_RESULT_PATH=/transmission/rpc', '==> Done', ].join('\n'), ); expect(out).toEqual({ url: 'http://127.0.0.1:18091', path: '/transmission/rpc' }); }); it('ignores everything that is not a result line', () => { // The same stream is the user's live log. Narration must never be mistaken for a value. const out = parseResults( ['Container officer-transmission Started', 'note: OFFICER_RESULT_URL is printed at the end', ''].join('\n'), ); // The middle line MENTIONS the prefix but does not start with it, which is the realistic near-miss. expect(out).toEqual({}); }); it('keeps an empty value, because blank is a real answer', () => { // Transmission with no RPC auth returns exactly this, and it means "no username", which is // different from the key being absent. expect(parseResults('OFFICER_RESULT_USERNAME=')).toEqual({ username: '' }); }); it('keeps everything after the first `=`', () => { // Tokens and URLs contain `=`; splitting on every one would silently truncate a credential. expect(parseResults('OFFICER_RESULT_SECRET=abc=def==')).toEqual({ secret: 'abc=def==' }); }); it('lets a later line win', () => { // A script that reports twice has changed its mind — a retry inside it that finally worked. expect(parseResults(['OFFICER_RESULT_URL=http://first', 'OFFICER_RESULT_URL=http://second'].join('\n'))).toEqual({ url: 'http://second', }); }); it('skips a prefix with no assignment rather than storing a blank key', () => { // A script bug. Storing `{'': ''}` would look like a deliberate empty value downstream. expect(parseResults('OFFICER_RESULT_')).toEqual({}); expect(parseResults('OFFICER_RESULT_=novalue')).toEqual({}); }); it('tolerates indentation, since stderr lines arrive prefixed', () => { expect(parseResults(' OFFICER_RESULT_URL=http://x ')).toEqual({ url: 'http://x' }); }); });