import assert from 'node:assert/strict' import test from 'node:test' import { inferOperationFromPath, isMutatingMethod, normalizeAirtablePath, oauthConnectUrl, patSetupUrl, recordsPath, scopeForOperation, } from '../src/setup.ts' test('recordsPath encodes table names', () => { assert.equal(recordsPath('appExample', 'Table 1'), '/v0/appExample/Table%201') assert.equal( recordsPath('appExample', 'tblX', 'recY', 'comments'), '/v0/appExample/tblX/recY/comments', ) }) test('scopeForOperation maps write comments', () => { assert.equal(scopeForOperation('comments.write'), 'data.recordComments:write') assert.equal(scopeForOperation('whoami'), null) assert.equal(scopeForOperation('bases.read'), 'schema.bases:read') }) test('inferOperationFromPath classifies REST surfaces', () => { assert.equal(inferOperationFromPath('GET', '/v0/meta/whoami'), 'whoami') assert.equal(inferOperationFromPath('GET', '/v0/meta/bases'), 'bases.read') assert.equal( inferOperationFromPath('GET', '/v0/meta/bases/appX/tables'), 'tables.read', ) assert.equal(inferOperationFromPath('POST', '/v0/appX/tblY'), 'records.write') assert.equal( inferOperationFromPath('GET', '/v0/appX/tblY/recZ/comments'), 'comments.read', ) }) test('mutating methods', () => { assert.equal(isMutatingMethod('GET'), false) assert.equal(isMutatingMethod('POST'), true) assert.equal(isMutatingMethod('patch'), true) }) test('setup URLs are prefilled', () => { const connect = oauthConnectUrl('airtable') assert.match(connect, /^https:\/\/kody\.codes\/connect\/oauth\?/) assert.match(connect, /provider=airtable/) assert.match(connect, /authorizeUrl=https%3A%2F%2Fairtable.com/) assert.match(connect, /allowedHosts=api.airtable.com/) assert.match(connect, /tokenExchangeStyle=basic-form/) assert.match(connect, /data.records%3Aread/) const pat = patSetupUrl('airtablePat') assert.match(pat, /^https:\/\/kody\.codes\/account\/secrets\/new\?/) assert.match(pat, /name=airtablePat/) assert.match(pat, /allowedHosts=api.airtable.com/) }) test('normalizeAirtablePath stays on api.airtable.com', () => { assert.equal(normalizeAirtablePath('/meta/whoami'), '/v0/meta/whoami') assert.equal( normalizeAirtablePath('https://api.airtable.com/v0/meta/bases'), '/v0/meta/bases', ) assert.throws(() => normalizeAirtablePath('https://example.com/v0/meta/bases')) })