Skip to content

Commit

Permalink
feat: restructure mocks of sitewise to all be co-located (#52)
Browse files Browse the repository at this point in the history
  • Loading branch information
diehbria committed Feb 9, 2022
1 parent 655e545 commit 5bafe89
Show file tree
Hide file tree
Showing 25 changed files with 248 additions and 204 deletions.
143 changes: 102 additions & 41 deletions packages/components/src/components/iot-connector/iot-connector.spec.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,60 @@
import { newSpecPage } from '@stencil/core/testing';
import { MinimalLiveViewport } from '@synchro-charts/core';
import flushPromises from 'flush-promises';
import {
initialize,
SiteWiseDataStreamQuery,
IoTAppKitInitInputs,
AssetSummaryQuery,
AssetModelQuery,
createMockSiteWiseSDK,
} from '@iot-app-kit/core';
import { initialize, SiteWiseDataStreamQuery, IoTAppKitInitInputs, createMockSiteWiseSDK } from '@iot-app-kit/core';
import { IotConnector } from './iot-connector';
import { createMockSource } from '../../testing/createMockSource';
import { update } from '../../testing/update';
import { CustomHTMLElement } from '../../testing/types';
import { DATA_STREAM, DATA_STREAM_2 } from '../../testing/mockWidgetProperties';
import { toSiteWiseAssetProperty } from '../../testing/dataStreamId';
import { Components } from '../../components';
import { AssetSummary, DescribeAssetModelResponse } from '@aws-sdk/client-iotsitewise';
import { DescribeAssetResponse, DescribeAssetModelResponse } from '@aws-sdk/client-iotsitewise';

const createAssetResponse = ({
assetId,
assetModelId,
}: {
assetId: string;
assetModelId: string;
}): DescribeAssetResponse => ({
assetId: assetId,
assetName: `${assetId}-name`,
assetModelId,
assetCreationDate: undefined,
assetLastUpdateDate: undefined,
assetStatus: undefined,
assetHierarchies: [],
assetProperties: [],
assetArn: undefined,
});

const createAssetModelResponse = ({
propertyId,
assetModelId,
}: {
propertyId: string;
assetModelId: string;
}): DescribeAssetModelResponse => ({
assetModelId,
assetModelName: `${assetModelId}-name`,
assetModelDescription: undefined,
assetModelProperties: [
{
id: propertyId,
dataType: 'DOUBLE',
name: 'property-name',
unit: 'm/s',
type: undefined,
},
],
assetModelStatus: undefined,
assetModelCompositeModels: [],
assetModelHierarchies: [],
assetModelCreationDate: undefined,
assetModelLastUpdateDate: undefined,
assetModelArn: undefined,
});

const viewport: MinimalLiveViewport = {
duration: 1000,
Expand Down Expand Up @@ -99,6 +137,7 @@ it('provides data streams', async () => {
it('populates the name, unit, and data type from the asset model information from SiteWise', async () => {
const renderFunc = jest.fn();
const { assetId: assetId_1, propertyId: propertyId_1 } = toSiteWiseAssetProperty(DATA_STREAM.id);
const assetModelId = `${assetId_1}-asset-model`;

await connectorSpecPage(
{
Expand All @@ -112,38 +151,10 @@ it('populates the name, unit, and data type from the asset model information fro
},
{
iotSiteWiseClient: createMockSiteWiseSDK({
describeAsset: ({ assetId }: AssetSummaryQuery) =>
Promise.resolve({
id: assetId,
name: `${assetId}-name`,
assetModelId: `${assetId}-asset-model`,
creationDate: undefined,
lastUpdateDate: undefined,
status: undefined,
hierarchies: [],
arn: undefined,
} as AssetSummary),
describeAssetModel: ({ assetModelId }: AssetModelQuery) =>
Promise.resolve({
assetModelId,
assetModelName: `${assetModelId}-name`,
assetModelDescription: undefined,
assetModelProperties: [
{
id: propertyId_1,
dataType: 'DOUBLE',
name: 'property-name',
unit: 'm/s',
type: undefined,
},
],
assetModelStatus: undefined,
assetModelCompositeModels: [],
assetModelHierarchies: [],
assetModelCreationDate: undefined,
assetModelLastUpdateDate: undefined,
assetModelArn: undefined,
} as DescribeAssetModelResponse),
describeAsset: ({ assetId }) =>
Promise.resolve(createAssetResponse({ assetId: assetId as string, assetModelId })),
describeAssetModel: ({ assetModelId }) =>
Promise.resolve(createAssetModelResponse({ assetModelId: assetModelId as string, propertyId: propertyId_1 })),
}),
}
);
Expand All @@ -162,6 +173,56 @@ it('populates the name, unit, and data type from the asset model information fro
});
});

// TODO: Implement updating behavior to make this test pass.
it.skip('populates the name, unit, and data type from the asset model information from SiteWise when updating the connector', async () => {
const renderFunc = jest.fn();
const { assetId: assetId_1, propertyId: propertyId_1 } = toSiteWiseAssetProperty(DATA_STREAM.id);
const assetModelId = `${assetId_1}-asset-model`;

const { connector, page } = await connectorSpecPage(
{
renderFunc,
queries: [
{
source: 'test-mock',
assets: [],
} as SiteWiseDataStreamQuery,
],
},
{
iotSiteWiseClient: createMockSiteWiseSDK({
describeAsset: ({ assetId }) =>
Promise.resolve(createAssetResponse({ assetId: assetId as string, assetModelId })),
describeAssetModel: ({ assetModelId }) =>
Promise.resolve(createAssetModelResponse({ assetModelId: assetModelId as string, propertyId: propertyId_1 })),
}),
}
);

await flushPromises();

connector.queries = [
{
source: 'test-mock',
assets: [{ assetId: assetId_1, properties: [{ propertyId: propertyId_1 }] }],
} as SiteWiseDataStreamQuery,
];

await page.waitForChanges();
await flushPromises();

expect(renderFunc).lastCalledWith({
dataStreams: [
expect.objectContaining({
id: DATA_STREAM.id,
name: 'property-name',
unit: 'm/s',
dataType: 'NUMBER',
}),
],
});
});

it('updates with new queries', async () => {
const { assetId: assetId_1, propertyId: propertyId_1 } = toSiteWiseAssetProperty(DATA_STREAM.id);
const { assetId: assetId_2, propertyId: propertyId_2 } = toSiteWiseAssetProperty(DATA_STREAM_2.id);
Expand Down
86 changes: 1 addition & 85 deletions packages/core/src/asset-modules/mocks.ts
Original file line number Diff line number Diff line change
@@ -1,98 +1,14 @@
import {
AssetHierarchyQuery,
assetHierarchyQueryKey,
AssetModelQuery,
AssetPropertyValueQuery,
AssetSummaryQuery,
HIERARCHY_ROOT_ID,
HierarchyAssetSummaryList,
isAssetHierarchyQuery,
isAssetModelQuery,
isAssetPropertyValueQuery,
isAssetSummaryQuery,
SiteWiseAssetModuleInterface,
SiteWiseAssetSessionInterface,
} from './sitewise/types';
import {
AssetPropertyValue,
AssetState,
AssetSummary,
DescribeAssetModelResponse,
DescribeAssetResponse,
Quality,
} from '@aws-sdk/client-iotsitewise';
import { AssetPropertyValue, AssetSummary, DescribeAssetModelResponse } from '@aws-sdk/client-iotsitewise';
import { lastValueFrom, Observable, Subscription } from 'rxjs';

export const ASSET_ID = 'assetABC123';
export const ASSET_MODEL_ID = 'assetModelABC123';
export const ASSET_PROPERTY_ID = 'assetPropertyIdAbc123';
export const HIERARCHY_ID = 'hierarchyIdAbc123';
export const creationDate: Date = new Date(2000, 0, 0);
export const lastUpdatedDate: Date = new Date(2021, 0, 0);
export const sampleAssetSummary: AssetSummary = {
id: ASSET_ID,
assetModelId: ASSET_MODEL_ID,
name: 'assetName',
arn: 'arn:assetArn',
creationDate: creationDate,
lastUpdateDate: lastUpdatedDate,
hierarchies: [],
status: {
error: {
code: undefined,
details: undefined,
message: undefined,
},
state: AssetState.ACTIVE,
},
};
export const sampleAssetDescription: DescribeAssetResponse = {
assetId: ASSET_ID,
assetModelId: ASSET_MODEL_ID,
assetName: 'assetName',
assetArn: 'arn:assetArn',
assetCreationDate: creationDate,
assetLastUpdateDate: lastUpdatedDate,
assetHierarchies: [],
assetStatus: {
error: {
code: undefined,
details: undefined,
message: undefined,
},
state: AssetState.ACTIVE,
},
assetCompositeModels: [],
assetProperties: [],
};
export const sampleAssetModel: DescribeAssetModelResponse = {
assetModelId: ASSET_MODEL_ID,
assetModelName: 'Asset Model Name',
assetModelDescription: 'a happy little asset model',
assetModelArn: 'arn:assetModelArn',
assetModelCreationDate: creationDate,
assetModelLastUpdateDate: lastUpdatedDate,
assetModelProperties: [],
assetModelCompositeModels: [],
assetModelHierarchies: [],
assetModelStatus: {
error: {
code: undefined,
details: undefined,
message: undefined,
},
state: AssetState.ACTIVE,
},
};
export const samplePropertyValue: AssetPropertyValue = {
value: { stringValue: undefined, booleanValue: undefined, doubleValue: undefined, integerValue: 1234 },
quality: Quality.GOOD,
timestamp: {
timeInSeconds: 100,
offsetInNanos: 100,
},
};

export class MockSiteWiseAssetsReplayData {
public models: Map<string, DescribeAssetModelResponse> = new Map<string, DescribeAssetModelResponse>();
public hierarchies: Map<string, HierarchyAssetSummaryList> = new Map<string, HierarchyAssetSummaryList>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { SiteWiseAssetTreeModule } from './assetTreeModule';
import { MockSiteWiseAssetModule, MockSiteWiseAssetsReplayData, sampleAssetSummary } from '../mocks';
import { MockSiteWiseAssetModule, MockSiteWiseAssetsReplayData } from '../mocks';
import { HIERARCHY_ROOT_ID, HierarchyAssetSummaryList, LoadingStateEnum } from '../sitewise/types';
import { sampleAssetSummary } from '../../iotsitewise/__mocks__/asset';

it('initializes', () => {
expect(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import {
DescribeAssetModelResponse,
AssetModelProperty,
} from '@aws-sdk/client-iotsitewise';
import { MockSiteWiseAssetSession, MockSiteWiseAssetsReplayData, sampleAssetModel, sampleAssetSummary } from '../mocks';
import { MockSiteWiseAssetSession, MockSiteWiseAssetsReplayData } from '../mocks';
import { sampleAssetModel } from '../../iotsitewise/__mocks__/assetModel';
import { sampleAssetSummary } from '../../iotsitewise/__mocks__/asset';

it('initializes', () => {
let replayData = new MockSiteWiseAssetsReplayData();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,7 @@ import {
SiteWiseAssetTreeQuery,
} from './types';
import { BehaviorSubject, debounceTime, Subject, Subscription } from 'rxjs';
import {
AssetHierarchyQuery,
AssetModelQuery,
HIERARCHY_ROOT_ID,
LoadingStateEnum,
SiteWiseAssetSessionInterface,
} from '../sitewise/types';
import { AssetModelQuery, HIERARCHY_ROOT_ID, LoadingStateEnum, SiteWiseAssetSessionInterface } from '../sitewise/types';
import { AssetPropertyValue, AssetSummary, DescribeAssetModelResponse } from '@aws-sdk/client-iotsitewise';

class Branch {
Expand Down
17 changes: 7 additions & 10 deletions packages/core/src/asset-modules/sitewise/cache.spec.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import { SiteWiseAssetCache } from './cache';
import { LoadingStateEnum } from './types';
import {
ASSET_ID,
ASSET_MODEL_ID,
ASSET_PROPERTY_ID,
HIERARCHY_ID,
sampleAssetDescription,
sampleAssetModel,
sampleAssetSummary,
samplePropertyValue,
} from '../mocks';
import { ASSET_MODEL_ID, sampleAssetModel } from '../../iotsitewise/__mocks__/assetModel';
import { sampleAssetSummary } from '../../iotsitewise/__mocks__/asset';
import { ASSET_ID, sampleAssetDescription } from '../../iotsitewise/__mocks__/asset';
import { samplePropertyValue } from '../../iotsitewise/__mocks__/assetPropertyValue';

const ASSET_PROPERTY_ID = 'assetPropertyIdAbc123';
const HIERARCHY_ID = 'hierarchyIdAbc123';

describe('cacheAssetSummary', () => {
const cache: SiteWiseAssetCache = new SiteWiseAssetCache();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ import {
ListAssociatedAssetsCommandOutput,
} from '@aws-sdk/client-iotsitewise';
import { Observable } from 'rxjs';
import { sampleAssetModel, sampleAssetSummary, samplePropertyValue } from '../mocks';
import { HIERARCHY_ROOT_ID, HierarchyAssetSummaryList, LoadingStateEnum } from './types';
import { sampleAssetModel } from '../../iotsitewise/__mocks__/assetModel';
import { sampleAssetSummary } from '../../iotsitewise/__mocks__/asset';
import { samplePropertyValue } from '../../iotsitewise/__mocks__/assetPropertyValue';

it('initializes', () => {
expect(() => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { SiteWiseAssetModule } from './siteWiseAssetModule';
import { SiteWiseAssetDataSource } from '../../data-module/types';
import { createMockSiteWiseSDK } from '../../common/tests/util';
import { createMockSiteWiseSDK } from '../../iotsitewise/__mocks__/iotsitewiseSDK';
import { createSiteWiseAssetDataSource } from '../../iotsitewise/time-series-data/asset-data-source';
import { ASSET_MODEL } from '../../testing/__mocks__/assetModel';
import { ASSET_SUMMARY, DESCRIBE_ASSET_RESPONSE } from '../../testing/__mocks__/assetSummary';
import { ASSET_MODEL } from '../../iotsitewise/__mocks__/assetModel';
import { ASSET_SUMMARY, DESCRIBE_ASSET_RESPONSE } from '../../iotsitewise/__mocks__/asset';

it('initializes', () => {
expect(() => new SiteWiseAssetModule({} as SiteWiseAssetDataSource)).not.toThrowError();
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/completeDataStreams.spec.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { completeDataStreams } from './completeDataStreams';
import { DATA_STREAM, DATA_STREAM_2 } from './testing/__mocks__/mockWidgetProperties';
import { DATA_STREAM, DATA_STREAM_2 } from './iotsitewise/__mocks__/mockWidgetProperties';
import { toDataStreamId } from './iotsitewise/time-series-data/util/dataStreamId';
import { DataStream } from './data-module/types';
import { ASSET_MODEL } from './testing/__mocks__/assetModel';
import { ASSET_MODEL } from './iotsitewise/__mocks__/assetModel';
import { AssetModelProperty } from '@aws-sdk/client-iotsitewise';

it('returns empty array when provided no data streams or asset models', () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/data-module/IotAppKitDataModule.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import flushPromises from 'flush-promises';
import { DATA_STREAM, DATA_STREAM_INFO, STRING_INFO_1 } from '../testing/__mocks__/mockWidgetProperties';
import { DATA_STREAM, DATA_STREAM_INFO, STRING_INFO_1 } from '../iotsitewise/__mocks__/mockWidgetProperties';
import { DataSource, DataSourceRequest, DataStreamQuery, DataStream } from './types.d';
import { DataPoint, DataStreamInfo } from '@synchro-charts/core';
import { TimeSeriesDataRequest, TimeSeriesDataRequestSettings } from './data-cache/requestTypes';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DataCache } from './dataCacheWrapped';
import { SECOND_IN_MS } from '../../common/time';
import { DATA_STREAM, DATA_STREAM_INFO } from '../../testing/__mocks__/mockWidgetProperties';
import { DATA_STREAM, DATA_STREAM_INFO } from '../../iotsitewise/__mocks__/mockWidgetProperties';
import { DataStreamsStore } from './types';
import { EMPTY_CACHE } from './caching/caching';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { shouldImmediatelyCallRequest } from './shouldImmediatelyCallRequest';

import { MINUTE_IN_MS } from '../../common/time';
import { ALARM_STREAM_INFO, DATA_STREAM_INFO, STRING_INFO_1 } from '../../testing/__mocks__/mockWidgetProperties';
import { ALARM_STREAM_INFO, DATA_STREAM_INFO, STRING_INFO_1 } from '../../iotsitewise/__mocks__/mockWidgetProperties';

describe('whether a request for data should be made immediately', () => {
describe('requests immediately when', () => {
Expand Down

0 comments on commit 5bafe89

Please sign in to comment.