Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/jira

test/setup.test.js

93 lines · 3.8 KB · JavaScript
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)
})