import chai from "chai"; import sinon from "sinon"; import { DVCheckCmd, FraudType } from "../../../src/models/dvFraud.model"; import { FraudController } from "../../../src/controllers/FraudController"; import { DVFraudService } from "../../../src/services/dvFraud.service"; const expect = chai.expect; describe("FraudController", () => { describe("check-fraud", () => { let fraudController: FraudController; let dvFraudService: DVFraudService; beforeEach(() => { dvFraudService = new DVFraudService(); fraudController = new FraudController(dvFraudService); }); it("should return not fraud for a single app", async () => { const fakeCmd: any = {}; const fakeGetAppCmd = sinon.fake(() => fakeCmd); sinon.replace(dvFraudService, "getAppCmd", fakeGetAppCmd); const fakeIsBlacklisted = sinon.fake(async () => createFakeDVCheckResult(false)); sinon.replace(dvFraudService, "isBlacklisted", fakeIsBlacklisted); const output = await fraudController.checkFraud({ android: "facebook.com" }); expect(output).to.deep.equal({ android: { "facebook.com": false, }, ios: undefined, web: undefined, }); expect(fakeGetAppCmd.callCount).to.equal(1); expect(fakeGetAppCmd.firstCall.args[0]).to.equal("facebook.com"); expect(fakeIsBlacklisted.callCount).to.equal(1); expect(fakeIsBlacklisted.firstCall.args[0]).to.equal(fakeCmd); }); it("should return fraud for a single app", async () => { const fakeCmd: any = {}; const fakeGetAppCmd = sinon.fake(() => fakeCmd); sinon.replace(dvFraudService, "getAppCmd", fakeGetAppCmd); const fakeIsBlacklisted = sinon.fake(async () => createFakeDVCheckResult(true)); sinon.replace(dvFraudService, "isBlacklisted", fakeIsBlacklisted); const output = await fraudController.checkFraud({ android: "facebook.com" }); expect(output).to.deep.equal({ android: { "facebook.com": true, }, ios: undefined, web: undefined, }); expect(fakeGetAppCmd.callCount).to.equal(1); expect(fakeGetAppCmd.firstCall.args[0]).to.equal("facebook.com"); expect(fakeIsBlacklisted.callCount).to.equal(1); expect(fakeIsBlacklisted.firstCall.args[0]).to.equal(fakeCmd); }); it("should return results for multiple apps", async () => { const expectedOutput = { android: { "facebook.com": true, "google.com": false, }, ios: { "9012348934": false, "0934984": true, "1439949382": false, }, web: { "ogury.co": true, "wp.pl": true, "whatever.com": false, }, }; const fakeIsBlacklisted = sinon.fake(async (cmd: any) => { const expected: any = expectedOutput; return createFakeDVCheckResult( expected.android[cmd.toCheck] || expected.ios[cmd.toCheck] || expected.web[cmd.toCheck] ); }); sinon.replace(dvFraudService, "isBlacklisted", fakeIsBlacklisted); const output = await fraudController.checkFraud({ android: "facebook.com,google.com", ios: "1439949382,0934984,9012348934", web: "wp.pl,whatever.com,ogury.co", }); expect(output).to.deep.equal(expectedOutput); }); }); }); const createFakeDVCheckResult = (isFraud: boolean) => ({ fraudType: FraudType.APP_BUNDLE, isFraud, hash: { bytes: Buffer.from("123"), decimal: "123" }, });