@mediarithmics/plugins-nodejs-sdk
Version:
This is the mediarithmics nodejs to help plugin developers bootstrapping their plugin without having to deal with most of the plugin boilerplate
204 lines (185 loc) • 7.29 kB
text/typescript
import { expect } from "chai";
import "mocha";
import { core } from "../";
import * as request from "supertest";
import * as sinon from "sinon";
import * as mockery from "mockery";
import * as rp from "request-promise-native";
describe("Fetch DisplayAd API", () => {
let requestPromiseProx: sinon.SinonStub = sinon
.stub()
.returns(Promise.resolve("Yolo"));
class MyFakeAdRenderer extends core.AdRendererBasePlugin<
core.AdRendererBaseInstanceContext
> {
protected async onAdContents(
request: core.AdRendererRequest,
instanceContext: core.AdRendererBaseInstanceContext
) {
const result: core.AdRendererPluginResponse = {
html: `All your HTML is belong to us.`
};
return Promise.resolve(result);
}
}
//All the magic is here
const plugin = new MyFakeAdRenderer();
const runner = new core.TestingPluginRunner(plugin, requestPromiseProx);
it("Check that creativeId is passed correctly in fetchDisplayAd", function(
done
) {
const fakeCreativeId = "422";
// Creative stub
const creative: core.ResponseData<core.DisplayAd> = {
status: "ok",
data: {
type: "DISPLAY_AD",
id: "422",
organisation_id: "1126",
name: "Toto",
technical_name: "hello",
archived: false,
editor_version_id: "5",
editor_version_value: "1.0.0",
editor_group_id: "com.mediarithmics.creative.display",
editor_artifact_id: "default-editor",
editor_plugin_id: "5",
renderer_version_id: "1054",
renderer_version_value: "1.0.0",
renderer_group_id: "com.trololo.creative.display",
renderer_artifact_id: "multi-advertisers-display-ad-renderer",
renderer_plugin_id: "1041",
creation_date: 1492785056278,
subtype: "BANNER",
format: "300x250"
}
};
requestPromiseProx
.withArgs(
sinon.match.has("uri", sinon.match(/\/v1\/creatives\/(.){1,10}$/))
)
.returns(creative);
// We try a call to the Gateway
plugin.fetchDisplayAd(fakeCreativeId).then(() => {
expect(requestPromiseProx.args[0][0].uri).to.be.eq(
`${plugin.outboundPlatformUrl}/v1/creatives/${fakeCreativeId}`
);
done();
});
});
it("Check that fakeCreativeId is passed correctly in fetchDisplayAdProperties", function(
done
) {
const fakeCreativeId = "4255";
// We try a call to the Gateway
plugin.fetchDisplayAdProperties(fakeCreativeId).then(() => {
expect(requestPromiseProx.args[1][0].uri).to.be.eq(
`${plugin.outboundPlatformUrl}/v1/creatives/${fakeCreativeId}/renderer_properties`
);
done();
});
});
});
describe("Ad Contents API test", function() {
// Fake AdRenderer with dummy processing
class MyFakeAdRenderer2 extends core.AdRendererBasePlugin<
core.AdRendererBaseInstanceContext
> {
protected async onAdContents(
request: core.AdRendererRequest,
instanceContext: core.AdRendererBaseInstanceContext
) {
const response: core.AdRendererPluginResponse = {
html: request.call_id
};
return Promise.resolve(response);
}
}
const plugin = new MyFakeAdRenderer2();
it("Check that the plugin is giving good results with a simple adContents handler", function(
done
) {
const rpMockup = sinon.stub();
rpMockup.onCall(0).returns(
new Promise((resolve, reject) => {
const pluginInfo: core.ResponseData<core.Creative> = {
status: "ok",
data: {
type: "DISPLAY_AD",
id: "7168",
organisation_id: "1126",
name: "Toto",
technical_name: "hello",
archived: false,
editor_version_id: "5",
editor_version_value: "1.0.0",
editor_group_id: "com.mediarithmics.creative.display",
editor_artifact_id: "default-editor",
editor_plugin_id: "5",
renderer_version_id: "1054",
renderer_version_value: "1.0.0",
renderer_group_id: "com.trololo.creative.display",
renderer_artifact_id: "multi-advertisers-display-ad-renderer",
renderer_plugin_id: "1041",
creation_date: 1492785056278,
subtype: "BANNER"
}
};
resolve(pluginInfo);
})
);
rpMockup.onCall(1).returns(
new Promise((resolve, reject) => {
const pluginInfo: core.PluginPropertyResponse = {
status: "ok",
count: 45,
data: [
{
technical_name: "hello_world",
value: {
value: "Yay"
},
property_type: "STRING",
origin: "PLUGIN",
writable: true,
deletable: false
}
]
};
resolve(pluginInfo);
})
);
const runner = new core.TestingPluginRunner(plugin, rpMockup);
request(runner.plugin.app)
.post("/v1/init")
.send({ authentication_token: "Manny", worker_id: "Calavera" })
.end((err, res) => {
expect(res.status).to.equal(200);
});
const requestBody = JSON.parse(`{
"call_id":"auc:goo:58346725000689de0a16ac4f120ecc41-0",
"context":"LIVE",
"creative_id":"2757",
"campaign_id":"1537",
"ad_group_id":"1622",
"protocol":"https",
"user_agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; MALCJS; rv:11.0) like Gecko",
"user_agent_info":{"form_factor":"PERSONAL_COMPUTER","os_family":"WINDOWS","browser_family":"IE","brand":null,"model":null,"os_version":null,"carrier":null},
"placeholder_id":"mics_ed54e0e",
"user_campaign_id":"toto",
"click_urls":["https://ads.mediarithmics.com/ads/event?caid=auc%3Agoo%3A58346725000689de0a16ac4f120ecc41-0&ctx=LIVE&tid=1093&gid=1622&rid=2757&uaid=tech%3Agoo%3ACAESEANnikq25sbChKLHU7-o7ls&type=clk&ctid=%7B%7BMICS_AD_CONTENT_ID%7D%7D&redirect=","https://adclick.g.doubleclick.net/aclk?sa=L&ai=CDypOJWc0WN6TGs_YWsGYu5AB4Kmf9UbfuK_coAPAjbcBEAEgAGDVjdOCvAiCARdjYS1wdWItNjE2Mzg1Nzk5Mjk1Njk2NMgBCakCNKXJyWPNsT7gAgCoAwGqBOkBT9DCltAKPa0ltaiH2E0CxRF2Jee8ykOBqRGHBbE8aYS7jODKKPHE3KkGbenZXwSan1UZekvmuIfSdRUg6DFQhnbJnMR_bK57BQlMaMnmd71MXTv6P9Hh0m5cuoj7SlpOoyMX9IG8mNomIve031sZUPKOb5QA_tVKhtrlnm2hYJ7KSVZJH_83YmpK_ShxuxIwiAwQKMhYBnM4tnbvEinl3fROiwH1FFNOlqNJPaNgU4z9kEGCHIpj3RLErIcrxmT5OFLZ3q5AELXCYBJP1zB-UvscTkLrfc3Vl-sOe5f5_Tkkn-MpcijM_Z_gBAGABvDqk_ivqMjMFaAGIagHpr4b2AcA0ggFCIBhEAE&num=1&sig=AOD64_3iMhOr3Xh-A4bP1jvMzeEMGFfwtw&client=ca-pub-6163857992956964&adurl="],
"display_tracking_url":"https://ads.mediarithmics.com/ads/event?caid=auc%3Agoo%3A58346725000689de0a16ac4f120ecc41-0&ctx=LIVE&tid=1093&gid=1622&rid=2757&uaid=tech%3Agoo%3ACAESEANnikq25sbChKLHU7-o7ls&type=imp&vid=4080&cb=ef3933a2-591b-4b1e-8fe2-4d9fd75980c4",
"latitude":null,
"longitude":null,
"restrictions":{"animation_max_duration":25}
}`);
request(runner.plugin.app)
.post("/v1/ad_contents")
.send(requestBody)
.end(function(err, res) {
expect(res.status).to.equal(200);
expect(res.text).to.be.eq(requestBody.call_id);
done();
});
});
});