Skip to content
This repository has been archived by the owner on Jan 8, 2024. It is now read-only.

Commit

Permalink
Use Mirage’s DB/ORM/Factory in tests and dev
Browse files Browse the repository at this point in the history
  • Loading branch information
jgwhite committed May 25, 2021
1 parent 71aa0ee commit db85e1f
Show file tree
Hide file tree
Showing 11 changed files with 158 additions and 165 deletions.
50 changes: 50 additions & 0 deletions ui/mirage/helpers/protobufs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import * as protobuf from 'google-protobuf';
import { Empty } from 'google-protobuf/google/protobuf/empty_pb';

/**
* Encodes the given protobuf message to base64-encoded wire format.
*
* @param msg the protobuf message you want to encode
* @returns msg in base64-encoded protobuf wire format
*/
export function encode(msg: protobuf.Message): string {
let resp = msg || new Empty();
let serialized = resp.serializeBinary();
let len = serialized.length;
let bytesArray = [0, 0, 0, 0];
let payload = new Uint8Array(5 + len);

for (let i = 3; i >= 0; i--) {
bytesArray[i] = len % 256;
len = len >>> 8;
}

payload.set(new Uint8Array(bytesArray), 1);
payload.set(serialized, 5);

let result = btoa(String.fromCharCode(...payload));

return result;
}

/**
* Decodes base64-encoded wire format to the given message type.
*
* @param type the type of protobuf message you’re expecting to decode
* @param data the base64-encoded protobuf wire format
* @returns reified protobuf message
*/
export function decode<T extends protobuf.Message>(
type: { deserializeBinary(msg: Uint8Array): T },
data: string
): T {
let wireBase64 = data;
let wireAscii = atob(wireBase64);
let wireChars = [...wireAscii];
let msgChars = wireChars.slice(5);
let msgCharCodes = msgChars.map((s) => s.charCodeAt(0));
let msgBinary = Uint8Array.from(msgCharCodes);
let result = type.deserializeBinary(msgBinary);

return result;
}
5 changes: 5 additions & 0 deletions ui/mirage/scenarios/default.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Server } from 'ember-cli-mirage';

export default function (server: Server): void {
server.create('project', 'marketing-public');
}
19 changes: 4 additions & 15 deletions ui/mirage/serializers/application.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,10 @@
import { Serializer, Request } from 'ember-cli-mirage';
import { Serializer } from 'ember-cli-mirage';
import * as jspb from 'google-protobuf';
import { Response } from 'miragejs';
import { encode } from '../helpers/protobufs';

