const path = require('path') const fs = require('fs-plus') const temp = require('temp').track() const CommandInstaller = require('../src/command-installer') describe('CommandInstaller on #darwin', () => { let installer, resourcesPath, installationPath, atomBinPath, apmBinPath beforeEach(() => { installationPath = temp.mkdirSync('atom-bin') resourcesPath = temp.mkdirSync('atom-app') atomBinPath = path.join(resourcesPath, 'app', 'atom.sh') apmBinPath = path.join(resourcesPath, 'app', 'apm', 'node_modules', '.bin', 'apm') fs.writeFileSync(atomBinPath, '') fs.writeFileSync(apmBinPath, '') fs.chmodSync(atomBinPath, '755') fs.chmodSync(apmBinPath, '755') spyOn(CommandInstaller.prototype, 'getResourcesDirectory').andReturn(resourcesPath) spyOn(CommandInstaller.prototype, 'getInstallDirectory').andReturn(installationPath) }) afterEach(() => { try { temp.cleanupSync() } catch (error) {} }) it('shows an error dialog when installing commands interactively fails', () => { const appDelegate = jasmine.createSpyObj('appDelegate', ['confirm']) installer = new CommandInstaller(appDelegate) installer.initialize('2.0.2') spyOn(installer, 'installAtomCommand').andCallFake((__, callback) => callback(new Error('an error'))) installer.installShellCommandsInteractively() expect(appDelegate.confirm).toHaveBeenCalledWith({ message: 'Failed to install shell commands', detailedMessage: 'an error' }) appDelegate.confirm.reset() installer.installAtomCommand.andCallFake((__, callback) => callback()) spyOn(installer, 'installApmCommand').andCallFake((__, callback) => callback(new Error('another error'))) installer.installShellCommandsInteractively() expect(appDelegate.confirm).toHaveBeenCalledWith({ message: 'Failed to install shell commands', detailedMessage: 'another error' }) }) it('shows a success dialog when installing commands interactively succeeds', () => { const appDelegate = jasmine.createSpyObj('appDelegate', ['confirm']) installer = new CommandInstaller(appDelegate) installer.initialize('2.0.2') spyOn(installer, 'installAtomCommand').andCallFake((__, callback) => callback()) spyOn(installer, 'installApmCommand').andCallFake((__, callback) => callback()) installer.installShellCommandsInteractively() expect(appDelegate.confirm).toHaveBeenCalledWith({ message: 'Commands installed.', detailedMessage: 'The shell commands `atom` and `apm` are installed.' }) }) describe('when using a stable version of atom', () => { beforeEach(() => { installer = new CommandInstaller() installer.initialize('2.0.2') }) it("symlinks the atom command as 'atom'", () => { const installedAtomPath = path.join(installationPath, 'atom') expect(fs.isFileSync(installedAtomPath)).toBeFalsy() waitsFor(done => { installer.installAtomCommand(false, error => { expect(error).toBeNull() expect(fs.realpathSync(installedAtomPath)).toBe(fs.realpathSync(atomBinPath)) expect(fs.isExecutableSync(installedAtomPath)).toBe(true) expect(fs.isFileSync(path.join(installationPath, 'atom-beta'))).toBe(false) done() }) }) }) it("symlinks the apm command as 'apm'", () => { const installedApmPath = path.join(installationPath, 'apm') expect(fs.isFileSync(installedApmPath)).toBeFalsy() waitsFor(done => { installer.installApmCommand(false, error => { expect(error).toBeNull() expect(fs.realpathSync(installedApmPath)).toBe(fs.realpathSync(apmBinPath)) expect(fs.isExecutableSync(installedApmPath)).toBeTruthy() expect(fs.isFileSync(path.join(installationPath, 'apm-beta'))).toBe(false) done() }) }) }) }) describe('when using a beta version of atom', () => { beforeEach(() => { installer = new CommandInstaller() installer.initialize('2.2.0-beta.0') }) it("symlinks the atom command as 'atom-beta'", () => { const installedAtomPath = path.join(installationPath, 'atom-beta') expect(fs.isFileSync(installedAtomPath)).toBeFalsy() waitsFor(done => { installer.installAtomCommand(false, error => { expect(error).toBeNull() expect(fs.realpathSync(installedAtomPath)).toBe(fs.realpathSync(atomBinPath)) expect(fs.isExecutableSync(installedAtomPath)).toBe(true) expect(fs.isFileSync(path.join(installationPath, 'atom'))).toBe(false) done() }) }) }) it("symlinks the apm command as 'apm-beta'", () => { const installedApmPath = path.join(installationPath, 'apm-beta') expect(fs.isFileSync(installedApmPath)).toBeFalsy() waitsFor(done => { installer.installApmCommand(false, error => { expect(error).toBeNull() expect(fs.realpathSync(installedApmPath)).toBe(fs.realpathSync(apmBinPath)) expect(fs.isExecutableSync(installedApmPath)).toBeTruthy() expect(fs.isFileSync(path.join(installationPath, 'apm'))).toBe(false) done() }) }) }) }) })