@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
191 lines (179 loc) • 6.03 kB
text/typescript
import { expect } from "chai";
import "mocha";
import { core } from "@mediarithmics/plugins-nodejs-sdk";
import * as request from "supertest";
import * as sinon from "sinon";
import * as rp from "request-promise-native";
import { MyBidOptimizerPlugin } from "../MyPluginImpl";
describe("Test Example BidOptimizer", function() {
// We stub the Gateway calls
const rpMockup: sinon.SinonStub = sinon.stub();
// Activity Analyzer stub
const bidOptimizer: core.BidOptimizerResponse = {
status: "ok",
data: {
id: "1000",
name: "my analyzer",
organisation_id: "1000",
engine_version_id: "123456",
engine_group_id: "com.mediarithmics.visit-analyzer",
engine_artifact_id: "default"
},
count: 1
};
rpMockup
.withArgs(
sinon.match.has(
"uri",
sinon.match(function(value: string) {
return value.match(/\/v1\/bid_optimizers\/(.){1,10}/) !== null;
})
)
)
.returns(bidOptimizer);
// Activity Analyzer properties stub
const bidOptimizerProperties: core.PluginPropertyResponse = {
count: 1,
data: [
{
technical_name: "name",
value: {
value:
"my bid optimizer"
},
property_type: "DATA_FILE",
origin: "STRING",
writable: true,
deletable: true
}
],
status: "ok"
};
rpMockup
.withArgs(
sinon.match.has(
"uri",
sinon.match(function(value: string) {
return (
value.match(/\/v1\/bid_optimizers\/(.){1,10}\/properties/) !==
null
);
})
)
)
.returns(bidOptimizerProperties);
const bidDecisionRequest: core.BidOptimizerRequest = JSON.parse(`
{
"bid_info":{
"media_type":"WEB",
"ad_ex_id":"goo",
"display_network_id":"1014",
"media_id":"site:web:9gag.com",
"content_id":"unknown",
"geo_info":{
"geo_name_id":2972315,
"iso_country":"FR",
"admin1":"B3",
"admin2":"31",
"postal_code":"31000",
"point_name":"Toulouse",
"latitude":48.5735,
"longitude":7.7559
},
"placements":[
{
"placement_id":"plt:goo:c3bd9d8b",
"format":"300x250",
"visibility":"ABOVE_THE_FOLD",
"viewability":[
"goo:10"
],
"sales_conditions":[
{
"id":"4147",
"deal_id":null,
"floor_price":0.1899999976158142
}
],
"creative_id":"2445"
},
{
"placement_id":"plt:goo:c3bd9d8b",
"format":"300x250",
"visibility":"ABOVE_THE_FOLD",
"viewability":[
"goo:10"
],
"sales_conditions":[
{
"id":"4148",
"deal_id":null,
"floor_price":0.1899999976158142
}
],
"creative_id":"1963"
}
]
},
"campaign_info":{
"organisation_id":"1042",
"campaign_id":"1231",
"ad_group_id":"1246",
"currency":"EUR",
"date":"2016-11-15T17:01:43.625+01:00",
"max_bid_price":0.5099999904632568,
"bid_optimizer_id":"37",
"objective_type":"CPA",
"objective_value":1.0,
"imp_count":null,
"avg_win_rate":null,
"avg_bid_price":null,
"avg_winning_price":null,
"avg_delivery_price":null
},
"user_info":{
"global_first_view":null,
"media_first_view":null,
"user_agent_info":{
"form_factor":"PERSONAL_COMPUTER",
"os_family":"WINDOWS",
"browser_family":"IE",
"brand":null,
"model":null,
"os_version":null,
"carrier":null
}
},
"user_campaign_data_bag":null,
"data_feeds":[
]
}`);
it("Check behavior of dummy bid optimizer", function(done) {
// All the magic is here
const plugin = new MyBidOptimizerPlugin();
const runner = new core.TestingPluginRunner(plugin, rpMockup);
// Plugin init
request(runner.plugin.app)
.post("/v1/init")
.send({ authentication_token: "Manny", worker_id: "Calavera" })
.end((err, res) => {
expect(res.status).to.equal(200);
// Plugin log level to debug
request(runner.plugin.app)
.put("/v1/log_level")
.send({ level: "debug" })
.end((err, res) => {
expect(res.status).to.equal(200);
// Activity to process
request(runner.plugin.app)
.post("/v1/bid_decisions")
.send(bidDecisionRequest)
.end((err, res) => {
expect(res.status).to.eq(200);
expect((JSON.parse(res.text) as core.BidOptimizerPluginResponse).bids[0].bid_price).to.be.eq(bidDecisionRequest.campaign_info.max_bid_price);
done();
});
});
});
});
});