export default class ApplicationSerializer extends Serializer {
serialize(model: jspb.Message, request: Request): Response {
let resp = model;
let serialized = resp.serializeBinary();
var len = serialized.length;
var bytesArray = [0, 0, 0, 0];
var payload = new Uint8Array(5 + len);
for (var i = 3; i >= 0; i--) {
bytesArray[i] = len % 256;
len = len >>> 8;
}
payload.set(new Uint8Array(bytesArray), 1);
payload.set(serialized, 5);

return new Response(200, {}, btoa(String.fromCharCode(...payload)));
serialize(msg: jspb.Message): Response {
return new Response(200, {}, encode(msg));
}
}
54 changes: 23 additions & 31 deletions ui/mirage/services/build.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,29 @@
import { Build, ListBuildsResponse, Component, Status, Ref } from 'waypoint-pb';
import { fakeId, fakeComponentForKind, statusRandom, sequenceRandom } from '../utils';

export function createBuild(): Build {
let build = new Build();
build.setId(fakeId());

build.setSequence(sequenceRandom());

// todo(pearkes): create util
let workspace = new Ref.Workspace();
workspace.setWorkspace('default');

let component = new Component();
component.setType(Component.Type.BUILDER);
component.setName(fakeComponentForKind(Component.Type.BUILDER));

build.setComponent(component);
build.setStatus(statusRandom());
build.setWorkspace(workspace);

build.getLabelsMap().set('common/vcs-ref', '0d56a9f8456b088dd0e4a7b689b842876fd47352');
build.getLabelsMap().set('common/vcs-ref-path', 'https://github.com/hashicorp/waypoint/commit/');
import { ListBuildsRequest, ListBuildsResponse, GetBuildRequest } from 'waypoint-pb';
import { Request, Response } from 'miragejs';
import { decode } from '../helpers/protobufs';

export function list(schema: any, { requestBody }: Request): Response {
let requestMsg = decode(ListBuildsRequest, requestBody);
let projectName = requestMsg.getApplication().getProject();
let appName = requestMsg.getApplication().getApplication();
let workspaceName = requestMsg.getWorkspace().getWorkspace();
let project = schema.projects.findBy({ name: projectName });
let application = schema.applications.findBy({ name: appName, projectId: project.id });
let workspace = schema.workspaces.findBy({ name: workspaceName });
let builds = schema.builds.where({ applicationId: application?.id, workspaceId: workspace?.id });
let buildProtobufs = builds.models.map((b) => b.toProtobuf());
let resp = new ListBuildsResponse();

return build;
}
resp.setBuildsList(buildProtobufs);

export function list(schema: any, { params, requestHeaders }) {
let resp = new ListBuildsResponse();
let builds = new Array(createBuild(), createBuild(), createBuild(), createBuild());
resp.setBuildsList(builds);
return this.serialize(resp, 'application');
}

export function get(schema: any, { params, requestHeaders }) {
return this.serialize(createBuild(), 'application');
export function get(schema: any, { requestBody }: Request): Response {
let requestMsg = decode(GetBuildRequest, requestBody);
let id = requestMsg.getRef().getId();
let model = schema.builds.find(id);
let build = model?.toProtobuf();

return this.serialize(build, 'application');
}
62 changes: 23 additions & 39 deletions ui/mirage/services/deployment.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,29 @@
import { Component, Ref, Deployment, ListDeploymentsResponse } from 'waypoint-pb';
import { fakeId, fakeComponentForKind, statusRandom, sequenceRandom } from '../utils';
import { createBuild } from './build';

export function createDeployment(): Deployment {
let deploy = new Deployment();
deploy.setId(fakeId());

// todo(pearkes): create util
let workspace = new Ref.Workspace();
workspace.setWorkspace('default');

let component = new Component();
component.setType(Component.Type.PLATFORM);
component.setName(fakeComponentForKind(Component.Type.PLATFORM));

deploy.setSequence(sequenceRandom());
deploy.setStatus(statusRandom());
deploy.setComponent(component);
deploy.setWorkspace(workspace);

const preload = new Deployment.Preload();
preload.setBuild(createBuild());
preload.setDeployUrl(`https://wildly-intent-honeybee--${deploy.getSequence()}.alpha.waypoint.run`);

deploy.setPreload(preload);
deploy.setState(3);

deploy.getLabelsMap().set('common/vcs-ref', '0d56a9f8456b088dd0e4a7b689b842876fd47352');
deploy.getLabelsMap().set('common/vcs-ref-path', 'https://github.com/hashicorp/waypoint/commit/');
import { GetDeploymentRequest, ListDeploymentsRequest, ListDeploymentsResponse } from 'waypoint-pb';
import { Request, Response } from 'ember-cli-mirage';
import { decode } from '../helpers/protobufs';

export function list(schema: any, { requestBody }: Request): Response {
let requestMsg = decode(ListDeploymentsRequest, requestBody);
let projectName = requestMsg.getApplication().getProject();
let appName = requestMsg.getApplication().getApplication();
let workspaceName = requestMsg.getWorkspace().getWorkspace();
let project = schema.projects.findBy({ name: projectName });
let application = schema.applications.findBy({ name: appName, projectId: project?.id });
let workspace = schema.workspaces.findBy({ name: workspaceName });
let deployments = schema.deployments.where({ applicationId: application?.id, workspaceId: workspace?.id });
let deploymentProtobufs = deployments.models.map((d) => d.toProtobuf());
let resp = new ListDeploymentsResponse();

return deploy;
}
resp.setDeploymentsList(deploymentProtobufs);

export function list(schema: any, { params, requestHeaders }) {
let resp = new ListDeploymentsResponse();
let deploys = new Array(createDeployment(), createDeployment(), createDeployment());
resp.setDeploymentsList(deploys);
return this.serialize(resp, 'application');
}

export function get(schema: any, { params, requestHeaders }) {
let deploy = createDeployment();
return this.serialize(deploy, 'application');
export function get(schema: any, { requestBody }: Request): Response {
let requestMsg = decode(GetDeploymentRequest, requestBody);
let id = requestMsg.getRef().getId();
let model = schema.deployments.find(id);
let protobuf = model?.toProtobuf();

return this.serialize(protobuf, 'application');
}
57 changes: 16 additions & 41 deletions ui/mirage/services/project.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,25 @@
import { Build, Ref, ListProjectsResponse, GetProjectResponse, Project, Application } from 'waypoint-pb';
import { fakeId } from '../utils';
import faker from '../faker';
import { dasherize } from '@ember/string';
import { create } from 'domainx';
import { ListProjectsResponse, GetProjectResponse } from 'waypoint-pb';
import { decode } from '../helpers/protobufs';
import { GetProjectRequest } from 'waypoint-pb';
import { Request, Response } from 'miragejs';

const projectName = 'marketing-public';

function createProjectRef(): Ref.Project {
let build = new Build();
build.setId(fakeId());

// todo(pearkes): create util
let workspace = new Ref.Workspace();
workspace.setWorkspace('default');

let project = new Ref.Project();
project.setProject(projectName);

return project;
}

function createApp(): Application {
let app = new Application();
app.setName(`wp-${faker.hacker.noun()}`);

return app;
}

function createProject(): Project {
let proj = new Project();
proj.setName(projectName);
proj.setApplicationsList([createApp()]);
export function list(schema: any): Response {
let resp = new ListProjectsResponse();
let projectRefs = schema.projects.all().models.map((p) => p.toProtobufRef());

return proj;
}
resp.setProjectsList(projectRefs);

export function list(schema: any, { params, requestHeaders }) {
let resp = new ListProjectsResponse();
let projs = new Array(createProjectRef());
resp.setProjectsList(projs);
return this.serialize(resp, 'application');
}

export function get(schema: any, { params, requestHeaders }) {
export function get(schema: any, { requestBody }: Request): Response {
let requestMsg = decode(GetProjectRequest, requestBody);
let name = requestMsg.getProject().getProject();
let model = schema.projects.findBy({ name });
let resp = new GetProjectResponse();
let proj = createProject();
resp.setProject(proj);
let project = model?.toProtobuf();

resp.setProject(project);

return this.serialize(resp, 'application');
}
60 changes: 23 additions & 37 deletions ui/mirage/services/release.ts
Original file line number Diff line number Diff line change
@@ -1,43 +1,29 @@
import { Component, Ref, Release, ListReleasesResponse } from 'waypoint-pb';
import { fakeId, fakeComponentForKind, statusRandom, sequenceRandom } from '../utils';
import { createDeployment } from './deployment';

function createRelease(): Release {
let release = new Release();
release.setId(fakeId());

// todo(pearkes): create util
let workspace = new Ref.Workspace();
workspace.setWorkspace('default');

let component = new Component();
component.setType(Component.Type.RELEASEMANAGER);
component.setName(fakeComponentForKind(Component.Type.RELEASEMANAGER));

release.setSequence(sequenceRandom());
release.setStatus(statusRandom());
release.setComponent(component);
release.setWorkspace(workspace);
release.setDeploymentId(createDeployment().getId());

release.setUrl(`https://wildly-intent-honeybee--${release.getId().toLowerCase()}.alpha.waypoint.run`);

release.setState(3);

release.getLabelsMap().set('common/vcs-ref', '0d56a9f8456b088dd0e4a7b689b842876fd47352');
release.getLabelsMap().set('common/vcs-ref-path', 'https://github.com/hashicorp/waypoint/commit/');
import { ListReleasesRequest, ListReleasesResponse, GetReleaseRequest } from 'waypoint-pb';
import { Request, Response } from 'ember-cli-mirage';
import { decode } from '../helpers/protobufs';

export function list(schema: any, { requestBody }: Request): Response {
let requestMsg = decode(ListReleasesRequest, requestBody);
let projectName = requestMsg.getApplication().getProject();
let appName = requestMsg.getApplication().getApplication();
let workspaceName = requestMsg.getWorkspace().getWorkspace();
let project = schema.projects.findBy({ name: projectName });
let application = schema.applications.findBy({ name: appName, projectId: project?.id });
let workspace = schema.workspaces.findBy({ name: workspaceName });
let releases = schema.releases.where({ applicationId: application?.id, workspaceId: workspace?.id });
let releaseProtobufs = releases.models.map((d) => d.toProtobuf());
let resp = new ListReleasesResponse();

return release;
}
resp.setReleasesList(releaseProtobufs);

export function list(schema: any, { params, requestHeaders }) {
let resp = new ListReleasesResponse();
let releases = new Array(createRelease(), createRelease(), createRelease());
resp.setReleasesList(releases);
return this.serialize(resp, 'application');
}

export function get(schema: any, { params, requestHeaders }) {
let deploy = createRelease();
return this.serialize(deploy, 'application');
export function get(schema: any, { requestBody }: Request) {
let requestMsg = decode(GetReleaseRequest, requestBody);
let id = requestMsg.getRef().getId();
let model = schema.releases.find(id);
let protobuf = model?.toProtobuf();

return this.serialize(protobuf, 'application');
}
6 changes: 4 additions & 2 deletions ui/tests/acceptance/builds-list-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import login from '../helpers/login';
const buildsUrl = '/default/microchip/app/wp-bandwidth/builds';

const page = create({
// todo(pearkes): seeds inline tests
visit: visitable(buildsUrl),
buildList: collection('[data-test-build-list] li'),
});
Expand All @@ -19,9 +18,12 @@ module('Acceptance | builds list', function (hooks) {
login();

test('visiting builds page', async function (assert) {
let project = this.server.create('project', { name: 'microchip' });
let application = this.server.create('application', { name: 'wp-bandwidth', project });
this.server.createList('build', 4, 'random', { application });

await page.visit();

// Currently no way to seed past the default in mirage/services/builds.ts
assert.equal(page.buildList.length, 4);
assert.equal(currentURL(), buildsUrl);
});
Expand Down
4 changes: 4 additions & 0 deletions ui/tests/acceptance/deployments-list-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ module('Acceptance | deployments list', function (hooks) {
login();

test('visiting deployments page', async function (assert) {
let project = this.server.create('project', { name: 'microchip' });
let application = this.server.create('application', { name: 'wp-bandwidth', project });
this.server.createList('deployment', 3, 'random', { application });

await page.visit();

assert.equal(page.list.length, 3);
Expand Down
2 changes: 2 additions & 0 deletions ui/tests/acceptance/onboarding-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ module('Acceptance | onboarding start', function (hooks) {
login();

test('sends users to default workspace after completion', async function (assert) {
this.server.create('project', 'marketing-public');

await page.visit().nextStep();

assert.equal(currentURL(), `/default`);
Expand Down
4 changes: 4 additions & 0 deletions ui/tests/acceptance/releases-list-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ module('Acceptance | releases list', function (hooks) {
login();

test('visiting releases page', async function (assert) {
let project = this.server.create('project', { name: 'microchip' });
let application = this.server.create('application', { name: 'wp-bandwidth', project });
this.server.createList('release', 3, { application });

await page.visit();

assert.equal(page.list.length, 3);
Expand Down

0 comments on commit db85e1f

Please sign in to comment.