From 3b7d52abb0e7de00bdf92ee3482a4cae1f6b7d64 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 3 Jan 2022 01:02:00 +0100 Subject: feat: Add Profile and Service stores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the main process, it is optional to specify the ID of a Profile or a Service. The missing ID will be filled in with a randomly generated one. Moreover, services without a profile will get a profile generated with the same name. Signed-off-by: Kristóf Marussy --- packages/main/src/stores/__tests__/Config.spec.ts | 156 ++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 packages/main/src/stores/__tests__/Config.spec.ts (limited to 'packages/main/src/stores/__tests__') diff --git a/packages/main/src/stores/__tests__/Config.spec.ts b/packages/main/src/stores/__tests__/Config.spec.ts new file mode 100644 index 0000000..22ccbc7 --- /dev/null +++ b/packages/main/src/stores/__tests__/Config.spec.ts @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2021-2022 Kristóf Marussy + * + * This file is part of Sophie. + * + * Sophie is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { config, Config, ConfigFileIn } from '../Config'; +import type { PartialProfileSnapshotIn } from '../Profile'; +import type { PartialServiceSnapshotIn } from '../Service'; + +const profileProps: PartialProfileSnapshotIn = { + name: 'Test profile', +}; + +const serviceProps: PartialServiceSnapshotIn = { + name: 'Test service', + url: 'https://example.com', +}; + +let sut: Config; + +beforeEach(() => { + sut = config.create(); +}); + +describe('preprocessConfigFile', () => { + it('should load profiles with an ID', () => { + sut.loadFromConfigFile({ + profiles: [ + { + id: 'someId', + ...profileProps, + }, + ], + }); + expect(sut.profiles[0].id).toBe('someId'); + }); + + it('should generate an ID for profiles without and ID', () => { + sut.loadFromConfigFile({ + profiles: [profileProps], + }); + expect(sut.profiles[0].id).toBeDefined(); + }); + + it('should load services with an ID and a profile', () => { + sut.loadFromConfigFile({ + profiles: [ + { + id: 'someProfileId', + ...profileProps, + }, + ], + services: [ + { + id: 'someServiceId', + profile: 'someProfileId', + ...serviceProps, + }, + ], + }); + expect(sut.services[0].id).toBe('someServiceId'); + expect(sut.services[0].profile).toBe(sut.profiles[0]); + }); + + it('should refuse to load a profile without a name', () => { + expect(() => { + sut.loadFromConfigFile({ + profiles: [ + { + id: 'someProfileId', + ...profileProps, + name: undefined, + }, + ], + } as unknown as ConfigFileIn); + }).toThrow(); + expect(sut.profiles).toHaveLength(0); + }); + + it('should load services without an ID but with a profile', () => { + sut.loadFromConfigFile({ + profiles: [ + { + id: 'someProfileId', + ...profileProps, + }, + ], + services: [ + { + profile: 'someProfileId', + ...serviceProps, + }, + ], + }); + expect(sut.services[0].id).toBeDefined(); + expect(sut.services[0].profile).toBe(sut.profiles[0]); + }); + + it('should create a profile for a service with an ID but no profile', () => { + sut.loadFromConfigFile({ + services: [ + { + id: 'someServiceId', + ...serviceProps, + }, + ], + }); + expect(sut.services[0].id).toBe('someServiceId'); + expect(sut.services[0].profile).toBeDefined(); + expect(sut.services[0].profile.name).toBe(serviceProps.name); + }); + + it('should create a profile for a service without an ID or profile', () => { + sut.loadFromConfigFile({ + services: [ + { + ...serviceProps, + }, + ], + }); + expect(sut.services[0].id).toBeDefined(); + expect(sut.services[0].profile).toBeDefined(); + expect(sut.services[0].profile.name).toBe(serviceProps.name); + }); + + it('should refuse to load a service without a name', () => { + expect(() => { + sut.loadFromConfigFile({ + services: [ + { + id: 'someServiceId', + ...serviceProps, + name: undefined, + }, + ], + } as unknown as ConfigFileIn); + }).toThrow(); + expect(sut.profiles).toHaveLength(0); + expect(sut.services).toHaveLength(0); + }); +}); -- cgit v1.2.3-70-g09d2