UNPKG

@ngageoint/mage.sftp.service

Version:

The SFTP service package is a MAGE server plugin that sends observations to and SFTP location on create and update.

498 lines 29 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const entities_events_1 = require("@ngageoint/mage.service/lib/entities/events/entities.events"); const entities_events_forms_1 = require("@ngageoint/mage.service/lib/entities/events/entities.events.forms"); const entities_observations_1 = require("@ngageoint/mage.service/lib/entities/observations/entities.observations"); const adapters_sftp_mongoose_1 = require("../adapters/adapters.sftp.mongoose"); const adapters_sftp_teams_1 = require("../adapters/adapters.sftp.teams"); const SFTPPluginConfig_1 = require("../configuration/SFTPPluginConfig"); const controller_1 = require("./controller"); const ssh2_sftp_client_1 = __importDefault(require("ssh2-sftp-client")); const entities_format_1 = require("../format/entities.format"); const archiver_1 = __importDefault(require("archiver")); function newEvent(id) { return { id, acl: {}, feedIds: [], forms: [{ id: 1, archived: false, color: 'blue', fields: [ { id: 1, name: 'field1', required: false, title: 'Attachments', type: entities_events_forms_1.FormFieldType.Attachment, } ], name: 'Image Plugin Test', userFields: [] }], layerIds: [], name: `Event ${id}`, style: {}, }; } function newObservation(event, lastModified) { return { id: "1", eventId: event.id, userId: "test", createdAt: new Date(1), lastModified: lastModified, attachments: [], favoriteUserIds: [], states: [], type: 'Feature', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { timestamp: new Date(1), forms: [] } }; } function newArchiver(status) { return { createArchive: () => __awaiter(this, void 0, void 0, function* () { return new entities_format_1.ArchiveResult((0, archiver_1.default)('zip'), status); }) }; } describe('automated processing', () => { class TestPluginStateRepository { constructor() { this.state = null; } get() { return __awaiter(this, void 0, void 0, function* () { return this.state; }); } put(x) { return __awaiter(this, void 0, void 0, function* () { this.state = Object.assign({}, x); return this.state; }); } patch(state) { return __awaiter(this, void 0, void 0, function* () { throw new Error('unimplemented'); }); } } let event1; let event2; let allEvents; let stateRepository; let eventObservationRepositories; let observationRepository; let clock; let dbConnection; let attachmentStore; beforeEach(() => { event1 = new entities_events_1.MageEvent(newEvent(1)); event2 = new entities_events_1.MageEvent(newEvent(2)); allEvents = new Map().set(event1.id, event1).set(event2.id, event2); eventObservationRepositories = new Map([ [event1.id, jasmine.createSpyObj(`observationRepository-${event1.id}`, ['findById', 'findLastModifiedAfter'])], [event2.id, jasmine.createSpyObj(`observationRepository-${event2.id}`, ['findById', 'findLastModifiedAfter'])] ]); observationRepository = (event) => __awaiter(void 0, void 0, void 0, function* () { const repository = eventObservationRepositories.get(event); if (repository) { return repository; } throw new Error(`no observation repository for event ${event}`); }); stateRepository = new TestPluginStateRepository(); clock = jasmine.clock().install(); spyOn(fs_1.default, 'readFileSync').and.returnValue(Buffer.from('mock ssh key content')); // Create a spy on the SFTPClient constructor spyOn(ssh2_sftp_client_1.default.prototype, 'connect').and.resolveTo(); spyOn(ssh2_sftp_client_1.default.prototype, 'put').and.resolveTo(); spyOn(ssh2_sftp_client_1.default.prototype, 'end').and.resolveTo(); dbConnection = { model: jasmine.createSpy('model').and.returnValue(null), }; attachmentStore = jasmine.createSpyObj('attachmentStore', ['readContent', 'readThumbnailContent']); }); afterEach(() => { clock.uninstall(); }); it('waits for the current processing interval to finish then stops', () => __awaiter(void 0, void 0, void 0, function* () { const eventRepository = jasmine.createSpyObj('eventRepository', ['findActiveEvents']); eventRepository.findActiveEvents.and.resolveTo([]); const userRepository = jasmine.createSpyObj('userRepository', ['findById']); userRepository.findById.and.resolveTo(null); stateRepository.state = Object.assign(Object.assign({}, SFTPPluginConfig_1.defaultSFTPPluginConfig), { interval: 10, enabled: true }); const clockTickMillis = stateRepository.state.interval * 1000 + 1; spyOn(entities_format_1.ArchiverFactory.prototype, 'createArchiver').and.returnValue(newArchiver(entities_format_1.ArchiveStatus.Complete)); const controller = new controller_1.SftpController(console, { stateRepository, eventRepository, observationRepository, userRepository, attachmentStore }, dbConnection); yield controller.start(); clock.tick(clockTickMillis); yield controller.stop(); clock.tick(clockTickMillis); clock.tick(clockTickMillis); yield new Promise(resolve => { setTimeout(resolve); clock.tick(clockTickMillis); }); expect(eventRepository.findActiveEvents).toHaveBeenCalledTimes(1); })); it('finds no observations to process', () => __awaiter(void 0, void 0, void 0, function* () { var _a, _b, _c, _d; const eventRepository = jasmine.createSpyObj('eventRepository', ['findActiveEvents']); eventRepository.findActiveEvents.and.resolveTo(Array.from(allEvents.values()).map(entities_events_1.copyMageEventAttrs)); const page = { totalCount: 0, pageSize: 0, pageIndex: 0, items: [] }; (_a = eventObservationRepositories.get(event1.id)) === null || _a === void 0 ? void 0 : _a.findLastModifiedAfter.and.resolveTo(page); (_b = eventObservationRepositories.get(event2.id)) === null || _b === void 0 ? void 0 : _b.findLastModifiedAfter.and.resolveTo(page); stateRepository.state = Object.assign(Object.assign({}, SFTPPluginConfig_1.defaultSFTPPluginConfig), { interval: 10, enabled: true }); const clockTickMillis = stateRepository.state.interval * 1000 + 1; const userRepository = jasmine.createSpyObj('userRepository', ['findById']); userRepository.findById.and.resolveTo(null); const findAllSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findAllByStatus').and.resolveTo([]); const findLatestSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findLatest').and.resolveTo(null); spyOn(adapters_sftp_teams_1.MongooseTeamsRepository.prototype, 'findTeamsByUserId').and.resolveTo([]); spyOn(entities_format_1.ArchiverFactory.prototype, 'createArchiver').and.returnValue(newArchiver(entities_format_1.ArchiveStatus.Complete)); const controller = new controller_1.SftpController(console, { stateRepository, eventRepository, observationRepository, userRepository, attachmentStore }, dbConnection); yield controller.start(); clock.tick(clockTickMillis); yield controller.stop(); expect(eventRepository.findActiveEvents).toHaveBeenCalledTimes(1); expect(findAllSpy).toHaveBeenCalledTimes(2); expect((_c = eventObservationRepositories.get(event1.id)) === null || _c === void 0 ? void 0 : _c.findLastModifiedAfter).toHaveBeenCalledTimes(1); expect((_d = eventObservationRepositories.get(event2.id)) === null || _d === void 0 ? void 0 : _d.findLastModifiedAfter).toHaveBeenCalledTimes(1); })); it('processes pending observations with success', () => __awaiter(void 0, void 0, void 0, function* () { var _e, _f, _g; const eventRepository = jasmine.createSpyObj('eventRepository', ['findActiveEvents']); eventRepository.findActiveEvents.and.resolveTo([(0, entities_events_1.copyMageEventAttrs)(event1)]); const observation = newObservation(event1, new Date(1)); (_e = eventObservationRepositories.get(event1.id)) === null || _e === void 0 ? void 0 : _e.findById.and.resolveTo(entities_observations_1.Observation.evaluate(observation, event1)); (_f = eventObservationRepositories.get(event1.id)) === null || _f === void 0 ? void 0 : _f.findLastModifiedAfter.and.resolveTo({ totalCount: 0, pageSize: 0, pageIndex: 0, items: [] }); stateRepository.state = Object.assign(Object.assign({}, SFTPPluginConfig_1.defaultSFTPPluginConfig), { interval: 10, enabled: true }); const clockTickMillis = stateRepository.state.interval * 1000 + 1; const userRepository = jasmine.createSpyObj('userRepo', ['findById']); userRepository.findById.and.resolveTo(null); const findAllSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findAllByStatus').and.resolveTo([{ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.PENDING, createdAt: 1, updatedAt: 1 }]); const postStatusSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'postStatus').and.resolveTo({ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.SUCCESS, createdAt: 1, updatedAt: 1 }); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findLatest').and.resolveTo(null); spyOn(adapters_sftp_teams_1.MongooseTeamsRepository.prototype, 'findTeamsByUserId').and.resolveTo([]); spyOn(entities_format_1.ArchiverFactory.prototype, 'createArchiver').and.returnValue(newArchiver(entities_format_1.ArchiveStatus.Complete)); const controller = new controller_1.SftpController(console, { stateRepository, eventRepository, observationRepository, userRepository, attachmentStore }, dbConnection); yield controller.start(); clock.tick(clockTickMillis); yield controller.stop(); expect(eventRepository.findActiveEvents).toHaveBeenCalledTimes(1); expect(findAllSpy).toHaveBeenCalledTimes(1); expect((_g = eventObservationRepositories.get(event1.id)) === null || _g === void 0 ? void 0 : _g.findLastModifiedAfter).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledWith(event1.id, observation.id, adapters_sftp_mongoose_1.SftpStatus.SUCCESS); })); it('processes pending observations with success before attachment timeout', () => __awaiter(void 0, void 0, void 0, function* () { var _h, _j, _k; const eventRepository = jasmine.createSpyObj('eventRepository', ['findActiveEvents']); eventRepository.findActiveEvents.and.resolveTo([(0, entities_events_1.copyMageEventAttrs)(event1)]); const observation = newObservation(event1, new Date()); (_h = eventObservationRepositories.get(event1.id)) === null || _h === void 0 ? void 0 : _h.findById.and.resolveTo(entities_observations_1.Observation.evaluate(observation, event1)); (_j = eventObservationRepositories.get(event1.id)) === null || _j === void 0 ? void 0 : _j.findLastModifiedAfter.and.resolveTo({ totalCount: 0, pageSize: 0, pageIndex: 0, items: [] }); stateRepository.state = Object.assign(Object.assign({}, SFTPPluginConfig_1.defaultSFTPPluginConfig), { interval: 10, enabled: true }); const clockTickMillis = stateRepository.state.interval * 1000 + 1; const teamRepo = jasmine.createSpyObj('teamRepo', ['findTeamsByUserId']); teamRepo.findTeamsByUserId.and.resolveTo([]); const userRepository = jasmine.createSpyObj('userRepo', ['findById']); userRepository.findById.and.resolveTo(null); const findAllSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findAllByStatus').and.resolveTo([{ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.PENDING, createdAt: 1, updatedAt: 1 }]); const postStatusSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'postStatus').and.resolveTo({ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.SUCCESS, createdAt: 1, updatedAt: 1 }); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findLatest').and.resolveTo(null); spyOn(adapters_sftp_teams_1.MongooseTeamsRepository.prototype, 'findTeamsByUserId').and.resolveTo([]); spyOn(entities_format_1.ArchiverFactory.prototype, 'createArchiver').and.returnValue(newArchiver(entities_format_1.ArchiveStatus.Complete)); const controller = new controller_1.SftpController(console, { stateRepository, eventRepository, observationRepository, userRepository, attachmentStore }, dbConnection); yield controller.start(); clock.tick(clockTickMillis); yield controller.stop(); expect(eventRepository.findActiveEvents).toHaveBeenCalledTimes(1); expect(findAllSpy).toHaveBeenCalledTimes(1); expect((_k = eventObservationRepositories.get(event1.id)) === null || _k === void 0 ? void 0 : _k.findLastModifiedAfter).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledWith(event1.id, observation.id, adapters_sftp_mongoose_1.SftpStatus.SUCCESS); })); it('processes pending observations after attachment timeout', () => __awaiter(void 0, void 0, void 0, function* () { var _l, _m, _o; stateRepository.state = Object.assign(Object.assign({}, SFTPPluginConfig_1.defaultSFTPPluginConfig), { interval: 10, enabled: true }); const clockTickMillis = stateRepository.state.interval * 1000 + 1; const eventRepository = jasmine.createSpyObj('eventRepository', ['findActiveEvents']); eventRepository.findActiveEvents.and.resolveTo([(0, entities_events_1.copyMageEventAttrs)(event1)]); const observation = newObservation(event1, new Date(Date.now() + stateRepository.state.initiation.timeout + 1)); (_l = eventObservationRepositories.get(event1.id)) === null || _l === void 0 ? void 0 : _l.findById.and.resolveTo(entities_observations_1.Observation.evaluate(observation, event1)); (_m = eventObservationRepositories.get(event1.id)) === null || _m === void 0 ? void 0 : _m.findLastModifiedAfter.and.resolveTo({ totalCount: 0, pageSize: 0, pageIndex: 0, items: [] }); const userRepository = jasmine.createSpyObj('userRepo', ['findById']); userRepository.findById.and.resolveTo(null); const findAllSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findAllByStatus').and.resolveTo([{ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.PENDING, createdAt: 1, updatedAt: 1 }]); const postStatusSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'postStatus').and.resolveTo({ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.SUCCESS, createdAt: 1, updatedAt: 1 }); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findLatest').and.resolveTo(null); spyOn(entities_format_1.ArchiverFactory.prototype, 'createArchiver').and.returnValue(newArchiver(entities_format_1.ArchiveStatus.Incomplete)); spyOn(adapters_sftp_teams_1.MongooseTeamsRepository.prototype, 'findTeamsByUserId').and.resolveTo([]); const controller = new controller_1.SftpController(console, { stateRepository, eventRepository, observationRepository, userRepository, attachmentStore }, dbConnection); yield controller.start(); clock.tick(clockTickMillis); yield controller.stop(); expect(eventRepository.findActiveEvents).toHaveBeenCalledTimes(1); expect(findAllSpy).toHaveBeenCalledTimes(1); expect((_o = eventObservationRepositories.get(event1.id)) === null || _o === void 0 ? void 0 : _o.findLastModifiedAfter).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledWith(event1.id, observation.id, adapters_sftp_mongoose_1.SftpStatus.SUCCESS); })); it('processes new observations w/ create trigger', () => __awaiter(void 0, void 0, void 0, function* () { var _p, _q, _r; stateRepository.state = Object.assign(Object.assign({}, SFTPPluginConfig_1.defaultSFTPPluginConfig), { interval: 10, enabled: true }); const clockTickMillis = stateRepository.state.interval * 1000 + 1; const eventRepository = jasmine.createSpyObj('eventRepository', ['findActiveEvents']); eventRepository.findActiveEvents.and.resolveTo([(0, entities_events_1.copyMageEventAttrs)(event1)]); const observation = newObservation(event1, new Date()); (_p = eventObservationRepositories.get(event1.id)) === null || _p === void 0 ? void 0 : _p.findById.and.resolveTo(entities_observations_1.Observation.evaluate(observation, event1)); (_q = eventObservationRepositories.get(event1.id)) === null || _q === void 0 ? void 0 : _q.findLastModifiedAfter.and.resolveTo({ totalCount: 1, pageSize: 10, pageIndex: 0, items: [observation] }); const userRepository = jasmine.createSpyObj('userRepo', ['findById']); userRepository.findById.and.resolveTo(null); const findAllSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findAllByStatus').and.resolveTo([]); const postStatusSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'postStatus').and.resolveTo({ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.SUCCESS, createdAt: 1, updatedAt: 1 }); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findLatest').and.resolveTo(null); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'isProcessed').and.resolveTo(false); spyOn(adapters_sftp_teams_1.MongooseTeamsRepository.prototype, 'findTeamsByUserId').and.resolveTo([]); const archiverSpy = jasmine.createSpyObj('archiver', ['createArchive']); archiverSpy.createArchive.and.resolveTo(entities_format_1.ArchiveResult.complete((0, archiver_1.default)('zip'))); spyOn(entities_format_1.ArchiverFactory.prototype, 'createArchiver').and.returnValue(archiverSpy); const controller = new controller_1.SftpController(console, { stateRepository, eventRepository, observationRepository, userRepository, attachmentStore }, dbConnection); yield controller.start(); clock.tick(clockTickMillis); yield controller.stop(); expect(eventRepository.findActiveEvents).toHaveBeenCalledTimes(1); expect(findAllSpy).toHaveBeenCalledTimes(1); expect((_r = eventObservationRepositories.get(event1.id)) === null || _r === void 0 ? void 0 : _r.findLastModifiedAfter).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledWith(event1.id, observation.id, adapters_sftp_mongoose_1.SftpStatus.SUCCESS); expect(archiverSpy.createArchive).toHaveBeenCalled(); })); it('processes updated observations w/ create/update trigger', () => __awaiter(void 0, void 0, void 0, function* () { var _s, _t, _u; stateRepository.state = Object.assign(Object.assign({}, SFTPPluginConfig_1.defaultSFTPPluginConfig), { interval: 10, enabled: true }); const clockTickMillis = stateRepository.state.interval * 1000 + 1; const eventRepository = jasmine.createSpyObj('eventRepository', ['findActiveEvents']); eventRepository.findActiveEvents.and.resolveTo([(0, entities_events_1.copyMageEventAttrs)(event1)]); const observation = newObservation(event1, new Date()); (_s = eventObservationRepositories.get(event1.id)) === null || _s === void 0 ? void 0 : _s.findById.and.resolveTo(entities_observations_1.Observation.evaluate(observation, event1)); (_t = eventObservationRepositories.get(event1.id)) === null || _t === void 0 ? void 0 : _t.findLastModifiedAfter.and.resolveTo({ totalCount: 1, pageSize: 10, pageIndex: 0, items: [observation] }); const userRepository = jasmine.createSpyObj('userRepo', ['findById']); userRepository.findById.and.resolveTo(null); const findAllSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findAllByStatus').and.resolveTo([]); const postStatusSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'postStatus').and.resolveTo({ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.SUCCESS, createdAt: 1, updatedAt: 1 }); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findLatest').and.resolveTo(null); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'isProcessed').and.resolveTo(false); spyOn(adapters_sftp_teams_1.MongooseTeamsRepository.prototype, 'findTeamsByUserId').and.resolveTo([]); const archiverSpy = jasmine.createSpyObj('archiver', ['createArchive']); archiverSpy.createArchive.and.resolveTo(entities_format_1.ArchiveResult.complete((0, archiver_1.default)('zip'))); spyOn(entities_format_1.ArchiverFactory.prototype, 'createArchiver').and.returnValue(archiverSpy); const controller = new controller_1.SftpController(console, { stateRepository, eventRepository, observationRepository, userRepository, attachmentStore }, dbConnection); yield controller.start(); clock.tick(clockTickMillis); yield controller.stop(); expect(eventRepository.findActiveEvents).toHaveBeenCalledTimes(1); expect(findAllSpy).toHaveBeenCalledTimes(1); expect((_u = eventObservationRepositories.get(event1.id)) === null || _u === void 0 ? void 0 : _u.findLastModifiedAfter).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledWith(event1.id, observation.id, adapters_sftp_mongoose_1.SftpStatus.SUCCESS); expect(archiverSpy.createArchive).toHaveBeenCalled(); })); it('skips processing of updated observations w/ create trigger', () => __awaiter(void 0, void 0, void 0, function* () { var _v, _w, _x; stateRepository.state = Object.assign(Object.assign({}, SFTPPluginConfig_1.defaultSFTPPluginConfig), { interval: 10, enabled: true, initiation: { rule: entities_format_1.TriggerRule.Create, timeout: 60 } }); const clockTickMillis = stateRepository.state.interval * 1000 + 1; const eventRepository = jasmine.createSpyObj('eventRepository', ['findActiveEvents']); eventRepository.findActiveEvents.and.resolveTo([(0, entities_events_1.copyMageEventAttrs)(event1)]); const observation = newObservation(event1, new Date()); (_v = eventObservationRepositories.get(event1.id)) === null || _v === void 0 ? void 0 : _v.findById.and.resolveTo(entities_observations_1.Observation.evaluate(observation, event1)); (_w = eventObservationRepositories.get(event1.id)) === null || _w === void 0 ? void 0 : _w.findLastModifiedAfter.and.resolveTo({ totalCount: 1, pageSize: 10, pageIndex: 0, items: [observation] }); const userRepository = jasmine.createSpyObj('userRepo', ['findById']); userRepository.findById.and.resolveTo(null); const findAllSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findAllByStatus').and.resolveTo([]); const postStatusSpy = spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'postStatus').and.resolveTo({ eventId: event1.id, observationId: observation.id, status: adapters_sftp_mongoose_1.SftpStatus.SUCCESS, createdAt: 1, updatedAt: 1 }); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'findLatest').and.resolveTo(null); spyOn(adapters_sftp_mongoose_1.MongooseSftpObservationRepository.prototype, 'isProcessed').and.resolveTo(true); spyOn(adapters_sftp_teams_1.MongooseTeamsRepository.prototype, 'findTeamsByUserId').and.resolveTo([]); const archiverSpy = jasmine.createSpyObj('archiver', ['createArchive']); archiverSpy.createArchive.and.resolveTo(entities_format_1.ArchiveResult.complete((0, archiver_1.default)('zip'))); spyOn(entities_format_1.ArchiverFactory.prototype, 'createArchiver').and.returnValue(archiverSpy); const controller = new controller_1.SftpController(console, { stateRepository, eventRepository, observationRepository, userRepository, attachmentStore }, dbConnection); yield controller.start(); clock.tick(clockTickMillis); yield controller.stop(); expect(eventRepository.findActiveEvents).toHaveBeenCalledTimes(1); expect(findAllSpy).toHaveBeenCalledTimes(1); expect((_x = eventObservationRepositories.get(event1.id)) === null || _x === void 0 ? void 0 : _x.findLastModifiedAfter).toHaveBeenCalledTimes(1); expect(postStatusSpy).toHaveBeenCalledTimes(0); expect(archiverSpy.createArchive).toHaveBeenCalledTimes(0); })); // it('skips processed observations w/ create trigger', async () => { // }) // it('waits for observations to contain all attachments', async () => { // }) // it('processes incomplete observation after timeout', async () => { // }) }); //# sourceMappingURL=controller.spec.js.map