joyent-portal/packages/cp-gql-mock-server/test/index.js

1589 lines
37 KiB
JavaScript

const test = require('ava');
const gql = require('graphql-tag');
const { readFile } = require('mz/fs');
const sortBy = require('lodash.sortby');
const path = require('path');
const execa = require('execa');
const IPC = require('crocket');
global.fetch = require('node-fetch');
const {
default: ApolloClient,
createNetworkInterface
} = require('apollo-client');
const EVENT_TYPES = [
'manifest-provisioned',
'instance-created',
'instance-updated',
'instance-provisioned',
'instance-stopped',
'instance-deleted',
'instance-started',
'instance-restarted',
'service-updated',
'service-created',
'service-scaled',
'service-deleted',
'services-deleted',
'service-restarted',
'services-restarted',
'service-stopped',
'services-stopped',
'service-started',
'services-started',
'dg-updated',
'dg-created',
'dg-deleted'
];
let port = 3000;
let sockPort = 2999;
const fetchTag = file =>
readFile(path.join(__dirname, `tags/${file}.gql`), 'utf-8');
const listen = (socket, check) =>
new Promise(resolve => {
const events = [];
let off = false;
EVENT_TYPES.forEach(name =>
socket.on(name, ({ index, payload }) => {
// No .off API
if (off) {
return;
}
const ev = { name, index, payload };
events.push(ev);
if (!check(ev)) {
return;
}
off = true;
resolve(
sortBy(events, ['index']).map(({ name, payload }) => ({
name,
payload
}))
);
})
);
});
const getClient = () =>
new Promise((resolve, reject) => {
const sock = new IPC();
// eslint-disable-next-line no-multi-assign
const _port = (port += 1);
// eslint-disable-next-line no-multi-assign
const _sockPort = (sockPort -= 1);
sock._sockPort = _sockPort;
// eslint-disable-next-line no-console
console.error('spawning node', {
_port,
_sockPort,
pid: process.pid
});
const server = execa('node', ['.'], {
stdio: 'pipe',
cwd: path.join(__dirname, '..'),
env: {
PORT: _port,
SOCK_PORT: _sockPort
}
});
const client = new ApolloClient({
networkInterface: createNetworkInterface({
uri: `http://localhost:${port}/api/graphql`
})
});
server.stdout.on('data', d => {
if (!/server started at /.test(d)) {
return;
}
sock.connect({ port: _sockPort }, err => {
if (err) {
return reject(err);
}
// eslint-disable-next-line no-console
console.log('sock connected to %d', _sockPort);
resolve(
Object.assign(client, {
sock,
_sockPort,
kill: () => {
// eslint-disable-next-line no-console
console.error('closing server & client', {
_port,
_sockPort,
pid: process.pid
});
server.kill();
sock.close();
}
})
);
});
});
server.stdout.pipe(process.stdout);
server.stderr.pipe(process.stderr);
});
test('getPortal', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups'))
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test('getDeploymentGroups', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-direct'))
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test('getDeploymentGroup', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-group-direct')),
variables: {
id: 'e0ea0c02-55cc-45fe-8064-3e5176a59401'
}
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test('getServices', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('services-direct'))
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test('getService', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('service-direct-filtered')),
variables: {
id: '6d31aff4-de1e-4042-a983-fbd23d5c530c'
}
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test('getInstances', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('instances-direct'))
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test('getInstance', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('instance-direct-filtered')),
variables: {
id: '25f6bc62-63b8-4959-908e-1f6d7ff6341d'
}
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test('should return everything', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('all'))
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test('should return only Portal', async t => {
const client = await getClient();
const res = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('portal-only'))
});
t.snapshot(JSON.stringify(res.data, null, 2));
client.kill();
});
test("should return DeploymentGroup's", async t => {
const client = await getClient();
const dgs = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups'))
});
const dgsDirect = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-direct'))
});
t.snapshot(JSON.stringify(dgs.data, null, 2));
t.snapshot(JSON.stringify(dgsDirect.data, null, 2));
client.kill();
});
test("should return filtered DeploymentGroup's", async t => {
const client = await getClient();
const dgs = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'wordpress-blog-example'
}
});
const dgsDirect = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-direct-filtered')),
variables: {
slug: 'wordpress-blog-example'
}
});
t.snapshot(JSON.stringify(dgs.data, null, 2));
t.snapshot(JSON.stringify(dgsDirect.data, null, 2));
client.kill();
});
test('should return services', async t => {
const client = await getClient();
const services = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('services'))
});
const servicesDirect = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('services-direct'))
});
t.snapshot(JSON.stringify(services.data, null, 2));
t.snapshot(JSON.stringify(servicesDirect.data, null, 2));
client.kill();
});
test('should return filtered services', async t => {
const client = await getClient();
const services = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('services-filtered')),
variables: {
dgSlug: 'wordpress-blog-example',
sSlug: 'nginx'
}
});
const servicesDirect = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('services-direct-filtered')),
variables: {
sSlug: 'nginx'
}
});
t.snapshot(JSON.stringify(services.data, null, 2));
t.snapshot(JSON.stringify(servicesDirect.data, null, 2));
client.kill();
});
test('should return instances', async t => {
const client = await getClient();
const instances = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('instances'))
});
const instancesDirect = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('instances-direct'))
});
t.snapshot(JSON.stringify(instances.data, null, 2));
t.snapshot(JSON.stringify(instancesDirect.data, null, 2));
client.kill();
});
test('should return filtered instances', async t => {
const client = await getClient();
const instances = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('instances-filtered')),
variables: {
dgSlug: 'cpexample',
sSlug: 'mysql',
iName: 'mysql-2',
biName: 'mysql-1'
}
});
const instancesDirect = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('instances-direct-filtered')),
variables: {
dgSlug: 'cpexample',
sSlug: 'mysql',
iName: 'mysql-2',
biName: 'mysql-1'
}
});
t.snapshot(JSON.stringify(instances.data, null, 2));
t.snapshot(JSON.stringify(instancesDirect.data, null, 2));
client.kill();
});
test('should create DeploymentGroup', async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test'
}
});
const dgs = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups'))
});
const dgsDirect = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-direct'))
});
const fDgs = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test'
}
});
const fDgsDirect = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-direct-filtered')),
variables: {
slug: 'test'
}
});
t.snapshot(JSON.stringify(created.data, null, 2));
t.snapshot(JSON.stringify(dgs.data, null, 2));
t.snapshot(JSON.stringify(dgsDirect.data, null, 2));
t.snapshot(JSON.stringify(fDgs.data, null, 2));
t.snapshot(JSON.stringify(fDgsDirect.data, null, 2));
client.kill();
});
test('should provisionManifest', async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test1'
}
});
const dgsBeforeProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test1'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
const provisionEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test1'
}
});
t.snapshot(JSON.stringify(dgsBeforeProvision.data, null, 2));
t.snapshot(JSON.stringify(provisionEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
client.kill();
});
test('should delete DeploymentGroup', async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test2'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test2'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test2'
}
});
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('delete-deployment-group')),
variables: {
id: created.data.createDeploymentGroup.id
}
});
const deleteDgEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'dg-deleted' && payload === created.data.createDeploymentGroup.id
);
const dgsAfterDelete = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test2'
}
});
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
t.snapshot(JSON.stringify(deleteDgEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterDelete.data, null, 2));
client.kill();
});
test('should scale up', async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test3'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test3'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test3'
}
});
const serviceId =
dgsAfterProvision.data.portal.deploymentGroups[0].services[0].id;
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('scale')),
variables: {
serviceId,
replicas: 10
}
});
const scaleEvents = await listen(
client.sock,
({ name, payload }) => name === 'service-scaled' && payload === serviceId
);
const dgsAfterScale = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test3'
}
});
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
t.snapshot(JSON.stringify(scaleEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterScale.data, null, 2));
client.kill();
});
test('should scale down', async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test4'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test4'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test4'
}
});
const serviceId =
dgsAfterProvision.data.portal.deploymentGroups[0].services[0].id;
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('scale')),
variables: {
serviceId,
replicas: 10
}
});
await listen(
client.sock,
({ name, payload }) => name === 'service-scaled' && payload === serviceId
);
const dgsAfterScaleUp = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test4'
}
});
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('scale')),
variables: {
serviceId,
replicas: 7
}
});
const scaleDownEvents = await listen(
client.sock,
({ name, payload }) => name === 'service-scaled' && payload === serviceId
);
const dgsAfterScaleDown = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test4'
}
});
t.snapshot(JSON.stringify(dgsAfterScaleUp.data, null, 2));
t.snapshot(JSON.stringify(scaleDownEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterScaleDown.data, null, 2));
client.kill();
});
test("shouldn't scale", async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test10'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
const serviceId =
dgsAfterProvision.data.portal.deploymentGroups[0].services[0].id;
const scaleUpVersion = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('scale')),
variables: {
serviceId,
replicas: 10
}
});
await listen(
client.sock,
({ name, payload }) => name === 'service-scaled' && payload === serviceId
);
const dgsAfterScaleUp = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
const scaleEqVersion = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('scale')),
variables: {
serviceId,
replicas: 10
}
});
const dgsAfterScaleEq = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
t.deepEqual(scaleUpVersion.data, scaleEqVersion.data);
t.deepEqual(dgsAfterScaleUp.data, dgsAfterScaleEq.data);
client.kill();
});
test("should delete Service's", async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test5'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test5'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test5'
}
});
const serviceIds = dgsAfterProvision.data.portal.deploymentGroups
.filter(({ id }) => id === created.data.createDeploymentGroup.id)[0]
.services.map(({ id }) => id);
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('delete-services')),
variables: {
ids: serviceIds
}
});
const deleteServicesEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'services-deleted' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterDelete = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test5'
}
});
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
t.snapshot(JSON.stringify(deleteServicesEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterDelete.data, null, 2));
client.kill();
});
test("shouldn't delete Service's twice", async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test5'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test5'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test5'
}
});
const serviceIds = dgsAfterProvision.data.portal.deploymentGroups
.filter(({ id }) => id === created.data.createDeploymentGroup.id)[0]
.services.map(({ id }) => id);
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('delete-services')),
variables: {
ids: serviceIds
}
});
const deleteServicesEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'services-deleted' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterDelete = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test5'
}
});
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('delete-services')),
variables: {
ids: serviceIds
}
});
const deleteServicesAgainEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'services-deleted' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterDeleteAgain = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test5'
}
});
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
t.snapshot(JSON.stringify(deleteServicesEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterDelete.data, null, 2));
t.snapshot(JSON.stringify(deleteServicesAgainEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterDeleteAgain.data, null, 2));
client.kill();
});
test("should restart Service's", async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test6'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test6'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test6'
}
});
const serviceIds = dgsAfterProvision.data.portal.deploymentGroups
.filter(({ id }) => id === created.data.createDeploymentGroup.id)[0]
.services.map(({ id }) => id);
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('restart-services')),
variables: {
ids: serviceIds
}
});
const restartEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'services-restarted' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterRestart = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test6'
}
});
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
t.snapshot(JSON.stringify(restartEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterRestart.data, null, 2));
client.kill();
});
test("should stop Service's", async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test7'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test7'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test7'
}
});
const serviceIds = dgsAfterProvision.data.portal.deploymentGroups
.filter(({ id }) => id === created.data.createDeploymentGroup.id)[0]
.services.map(({ id }) => id);
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('stop-services')),
variables: {
ids: serviceIds
}
});
const stopEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'services-stopped' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterStop = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test7'
}
});
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
t.snapshot(JSON.stringify(stopEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterStop.data, null, 2));
client.kill();
});
test("shouldn't stop Service's twice", async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test9'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test9'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test9'
}
});
const serviceIds = dgsAfterProvision.data.portal.deploymentGroups
.filter(({ id }) => id === created.data.createDeploymentGroup.id)[0]
.services.map(({ id }) => id);
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('stop-services')),
variables: {
ids: serviceIds
}
});
const stopEventsBefore = await listen(
client.sock,
({ name, payload }) =>
name === 'services-stopped' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterStop = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test9'
}
});
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('stop-services')),
variables: {
ids: serviceIds
}
});
const stopEventsAfter = await listen(
client.sock,
({ name, payload }) =>
name === 'services-stopped' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterStopAgain = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test9'
}
});
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
t.snapshot(JSON.stringify(stopEventsBefore, null, 2));
t.snapshot(JSON.stringify(dgsAfterStop.data, null, 2));
t.snapshot(JSON.stringify(stopEventsAfter, null, 2));
t.snapshot(JSON.stringify(dgsAfterStopAgain.data, null, 2));
client.kill();
});
test("should start Service's", async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test8'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test8'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test8'
}
});
const serviceIds = dgsAfterProvision.data.portal.deploymentGroups
.filter(({ id }) => id === created.data.createDeploymentGroup.id)[0]
.services.map(({ id }) => id);
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('start-services')),
variables: {
ids: serviceIds
}
});
const startEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'services-started' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterStart = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test8'
}
});
t.snapshot(JSON.stringify(dgsAfterProvision.data, null, 2));
t.snapshot(JSON.stringify(startEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterStart.data, null, 2));
client.kill();
});
test("shouldn't start Service's twice", async t => {
const client = await getClient();
const created = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('create-deployment-group')),
variables: {
name: 'test10'
}
});
await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
const version = await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('provision-manifest')),
variables: {
deploymentGroupId: created.data.createDeploymentGroup.id,
type: 'COMPOSE',
format: 'YAML',
environment: {},
files: [],
raw: `
redis:
image: redis:latest
nginx:
image: nginx:latest
`
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'manifest-provisioned' &&
payload === version.data.provisionManifest.id
);
const dgsAfterProvision = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
const serviceIds = dgsAfterProvision.data.portal.deploymentGroups
.filter(({ id }) => id === created.data.createDeploymentGroup.id)[0]
.services.map(({ id }) => id);
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('stop-services')),
variables: {
ids: serviceIds
}
});
await listen(
client.sock,
({ name, payload }) =>
name === 'services-stopped' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterStop = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('start-services')),
variables: {
ids: serviceIds
}
});
const startEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'services-started' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterStart = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
await client.mutate({
fetchPolicy: 'network-only',
mutation: gql(await fetchTag('start-services')),
variables: {
ids: serviceIds
}
});
const startAgainEvents = await listen(
client.sock,
({ name, payload }) =>
name === 'services-started' &&
serviceIds.every(id => payload.indexOf(id) >= 0)
);
const dgsAfterStartAgain = await client.query({
fetchPolicy: 'network-only',
query: gql(await fetchTag('deployment-groups-filtered')),
variables: {
slug: 'test10'
}
});
t.snapshot(JSON.stringify(dgsAfterStop.data, null, 2));
t.snapshot(JSON.stringify(startEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterStart.data, null, 2));
t.snapshot(JSON.stringify(startAgainEvents, null, 2));
t.snapshot(JSON.stringify(dgsAfterStartAgain.data, null, 2));
client.kill();
});