import assert from 'node:assert/strict' import test from 'node:test' import { toAdf, adfToPlainText } from '../src/adf.js' import { accountSuffix, emailSecretUrl, normalizeSite, oauthConnectUrl, resolveAccount, secretNamesForAccount, setupUrls, siteHost, tokenSecretUrl, } from '../src/setup.js' test('resolveAccount accepts jira and jira-* only', () => { assert.equal(resolveAccount({}), 'jira') assert.equal(resolveAccount({ account: 'jira-work' }), 'jira-work') assert.equal(resolveAccount({ integrationName: 'jira-personal' }), 'jira-personal') assert.throws(() => resolveAccount({ account: 'work' }), /invalid/) assert.throws(() => resolveAccount({ account: 'PROJ' }), /invalid/) assert.throws(() => resolveAccount({ account: 'personal' }), /invalid/) }) test('secret names follow jira / jira-*', () => { assert.deepEqual(secretNamesForAccount('jira'), { emailSecret: 'jiraEmail', tokenSecret: 'jiraApiToken', }) assert.deepEqual(secretNamesForAccount('jira-work'), { emailSecret: 'jiraEmail-work', tokenSecret: 'jiraApiToken-work', }) assert.equal(accountSuffix('jira'), '') assert.equal(accountSuffix('jira-work'), '-work') }) test('normalizeSite accepts handle or atlassian.net host', () => { assert.equal(normalizeSite('acme'), 'acme') assert.equal(normalizeSite('https://acme.atlassian.net/jira'), 'acme') assert.equal(normalizeSite('ACME.atlassian.net'), 'acme') assert.equal(siteHost('acme'), 'acme.atlassian.net') assert.throws(() => normalizeSite('jira.example.com'), /Atlassian Cloud/) assert.throws(() => siteHost(''), /requires site/) }) test('setup URLs are prefilled and generic', () => { const setup = setupUrls({ account: 'jira-work', site: 'acme' }) assert.equal(setup.account, 'jira-work') assert.match(setup.oauthUrl, /^https:\/\/kody\.codes\/connect\/oauth\?/) assert.match(setup.oauthUrl, /provider=jira-work/) assert.match(setup.oauthUrl, /auth\.atlassian\.com/) assert.match(setup.oauthUrl, /api\.atlassian\.com/) assert.match(setup.oauthUrl, /audience/) assert.match(setup.emailSecretUrl, /name=jiraEmail-work/) assert.match(setup.tokenSecretUrl, /name=jiraApiToken-work/) assert.match(setup.emailSecretUrl, /allowedHosts=acme\.atlassian\.net/) assert.equal(setup.tokenHost, 'acme.atlassian.net') assert.doesNotMatch(JSON.stringify(setup), /kent/i) assert.doesNotMatch(JSON.stringify(setup), /KODY-/) }) test('oauth connect URL includes Atlassian 3LO extras', () => { const url = oauthConnectUrl('jira') const parsed = new URL(url) assert.equal(parsed.origin + parsed.pathname, 'https://kody.codes/connect/oauth') assert.equal(parsed.searchParams.get('provider'), 'jira') assert.equal(parsed.searchParams.get('authorizeUrl'), 'https://auth.atlassian.com/authorize') assert.equal(parsed.searchParams.get('tokenUrl'), 'https://auth.atlassian.com/oauth/token') assert.equal(parsed.searchParams.get('flow'), 'confidential') assert.match(parsed.searchParams.get('scopes') ?? '', /offline_access/) assert.match(parsed.searchParams.get('scopes') ?? '', /read:jira-work/) assert.match(parsed.searchParams.get('scopes') ?? '', /write:jira-work/) const extra = JSON.parse(parsed.searchParams.get('extraAuthorizeParams') ?? '{}') assert.equal(extra.audience, 'api.atlassian.com') assert.equal(extra.prompt, 'consent') assert.equal(parsed.searchParams.get('redirectUri'), null) }) test('secret URLs never ask for a pasted value', () => { assert.match(emailSecretUrl('jira'), /\/account\/secrets\/new/) assert.match(tokenSecretUrl('jira'), /\/account\/secrets\/new/) }) test('toAdf converts text and passes ADF through', () => { const doc = toAdf('Hello\nWorld') assert.equal(doc.type, 'doc') assert.equal(doc.version, 1) assert.equal(doc.content[0].content[0].text, 'Hello') assert.equal(doc.content[1].content[0].text, 'World') assert.equal(adfToPlainText(doc), 'Hello\nWorld') assert.equal(toAdf(doc), doc) })