mirror of
https://github.com/Azure/k8s-set-context.git
synced 2026-04-22 17:42:17 +08:00
* Migrate to ESM, esbuild, vitest, and update actions/* to latest - Update @actions/core to 3.x, @actions/exec to 3.x, @actions/io to 3.x - Replace @vercel/ncc + babel with esbuild (build.mjs) targeting Node 20 ESM - Replace jest/babel-jest/ts-jest with vitest and @vitest/coverage-v8 - Update tsconfig to NodeNext module resolution with strict mode - Add explicit .js extensions to all relative imports (NodeNext requirement) - Fix implicit any index signatures in parseCluster and parseMethod - Migrate all test files from jest to vi.mock/vi.mocked APIs - Fix ESM module spying limitations using vi.mock() at module level - Fix env var test pollution in default.test.ts with afterEach cleanup * remove build.mjs and update build script * update pkg lock * update pkg lock
183 lines
5.5 KiB
TypeScript
183 lines
5.5 KiB
TypeScript
import {vi, describe, test, expect, beforeEach, afterEach} from 'vitest'
|
|
import * as fs from 'fs'
|
|
import {getRequiredInputError} from '../../tests/util.js'
|
|
import {createKubeconfig, getDefaultKubeconfig} from './default.js'
|
|
|
|
describe('Default kubeconfig', () => {
|
|
test('it creates a kubeconfig with proper format', () => {
|
|
const certAuth = 'certAuth'
|
|
const token = 'token'
|
|
const clusterUrl = 'clusterUrl'
|
|
|
|
const kc = createKubeconfig(certAuth, token, clusterUrl)
|
|
const expected = JSON.stringify({
|
|
apiVersion: 'v1',
|
|
kind: 'Config',
|
|
clusters: [
|
|
{
|
|
name: 'default',
|
|
cluster: {
|
|
server: clusterUrl,
|
|
'certificate-authority-data': certAuth,
|
|
'insecure-skip-tls-verify': false
|
|
}
|
|
}
|
|
],
|
|
users: [{name: 'default-user', user: {token}}],
|
|
contexts: [
|
|
{
|
|
name: 'loaded-context',
|
|
context: {
|
|
cluster: 'default',
|
|
user: 'default-user',
|
|
name: 'loaded-context'
|
|
}
|
|
}
|
|
],
|
|
preferences: {},
|
|
'current-context': 'loaded-context'
|
|
})
|
|
expect(kc).toBe(expected)
|
|
})
|
|
|
|
test('it throws error without method', () => {
|
|
expect(() => getDefaultKubeconfig()).toThrow(
|
|
getRequiredInputError('method')
|
|
)
|
|
})
|
|
|
|
describe('default method', () => {
|
|
beforeEach(() => {
|
|
process.env['INPUT_METHOD'] = 'default'
|
|
})
|
|
|
|
afterEach(() => {
|
|
delete process.env['INPUT_KUBECONFIG']
|
|
delete process.env['INPUT_KUBECONFIG-ENCODING']
|
|
})
|
|
|
|
test('it throws error without kubeconfig', () => {
|
|
expect(() => getDefaultKubeconfig()).toThrow(
|
|
getRequiredInputError('kubeconfig')
|
|
)
|
|
})
|
|
|
|
test('it gets default config through kubeconfig input', () => {
|
|
const kc = 'example kc'
|
|
process.env['INPUT_KUBECONFIG'] = kc
|
|
|
|
expect(getDefaultKubeconfig()).toBe(kc)
|
|
})
|
|
|
|
test('returns kubeconfig as plaintext when encoding is plaintext', () => {
|
|
const kc = 'example kc'
|
|
process.env['INPUT_KUBECONFIG'] = kc
|
|
process.env['INPUT_KUBECONFIG-ENCODING'] = 'plaintext'
|
|
|
|
expect(getDefaultKubeconfig()).toBe(kc)
|
|
})
|
|
|
|
test('it gets default config through base64 kubeconfig input', () => {
|
|
const kc = 'example kc'
|
|
const base64Kc = Buffer.from(kc, 'utf-8').toString('base64')
|
|
process.env['INPUT_KUBECONFIG'] = base64Kc
|
|
process.env['INPUT_KUBECONFIG-ENCODING'] = 'base64'
|
|
|
|
expect(getDefaultKubeconfig()).toBe(kc)
|
|
})
|
|
|
|
test('it throws error for unknown kubeconfig-encoding', () => {
|
|
const kc = 'example kc'
|
|
process.env['INPUT_KUBECONFIG'] = kc
|
|
process.env['INPUT_KUBECONFIG-ENCODING'] = 'foobar'
|
|
|
|
expect(() => getDefaultKubeconfig()).toThrow(
|
|
"Invalid kubeconfig-encoding: 'foobar'. Must be 'plaintext' or 'base64'."
|
|
)
|
|
})
|
|
})
|
|
|
|
test('it defaults to default method', () => {
|
|
process.env['INPUT_METHOD'] = 'unknown'
|
|
|
|
const kc = 'example kc'
|
|
process.env['INPUT_KUBECONFIG'] = kc
|
|
|
|
expect(getDefaultKubeconfig()).toBe(kc)
|
|
})
|
|
|
|
test('it defaults to default method from service-principal', () => {
|
|
process.env['INPUT_METHOD'] = 'service-principal'
|
|
|
|
const kc = 'example kc'
|
|
process.env['INPUT_KUBECONFIG'] = kc
|
|
|
|
expect(getDefaultKubeconfig()).toBe(kc)
|
|
})
|
|
|
|
describe('service-account method', () => {
|
|
beforeEach(() => {
|
|
process.env['INPUT_METHOD'] = 'service-account'
|
|
})
|
|
|
|
test('it throws error without cluster url', () => {
|
|
expect(() => getDefaultKubeconfig()).toThrow(
|
|
getRequiredInputError('k8s-url')
|
|
)
|
|
})
|
|
|
|
test('it throws error without k8s secret', () => {
|
|
process.env['INPUT_K8S-URL'] = 'url'
|
|
|
|
expect(() => getDefaultKubeconfig()).toThrow(
|
|
getRequiredInputError('k8s-secret')
|
|
)
|
|
})
|
|
|
|
test('it gets kubeconfig through service-account', () => {
|
|
const k8sUrl = 'https://testing-dns-4za.hfp.earth.azmk8s.io:443'
|
|
const token = 'ZXlKaGJHY2lPcUpTVXpJMU5pSX='
|
|
const cert = 'LS0tLS1CRUdJTiBDRWyUSUZJQ'
|
|
const k8sSecret = fs.readFileSync('tests/sample-secret.yml').toString()
|
|
|
|
process.env['INPUT_K8S-URL'] = k8sUrl
|
|
process.env['INPUT_K8S-SECRET'] = k8sSecret
|
|
|
|
const expectedConfig = JSON.stringify({
|
|
apiVersion: 'v1',
|
|
kind: 'Config',
|
|
clusters: [
|
|
{
|
|
name: 'default',
|
|
cluster: {
|
|
server: k8sUrl,
|
|
'certificate-authority-data': cert,
|
|
'insecure-skip-tls-verify': false
|
|
}
|
|
}
|
|
],
|
|
users: [
|
|
{
|
|
name: 'default-user',
|
|
user: {token: Buffer.from(token, 'base64').toString()}
|
|
}
|
|
],
|
|
contexts: [
|
|
{
|
|
name: 'loaded-context',
|
|
context: {
|
|
cluster: 'default',
|
|
user: 'default-user',
|
|
name: 'loaded-context'
|
|
}
|
|
}
|
|
],
|
|
preferences: {},
|
|
'current-context': 'loaded-context'
|
|
})
|
|
|
|
expect(getDefaultKubeconfig()).toBe(expectedConfig)
|
|
})
|
|
})
|
|
})
|