Files
2026-07-13 12:46:20 +08:00

369 lines
15 KiB
JavaScript

/**
* Unit tests for npm/install.js
* Tests that correct download patterns are selected for different OS/arch combinations
*/
/* eslint-env jest */
/* global describe, it, expect, beforeAll */
const https = require('https')
const {
isWindows7OrEarlier,
isMacOS10,
isLinuxLegacy,
getDownloadPattern
} = require('../../npm/install')
// Cache for version - fetched once from electerm website
let cachedVersion = null
async function getVersion () {
if (cachedVersion) {
return cachedVersion
}
cachedVersion = await new Promise((resolve, reject) => {
https.get('https://electerm.org/version.html', (res) => {
let data = ''
res.on('data', chunk => { data += chunk })
res.on('end', () => resolve(data.trim().replace('v', '')))
res.on('error', reject)
}).on('error', reject)
})
return cachedVersion
}
// Fetch version once before all tests
beforeAll(async () => {
await getVersion()
})
describe('npm/install.js', () => {
describe('isWindows7OrEarlier', () => {
it('should return false for non-Windows platforms', () => {
expect(isWindows7OrEarlier('darwin', '21.0.0')).toBe(false)
expect(isWindows7OrEarlier('linux', '5.4.0')).toBe(false)
})
it('should return true for Windows 7 (NT 6.1)', () => {
expect(isWindows7OrEarlier('win32', '6.1.7601')).toBe(true)
})
it('should return true for Windows Vista (NT 6.0)', () => {
expect(isWindows7OrEarlier('win32', '6.0.6000')).toBe(true)
})
it('should return true for Windows XP (NT 5.1)', () => {
expect(isWindows7OrEarlier('win32', '5.1.2600')).toBe(true)
})
it('should return false for Windows 8 (NT 6.2)', () => {
expect(isWindows7OrEarlier('win32', '6.2.9200')).toBe(false)
})
it('should return false for Windows 8.1 (NT 6.3)', () => {
expect(isWindows7OrEarlier('win32', '6.3.9600')).toBe(false)
})
it('should return false for Windows 10 (NT 10.0)', () => {
expect(isWindows7OrEarlier('win32', '10.0.19041')).toBe(false)
})
it('should return false for Windows 11 (NT 10.0)', () => {
expect(isWindows7OrEarlier('win32', '10.0.22000')).toBe(false)
})
})
describe('isMacOS10', () => {
it('should return false for non-macOS platforms', () => {
expect(isMacOS10('win32', '10.0.19041')).toBe(false)
expect(isMacOS10('linux', '5.4.0')).toBe(false)
})
it('should return true for macOS 10.15 Catalina (Darwin 19.x)', () => {
expect(isMacOS10('darwin', '19.6.0')).toBe(true)
})
it('should return true for macOS 10.14 Mojave (Darwin 18.x)', () => {
expect(isMacOS10('darwin', '18.7.0')).toBe(true)
})
it('should return true for macOS 10.13 High Sierra (Darwin 17.x)', () => {
expect(isMacOS10('darwin', '17.7.0')).toBe(true)
})
it('should return false for macOS 11 Big Sur (Darwin 20.x)', () => {
expect(isMacOS10('darwin', '20.6.0')).toBe(false)
})
it('should return false for macOS 12 Monterey (Darwin 21.x)', () => {
expect(isMacOS10('darwin', '21.6.0')).toBe(false)
})
it('should return false for macOS 13 Ventura (Darwin 22.x)', () => {
expect(isMacOS10('darwin', '22.1.0')).toBe(false)
})
it('should return false for macOS 14 Sonoma (Darwin 23.x)', () => {
expect(isMacOS10('darwin', '23.0.0')).toBe(false)
})
})
describe('isLinuxLegacy', () => {
it('should return false for non-Linux platforms', () => {
expect(isLinuxLegacy('win32', 2.31)).toBe(false)
expect(isLinuxLegacy('darwin', 2.31)).toBe(false)
})
it('should return true for glibc < 2.34', () => {
expect(isLinuxLegacy('linux', 2.31)).toBe(true)
expect(isLinuxLegacy('linux', 2.17)).toBe(true)
expect(isLinuxLegacy('linux', 2.33)).toBe(true)
})
it('should return false for glibc >= 2.34', () => {
expect(isLinuxLegacy('linux', 2.34)).toBe(false)
expect(isLinuxLegacy('linux', 2.35)).toBe(false)
expect(isLinuxLegacy('linux', 2.38)).toBe(false)
})
})
describe('getDownloadPattern', () => {
describe('Windows', () => {
it('should return win-x64 pattern for Windows x64', () => {
const result = getDownloadPattern('win32', 'x64', {})
expect(result.type).toBe('win-x64')
expect(result.pattern.test('electerm-2.3.151-win-x64.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-win-arm64.tar.gz')).toBe(false)
})
it('should return win-arm64 pattern for Windows arm64', () => {
const result = getDownloadPattern('win32', 'arm64', {})
expect(result.type).toBe('win-arm64')
expect(result.pattern.test('electerm-2.3.151-win-arm64.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-win-x64.tar.gz')).toBe(false)
})
it('should return win7 pattern for Windows 7', () => {
const result = getDownloadPattern('win32', 'x64', { win7: true })
expect(result.type).toBe('win7')
expect(result.pattern.test('electerm-2.3.151-win7.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-win-x64.tar.gz')).toBe(false)
})
it('should prefer win7 over arm64 when win7 flag is set', () => {
const result = getDownloadPattern('win32', 'arm64', { win7: true })
expect(result.type).toBe('win7')
})
})
describe('macOS', () => {
it('should return mac-x64 pattern for macOS x64', () => {
const result = getDownloadPattern('darwin', 'x64', {})
expect(result.type).toBe('mac-x64')
expect(result.pattern.test('electerm-2.3.151-mac-x64.dmg')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-mac-arm64.dmg')).toBe(false)
})
it('should return mac-arm64 pattern for macOS arm64 (Apple Silicon)', () => {
const result = getDownloadPattern('darwin', 'arm64', {})
expect(result.type).toBe('mac-arm64')
expect(result.pattern.test('electerm-2.3.151-mac-arm64.dmg')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-mac-x64.dmg')).toBe(false)
})
it('should return mac10-x64 pattern for macOS 10.x', () => {
const result = getDownloadPattern('darwin', 'x64', { mac10: true })
expect(result.type).toBe('mac10-x64')
expect(result.pattern.test('electerm-2.3.151-mac10-x64.dmg')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-mac-x64.dmg')).toBe(false)
})
it('should prefer mac10 over arm64 when mac10 flag is set', () => {
const result = getDownloadPattern('darwin', 'arm64', { mac10: true })
expect(result.type).toBe('mac10-x64')
})
})
describe('Linux', () => {
it('should return linux-x64 pattern for Linux x64', () => {
const result = getDownloadPattern('linux', 'x64', {})
expect(result.type).toBe('linux-x64')
expect(result.pattern.test('electerm-2.3.151-linux-x64.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-linux-x64-legacy.tar.gz')).toBe(false)
})
it('should return linux-arm64 pattern for Linux arm64', () => {
const result = getDownloadPattern('linux', 'arm64', {})
expect(result.type).toBe('linux-arm64')
expect(result.pattern.test('electerm-2.3.151-linux-arm64.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-linux-arm64-legacy.tar.gz')).toBe(false)
})
it('should return linux-armv7l pattern for Linux arm', () => {
const result = getDownloadPattern('linux', 'arm', {})
expect(result.type).toBe('linux-armv7l')
expect(result.pattern.test('electerm-2.3.151-linux-armv7l.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-linux-armv7l-legacy.tar.gz')).toBe(false)
})
it('should return linux-x64-legacy pattern for Linux x64 with old glibc', () => {
const result = getDownloadPattern('linux', 'x64', { linuxLegacy: true })
expect(result.type).toBe('linux-x64-legacy')
expect(result.pattern.test('electerm-2.3.151-linux-x64-legacy.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-linux-x64.tar.gz')).toBe(false)
})
it('should return linux-arm64-legacy pattern for Linux arm64 with old glibc', () => {
const result = getDownloadPattern('linux', 'arm64', { linuxLegacy: true })
expect(result.type).toBe('linux-arm64-legacy')
expect(result.pattern.test('electerm-2.3.151-linux-arm64-legacy.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-linux-arm64.tar.gz')).toBe(false)
})
it('should return linux-armv7l-legacy pattern for Linux arm with old glibc', () => {
const result = getDownloadPattern('linux', 'arm', { linuxLegacy: true })
expect(result.type).toBe('linux-armv7l-legacy')
expect(result.pattern.test('electerm-2.3.151-linux-armv7l-legacy.tar.gz')).toBe(true)
expect(result.pattern.test('electerm-2.3.151-linux-armv7l.tar.gz')).toBe(false)
})
})
describe('Unsupported platforms', () => {
it('should return unsupported for unknown platforms', () => {
const result = getDownloadPattern('freebsd', 'x64', {})
expect(result.type).toBe('unsupported')
expect(result.pattern).toBe(null)
})
it('should return unsupported for aix', () => {
const result = getDownloadPattern('aix', 'ppc64', {})
expect(result.type).toBe('unsupported')
})
})
})
describe('Pattern matching with actual release filenames', () => {
// Release files with current version from website
let releaseFiles = []
beforeAll(() => {
const v = cachedVersion
releaseFiles = [
`electerm-${v}-linux-aarch64-legacy.rpm`,
`electerm-${v}-linux-aarch64.rpm`,
`electerm-${v}-linux-amd64-legacy.deb`,
`electerm-${v}-linux-amd64.deb`,
`electerm-${v}-linux-amd64.snap`,
`electerm-${v}-linux-arm64-legacy.AppImage`,
`electerm-${v}-linux-arm64-legacy.deb`,
`electerm-${v}-linux-arm64-legacy.tar.gz`,
`electerm-${v}-linux-arm64.AppImage`,
`electerm-${v}-linux-arm64.deb`,
`electerm-${v}-linux-arm64.tar.gz`,
`electerm-${v}-linux-armv7l-legacy.AppImage`,
`electerm-${v}-linux-armv7l-legacy.deb`,
`electerm-${v}-linux-armv7l-legacy.rpm`,
`electerm-${v}-linux-armv7l-legacy.tar.gz`,
`electerm-${v}-linux-armv7l.AppImage`,
`electerm-${v}-linux-armv7l.deb`,
`electerm-${v}-linux-armv7l.rpm`,
`electerm-${v}-linux-armv7l.tar.gz`,
`electerm-${v}-linux-x64-legacy.tar.gz`,
`electerm-${v}-linux-x64.tar.gz`,
`electerm-${v}-linux-x86_64-legacy.AppImage`,
`electerm-${v}-linux-x86_64-legacy.rpm`,
`electerm-${v}-linux-x86_64.AppImage`,
`electerm-${v}-linux-x86_64.rpm`,
`electerm-${v}-mac-arm64.dmg`,
`electerm-${v}-mac-arm64.dmg.blockmap`,
`electerm-${v}-mac-x64.dmg`,
`electerm-${v}-mac-x64.dmg.blockmap`,
`electerm-${v}-mac10-x64.dmg`,
`electerm-${v}-mac10-x64.dmg.blockmap`,
`electerm-${v}-win-arm64-installer.exe`,
`electerm-${v}-win-arm64-installer.exe.blockmap`,
`electerm-${v}-win-arm64.tar.gz`,
`electerm-${v}-win-x64-installer.exe`,
`electerm-${v}-win-x64-installer.exe.blockmap`,
`electerm-${v}-win-x64-loose.tar.gz`,
`electerm-${v}-win-x64-portable.tar.gz`,
`electerm-${v}-win-x64.appx`,
`electerm-${v}-win-x64.tar.gz`,
`electerm-${v}-win7.tar.gz`
]
})
it('should match exactly one tar.gz file for win-x64', () => {
const { pattern } = getDownloadPattern('win32', 'x64', {})
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-win-x64.tar.gz`])
})
it('should match exactly one tar.gz file for win-arm64', () => {
const { pattern } = getDownloadPattern('win32', 'arm64', {})
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-win-arm64.tar.gz`])
})
it('should match exactly one tar.gz file for win7', () => {
const { pattern } = getDownloadPattern('win32', 'x64', { win7: true })
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-win7.tar.gz`])
})
it('should match exactly one dmg file for mac-x64', () => {
const { pattern } = getDownloadPattern('darwin', 'x64', {})
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-mac-x64.dmg`])
})
it('should match exactly one dmg file for mac-arm64', () => {
const { pattern } = getDownloadPattern('darwin', 'arm64', {})
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-mac-arm64.dmg`])
})
it('should match exactly one dmg file for mac10-x64', () => {
const { pattern } = getDownloadPattern('darwin', 'x64', { mac10: true })
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-mac10-x64.dmg`])
})
it('should match exactly one tar.gz file for linux-x64', () => {
const { pattern } = getDownloadPattern('linux', 'x64', {})
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-linux-x64.tar.gz`])
})
it('should match exactly one tar.gz file for linux-x64-legacy', () => {
const { pattern } = getDownloadPattern('linux', 'x64', { linuxLegacy: true })
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-linux-x64-legacy.tar.gz`])
})
it('should match exactly one tar.gz file for linux-arm64', () => {
const { pattern } = getDownloadPattern('linux', 'arm64', {})
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-linux-arm64.tar.gz`])
})
it('should match exactly one tar.gz file for linux-arm64-legacy', () => {
const { pattern } = getDownloadPattern('linux', 'arm64', { linuxLegacy: true })
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-linux-arm64-legacy.tar.gz`])
})
it('should match exactly one tar.gz file for linux-armv7l', () => {
const { pattern } = getDownloadPattern('linux', 'arm', {})
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-linux-armv7l.tar.gz`])
})
it('should match exactly one tar.gz file for linux-armv7l-legacy', () => {
const { pattern } = getDownloadPattern('linux', 'arm', { linuxLegacy: true })
const matches = releaseFiles.filter(f => pattern.test(f))
expect(matches).toEqual([`electerm-${cachedVersion}-linux-armv7l-legacy.tar.gz`])
})
})
})