Skip to content

Commit

Permalink
feat(core-kernel): load crypto configuration from directory
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Faust committed Sep 24, 2019
1 parent 8df2f12 commit b37233e
Show file tree
Hide file tree
Showing 17 changed files with 275 additions and 114 deletions.
26 changes: 20 additions & 6 deletions __tests__/unit/core-kernel/application.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ describe("Application", () => {

const serviceProviderRepository = new ServiceProviderRepository();
app.bind(Identifiers.ServiceProviderRepository).toConstantValue(serviceProviderRepository);
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider = app.resolve(StubServiceProvider);
const spyRegister = jest.spyOn(serviceProvider, "register");
Expand All @@ -111,7 +113,9 @@ describe("Application", () => {

const serviceProviderRepository = new ServiceProviderRepository();
app.bind(Identifiers.ServiceProviderRepository).toConstantValue(serviceProviderRepository);
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider = app.resolve(StubServiceProvider);
const spyRegister = jest.spyOn(serviceProvider, "register");
Expand All @@ -131,7 +135,11 @@ describe("Application", () => {
});

it("should get and set the given configuration value", () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({ key: "Hello World" }));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

app.get<ConfigRepository>(Identifiers.ConfigRepository).merge({ key: "Hello World" });

expect(app.config("key")).toBe("Hello World");

Expand Down Expand Up @@ -386,7 +394,9 @@ describe("Application", () => {

const serviceProviderRepository = new ServiceProviderRepository();
app.bind(Identifiers.ServiceProviderRepository).toConstantValue(serviceProviderRepository);
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider = app.resolve(StubServiceProvider);
const spyDispose = jest.spyOn(serviceProvider, "dispose");
Expand All @@ -410,7 +420,9 @@ describe("Application", () => {

const serviceProviderRepository = new ServiceProviderRepository();
app.bind(Identifiers.ServiceProviderRepository).toConstantValue(serviceProviderRepository);
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider = app.resolve(StubServiceProvider);
const spyDispose = jest.spyOn(serviceProvider, "dispose");
Expand All @@ -435,7 +447,9 @@ describe("Application", () => {

const serviceProviderRepository = new ServiceProviderRepository();
app.bind(Identifiers.ServiceProviderRepository).toConstantValue(serviceProviderRepository);
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider = app.resolve(StubServiceProvider);
const spyDispose = jest.spyOn(serviceProvider, "dispose");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,36 +19,42 @@ let serviceProviderRepository: ServiceProviderRepository;

beforeEach(() => {
container = new Container();
container.snapshot();

app = new Application(container);

serviceProviderRepository = new ServiceProviderRepository();
app.bind(Identifiers.ServiceProviderRepository).toConstantValue(serviceProviderRepository);
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

app.bind(Identifiers.ServiceProviderRepository)
.to(ServiceProviderRepository)
.inSingletonScope();

configRepository = app.get<ConfigRepository>(Identifiers.ConfigRepository);

serviceProviderRepository = app.get<ServiceProviderRepository>(Identifiers.ServiceProviderRepository);

container.snapshot();
});

afterEach(() => container.restore());

describe("LoadServiceProviders", () => {
it("should bootstrap with defaults", async () => {
configRepository = new ConfigRepository({
configRepository.merge({
app: { plugins: [{ package: resolve(__dirname, "../../__stubs__/stub-plugin-with-defaults") }] },
});

app.bind(Identifiers.ConfigRepository).toConstantValue(configRepository);

serviceProviderRepository.set("stub", new StubServiceProvider());

await app.resolve<LoadServiceProviders>(LoadServiceProviders).bootstrap();
});

it("should bootstrap without defaults", async () => {
configRepository = new ConfigRepository({
configRepository.merge({
app: { plugins: [{ package: resolve(__dirname, "../../__stubs__/stub-plugin") }] },
});

app.bind(Identifiers.ConfigRepository).toConstantValue(configRepository);

serviceProviderRepository.set("stub", new StubServiceProvider());

await app.resolve<LoadServiceProviders>(LoadServiceProviders).bootstrap();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ afterEach(() => container.restore());

describe("BootServiceProviders", () => {
it("RequiredFaultyBootServiceProvider", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new RequiredFaultyBootServiceProvider();
serviceProviderRepository.set("stub", serviceProvider);
Expand All @@ -54,7 +56,9 @@ describe("BootServiceProviders", () => {
});

it("FaultyBootServiceProvider", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new FaultyBootServiceProvider();
const spyBoot = jest.spyOn(serviceProvider, "boot");
Expand All @@ -66,7 +70,9 @@ describe("BootServiceProviders", () => {
});

it("DeferredServiceProvider", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new DeferredServiceProvider();
const spyBoot = jest.spyOn(serviceProvider, "boot");
Expand All @@ -79,7 +85,9 @@ describe("BootServiceProviders", () => {
});

it("DeferredServiceProvider - failed", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new DeferredServiceProvider();
const spyBoot = jest.spyOn(serviceProvider, "boot");
Expand All @@ -98,7 +106,9 @@ describe("BootServiceProviders", () => {
});

it("DeferredServiceProvider - enableWhen", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new DeferredServiceProvider();
const spyBoot = jest.spyOn(serviceProvider, "boot");
Expand All @@ -118,7 +128,9 @@ describe("BootServiceProviders", () => {
});

it("DeferredServiceProvider - disableWhen", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new DeferredServiceProvider();
const spyDispose = jest.spyOn(serviceProvider, "dispose");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ afterEach(() => container.restore());

describe("RegisterServiceProviders", () => {
it("should bootstrap with a basic service provider", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new StubServiceProvider();
const spyRegister = jest.spyOn(serviceProvider, "register");
Expand All @@ -68,7 +70,9 @@ describe("RegisterServiceProviders", () => {
});

it("should respect the include configuration", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

app.get<ConfigRepository>(Identifiers.ConfigRepository).set("include", ["stub-other"]);

Expand All @@ -82,7 +86,9 @@ describe("RegisterServiceProviders", () => {
});

it("should respect the exclude configuration", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

app.get<ConfigRepository>(Identifiers.ConfigRepository).set("exclude", ["stub"]);

Expand All @@ -96,7 +102,9 @@ describe("RegisterServiceProviders", () => {
});

it("should bootstrap if the configuration validation passes", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new ValidConfigurationServiceProvider();
serviceProvider.setManifest(app.resolve(PluginManifest));
Expand All @@ -117,7 +125,9 @@ describe("RegisterServiceProviders", () => {
});

it("should mark the service provider as failed if the configuration validation fails", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new InvalidConfigurationServiceProvider();
serviceProvider.setManifest(app.resolve(PluginManifest));
Expand All @@ -134,7 +144,9 @@ describe("RegisterServiceProviders", () => {
});

it("should throw if the service provider is required and the configuration validation fails", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new RequiredInvalidConfigurationServiceProvider();
serviceProvider.setManifest(app.resolve(PluginManifest));
Expand All @@ -154,7 +166,9 @@ describe("RegisterServiceProviders", () => {
});

it("should terminate if a required (boolean) dependency cannot be found", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new RequiredDependencyCannotBeFoundServiceProvider();
serviceProvider.setManifest(app.resolve(PluginManifest));
Expand All @@ -170,7 +184,9 @@ describe("RegisterServiceProviders", () => {
});

it("should terminate if a required (async) dependency cannot be found", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new RequiredDependencyCannotBeFoundAsyncServiceProvider();
serviceProvider.setManifest(app.resolve(PluginManifest));
Expand All @@ -188,7 +204,9 @@ describe("RegisterServiceProviders", () => {
});

it("should mark the service provider as failed and log a warning if an optional dependency cannot be found", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new OptionalDependencyCannotBeFoundServiceProvider();
serviceProvider.setManifest(app.resolve(PluginManifest));
Expand All @@ -205,7 +223,9 @@ describe("RegisterServiceProviders", () => {
});

it("should terminate if a required dependency cannot satisfy the version", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new RequiredDependencyVersionCannotBeSatisfiedServiceProvider();
serviceProvider.setManifest(app.resolve(PluginManifest));
Expand All @@ -222,7 +242,9 @@ describe("RegisterServiceProviders", () => {
});

it("should mark the service provider as failed and log a warning if an optional dependency cannot satisfy the version", async () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = new OptionalDependencyVersionCannotBeSatisfiedServiceProvider();
serviceProvider.setManifest(app.resolve(PluginManifest));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ beforeEach(() => {
container.snapshot();

app = new Application(container);
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

pluginConfiguration = app.resolve<PluginConfiguration>(PluginConfiguration);
});
Expand Down
4 changes: 3 additions & 1 deletion __tests__/unit/core-kernel/providers/plugin-manifest.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ beforeEach(() => {
container.snapshot();

app = new Application(container);
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

pluginConfiguration = app.resolve<PluginManifest>(PluginManifest);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,9 @@ describe("ServiceProvider", () => {
});

it(".config", () => {
app.bind(Identifiers.ConfigRepository).toConstantValue(new ConfigRepository({}));
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();

const serviceProvider: ServiceProvider = app.resolve(StubServiceProvider);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { dirSync, setGracefulCleanup } from "tmp";

import { LocalConfigLoader } from "@packages/core-kernel/src/services/config/drivers/local";
import { Application } from "@packages/core-kernel/src/application";
import { ConfigRepository } from "@packages/core-kernel/src/services/config/repository";
import { Container, Identifiers, interfaces } from "@packages/core-kernel/src/ioc";
import { ServiceProviderRepository } from "@packages/core-kernel/src/providers";
import { MemoryEventDispatcher } from "@packages/core-kernel/src/services/events/drivers/memory";
Expand All @@ -22,6 +23,9 @@ beforeEach(() => {
container.snapshot();

app = new Application(container);
app.bind(Identifiers.ConfigRepository)
.to(ConfigRepository)
.inSingletonScope();
app.bind(Identifiers.EventDispatcherService).toConstantValue(new MemoryEventDispatcher());
app.bind(Identifiers.ServiceProviderRepository).toConstantValue(new ServiceProviderRepository());
app.bind("path.config").toConstantValue(configPath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import "jest-extended";
import { ConfigRepository } from "@packages/core-kernel/src/services/config/repository";

let configRepository: ConfigRepository;
beforeEach(() => (configRepository = new ConfigRepository({})));
beforeEach(() => (configRepository = new ConfigRepository()));

describe("ConfigRepository", () => {
it("should set, get and unset the given key-value", () => {
Expand Down
Loading

0 comments on commit b37233e

Please sign in to comment.