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)
})