chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
import { assert, test, describe, vi, afterEach } from 'vitest'
|
||||
import { ApiClient, validateApiKey } from '../../src/api'
|
||||
import { ConnectionConfig } from '../../src/connectionConfig'
|
||||
import { AuthenticationError } from '../../src/errors'
|
||||
|
||||
describe('validateApiKey', () => {
|
||||
const validKey = 'e2b_' + '0123456789abcdef'.repeat(2) + '01234567'
|
||||
|
||||
test('accepts a well-formed key', () => {
|
||||
assert.doesNotThrow(() => validateApiKey(validKey))
|
||||
})
|
||||
|
||||
test('rejects a key without the e2b_ prefix', () => {
|
||||
assert.throws(
|
||||
() => validateApiKey('sk_' + '0'.repeat(40)),
|
||||
AuthenticationError,
|
||||
/Invalid API key format/
|
||||
)
|
||||
})
|
||||
|
||||
test('accepts a key with a non-default body length', () => {
|
||||
assert.doesNotThrow(() => validateApiKey('e2b_' + '0'.repeat(20)))
|
||||
})
|
||||
|
||||
test('rejects an empty body after the prefix', () => {
|
||||
assert.throws(
|
||||
() => validateApiKey('e2b_'),
|
||||
AuthenticationError,
|
||||
/Invalid API key format/
|
||||
)
|
||||
})
|
||||
|
||||
test('rejects a key with non-hex characters in the body', () => {
|
||||
assert.throws(
|
||||
() => validateApiKey('e2b_' + 'z'.repeat(40)),
|
||||
AuthenticationError,
|
||||
/Invalid API key format/
|
||||
)
|
||||
})
|
||||
|
||||
test('error message includes an example token', () => {
|
||||
try {
|
||||
validateApiKey('nope')
|
||||
assert.fail('expected validateApiKey to throw')
|
||||
} catch (err) {
|
||||
assert.instanceOf(err, AuthenticationError)
|
||||
assert.match(
|
||||
(err as Error).message,
|
||||
/e2b_0{40}/,
|
||||
'expected example token in error message'
|
||||
)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('ApiClient API key validation', () => {
|
||||
test('throws on a malformed key by default', () => {
|
||||
const config = new ConnectionConfig({ apiKey: 'not-a-valid-key' })
|
||||
assert.throws(() => new ApiClient(config), AuthenticationError)
|
||||
})
|
||||
|
||||
test('skips validation when validateApiKey is false', () => {
|
||||
const config = new ConnectionConfig({
|
||||
apiKey: 'not-a-valid-key',
|
||||
validateApiKey: false,
|
||||
})
|
||||
assert.doesNotThrow(() => new ApiClient(config))
|
||||
})
|
||||
})
|
||||
|
||||
describe('ApiClient API key requirement', () => {
|
||||
afterEach(() => {
|
||||
vi.unstubAllEnvs()
|
||||
})
|
||||
|
||||
test('throws when no API key is supplied', () => {
|
||||
vi.stubEnv('E2B_API_KEY', '')
|
||||
const config = new ConnectionConfig({})
|
||||
assert.throws(
|
||||
() => new ApiClient(config),
|
||||
AuthenticationError,
|
||||
/API key is required/
|
||||
)
|
||||
})
|
||||
|
||||
test('does not require an API key when requireApiKey is false', () => {
|
||||
vi.stubEnv('E2B_API_KEY', '')
|
||||
const config = new ConnectionConfig({})
|
||||
assert.doesNotThrow(() => new ApiClient(config, { requireApiKey: false }))
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user