test: system.service

This commit is contained in:
Nicolas Meienberger 2022-09-26 21:40:12 +02:00
parent aa518c660f
commit ba0996a1f2
3 changed files with 82 additions and 17 deletions

View file

@ -4,6 +4,9 @@ import Layout from '../components/Layout';
import { useLogoutMutation, useRestartMutation, useUpdateMutation, useVersionQuery } from '../generated/graphql';
import { useRef, useState } from 'react';
// Necessary to avoid flickering when initiating an update or restart
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
const Settings: NextPage = () => {
const toast = useToast();
const restartDisclosure = useDisclosure();
@ -51,11 +54,9 @@ const Settings: NextPage = () => {
const handleRestart = async () => {
setLoading(true);
try {
setTimeout(() => {
logout();
}, 2000);
await restart();
restart();
await wait(2000);
logout();
} catch (error) {
handleError(error);
} finally {
@ -66,11 +67,9 @@ const Settings: NextPage = () => {
const handleUpdate = async () => {
setLoading(true);
try {
setTimeout(() => {
logout();
}, 2000);
await update();
update();
await wait(2000);
logout();
} catch (error) {
handleError(error);
} finally {

View file

@ -1,10 +1,12 @@
import fs from 'fs-extra';
import semver from 'semver';
import childProcess from 'child_process';
import axios from 'axios';
import SystemService from '../system.service';
import { faker } from '@faker-js/faker';
import TipiCache from '../../../config/TipiCache';
import { setConfig } from '../../../core/config/TipiConfig';
import logger from '../../../config/logger/logger';
jest.mock('fs-extra');
jest.mock('child_process');
@ -110,6 +112,22 @@ describe('Test: restart', () => {
expect(restart).toBeTruthy();
});
it('Should log error if fails', async () => {
// @ts-ignore
const spy = jest.spyOn(childProcess, 'execFile').mockImplementation((_path, _args, _, cb) => {
// @ts-ignore
if (cb) cb('error', null, null);
});
const log = jest.spyOn(logger, 'error');
const restart = await SystemService.restart();
expect(restart).toBeTruthy();
expect(log).toHaveBeenCalledWith('Error restarting: error');
spy.mockRestore();
});
});
describe('Test: update', () => {
@ -121,4 +139,57 @@ describe('Test: update', () => {
expect(update).toBeTruthy();
});
it('Should throw an error if latest version is not set', async () => {
TipiCache.del('latestVersion');
const spy = jest.spyOn(axios, 'get').mockResolvedValue({
data: { name: null },
});
setConfig('version', '0.0.1');
await expect(SystemService.update()).rejects.toThrow('Could not get latest version');
spy.mockRestore();
});
it('Should throw if current version is higher than latest', async () => {
setConfig('version', '0.0.2');
TipiCache.set('latestVersion', '0.0.1');
await expect(SystemService.update()).rejects.toThrow('Current version is newer than latest version');
});
it('Should throw if current version is equal to latest', async () => {
setConfig('version', '0.0.1');
TipiCache.set('latestVersion', '0.0.1');
await expect(SystemService.update()).rejects.toThrow('Current version is already up to date');
});
it('Should throw an error if there is a major version difference', async () => {
setConfig('version', '0.0.1');
TipiCache.set('latestVersion', '1.0.0');
await expect(SystemService.update()).rejects.toThrow('The major version has changed. Please update manually');
});
it('Should log error if fails', async () => {
// @ts-ignore
const spy = jest.spyOn(childProcess, 'execFile').mockImplementation((_path, _args, _, cb) => {
// @ts-ignore
if (cb) cb('error', null, null);
});
const log = jest.spyOn(logger, 'error');
setConfig('version', '0.0.1');
TipiCache.set('latestVersion', '0.0.2');
const update = await SystemService.update();
expect(update).toBeTruthy();
expect(log).toHaveBeenCalledWith('Error updating: error');
spy.mockRestore();
});
});

View file

@ -22,8 +22,6 @@ const systemInfoSchema = z.object({
}),
});
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
const systemInfo = (): z.infer<typeof systemInfoSchema> => {
const info = systemInfoSchema.safeParse(readJsonFile('/state/system-info.json'));
@ -59,8 +57,6 @@ const getVersion = async (): Promise<{ current: string; latest?: string }> => {
const restart = async (): Promise<boolean> => {
setConfig('status', 'RESTARTING');
await wait(2000);
runScript('/scripts/system.sh', ['restart'], (err: string) => {
setConfig('status', 'RUNNING');
if (err) {
@ -68,15 +64,14 @@ const restart = async (): Promise<boolean> => {
}
});
setConfig('status', 'RUNNING');
return true;
};
const update = async (): Promise<boolean> => {
const { current, latest } = await getVersion();
console.log(current, latest);
await wait(2000);
if (!latest) {
throw new Error('Could not get latest version');
}