@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
JavaScript
"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