Files
orca/src/shared/setup-script-shebang.test.ts
T

50 lines
2.4 KiB
TypeScript

import { describe, it, expect } from 'vitest'
import { parseSetupScriptShebang, stripLeadingShebangLine } from './setup-script-shebang'
describe('parseSetupScriptShebang', () => {
it('keeps the interpreter flags a script declares', () => {
// Launching bash path ignores shebang flags unless replayed with set; otherwise pipefail is lost.
expect(parseSetupScriptShebang('#!/usr/bin/env -S bash -euo pipefail\nmake')).toEqual({
interpreter: 'bash',
shellOptions: ['-euo', 'pipefail']
})
expect(parseSetupScriptShebang('#!/bin/bash -e -x\nmake')).toEqual({
interpreter: 'bash',
shellOptions: ['-e', '-x']
})
expect(parseSetupScriptShebang('#!/bin/sh\nmake')).toEqual({
interpreter: 'sh',
shellOptions: []
})
})
it('ignores interpreter arguments that `set` cannot apply', () => {
// Invocation-only flags make set exit 2; runner set -e would abort before setup starts.
expect(parseSetupScriptShebang('#!/bin/bash --norc\nmake')?.shellOptions).toEqual([])
expect(parseSetupScriptShebang('#!/bin/bash -l\nmake')?.shellOptions).toEqual([])
expect(parseSetupScriptShebang('#!/bin/bash -s\nmake')?.shellOptions).toEqual([])
expect(parseSetupScriptShebang('#!/bin/bash -i\nmake')?.shellOptions).toEqual([])
// Why: `-r` is accepted by `set` on some shells but silently restricts the rest of setup.
expect(parseSetupScriptShebang('#!/bin/bash -r\nmake')?.shellOptions).toEqual([])
expect(parseSetupScriptShebang('#!/bin/bash -ex -l\nmake')?.shellOptions).toEqual(['-ex'])
// Why: a bare `-o` would print the whole shell-option table into the setup terminal.
expect(parseSetupScriptShebang('#!/bin/bash -o\nmake')?.shellOptions).toEqual([])
expect(parseSetupScriptShebang('#!/bin/bash -euo\nmake')?.shellOptions).toEqual([])
expect(parseSetupScriptShebang('#!/bin/bash +o posix\nmake')?.shellOptions).toEqual([
'+o',
'posix'
])
})
})
describe('stripLeadingShebangLine', () => {
it('removes only a leading interpreter line', () => {
expect(stripLeadingShebangLine('#!/usr/bin/env bash\npnpm install\n')).toBe('pnpm install\n')
expect(stripLeadingShebangLine('#!/usr/bin/env bash\r\npnpm install')).toBe('pnpm install')
expect(stripLeadingShebangLine('pnpm install\n#!/usr/bin/env bash')).toBe(
'pnpm install\n#!/usr/bin/env bash'
)
expect(stripLeadingShebangLine('#!/usr/bin/env bash')).toBe('')
})
})