'use strict' const { expect } = require('chai') const fixtures = require('../../fixtures/programmatic') const { publishIotData } = require('../../utils/iot') const { confirmCloudWatchLogs } = require('../../utils/misc') const { deployService, removeService } = require('../../utils/integration') describe('AWS - IoT Integration Test', function () { this.timeout(1000 * 60 * 100) // Involves time-taking deploys let iotTopic let serviceDir let stackName before(async () => { const serviceData = await fixtures.setup('iot') ;({ servicePath: serviceDir } = serviceData) const serviceName = serviceData.serviceConfig.service iotTopic = `${serviceName}/test` stackName = `${serviceName}-dev` return deployService(serviceDir) }) after(() => { // Topics are ephemeral and IoT endpoint is part of the account return removeService(serviceDir) }) describe('Basic Setup', () => { it('should invoke on a topic message matching the rule', async () => { const functionName = 'iotBasic' const message = JSON.stringify({ message: 'Hello from IoT!' }) // NOTE: This test may fail on fresh accounts where the IoT endpoint has not completed provisioning const events = await confirmCloudWatchLogs( `/aws/lambda/${stackName}-${functionName}`, async () => publishIotData(iotTopic, message), { checkIsComplete: (soFarEvents) => { const logs = soFarEvents.reduce( (data, event) => data + event.message, '', ) return logs.includes(message) }, }, ) const logs = events.reduce((data, event) => data + event.message, '') expect(logs).to.include(message) }) }) })