debian-mirror-gitlab/snowplow-javascript-tracker/core/tests/unit/core.js

748 lines
19 KiB
JavaScript

/*
* JavaScript tracker core for Snowplow: tests/integration.js
*
* Copyright (c) 2014-2016 Snowplow Analytics Ltd. All rights reserved.
*
* This program is licensed to you under the Apache License Version 2.0,
* and you may not use this file except in compliance with the Apache License Version 2.0.
* You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the Apache License Version 2.0 is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
*/
define([
"intern!object",
"intern/chai!assert",
"intern/chai!expect",
"intern/dojo/node!../../lib/core.js"
], function (registerSuite, assert, expect, core) {
var unstructEventSchema = 'iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0';
var tracker = core.trackerCore(false);
// Doesn't check true timestamp
function compare(result, expected, message) {
result = result.build();
assert.ok(result['eid'], 'A UUID should be attached to all events');
delete result['eid'];
assert.ok(result['dtm'], 'A timestamp should be attached to all events');
delete result['dtm'];
assert.deepEqual(result, expected, message);
}
registerSuite({
name: "Tracking events",
"Track a page view": function () {
var url = 'http://www.example.com';
var page = 'title page';
var expected = {
e: 'pv',
url: url,
page: page
};
compare(tracker.trackPageView(url, page), expected, 'A page view should be tracked correctly');
},
"Track a page ping": function () {
var url = 'http://www.example.com';
var referer = 'http://www.google.com';
var expected = {
e: 'pp',
url: url,
refr: referer,
pp_mix: '1',
pp_max: '2',
pp_miy: '3',
pp_may: '4'
};
compare(tracker.trackPagePing(url, null, referer, 1, 2, 3, 4), expected, 'A page ping should be tracked correctly');
},
"Track a structured event": function () {
var expected = {
e: 'se',
se_ca: 'cat',
se_ac: 'act',
se_la: 'lab',
se_pr: 'prop',
se_va: 'val'
};
compare(tracker.trackStructEvent('cat', 'act', 'lab', 'prop', 'val'), expected, 'A structured event should be tracked correctly');
},
"Track an ecommerce transaction event": function () {
var orderId = 'ak0008';
var totalValue = 50;
var taxValue = 6;
var shipping = 0;
var city = 'Phoenix';
var state = 'Arizona';
var country = 'USA';
var currency = 'USD';
var expected = {
e: 'tr',
tr_id: orderId,
tr_tt: totalValue,
tr_tx: taxValue,
tr_sh: shipping,
tr_ci: city,
tr_st: state,
tr_co: country,
tr_cu: currency
};
compare(tracker.trackEcommerceTransaction(orderId, null, totalValue, taxValue, shipping, city, state, country, currency), expected, 'A transaction event should be tracked correctly');
},
"Track an ecommerce transaction item event": function () {
var orderId = 'ak0008';
var sku = '4q345';
var price = 17;
var quantity = 2;
var name = 'red shoes';
var category = 'clothing';
var currency = 'USD';
var expected = {
e: 'ti',
ti_id: orderId,
ti_sk: sku,
ti_nm: name,
ti_ca: category,
ti_pr: price,
ti_qu: quantity,
ti_cu: currency
};
compare(tracker.trackEcommerceTransactionItem(orderId, sku, name, category, price, quantity, currency), expected, 'A transaction item event should be tracked correctly');
},
"Track an unstructured event": function () {
var inputJson = {
schema: 'iglu:com.acme/user/jsonschema/1-0-1',
data: {
name: 'Eric'
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackUnstructEvent(inputJson), expected, 'An unstructured event should be tracked correctly');
},
"Track a self-describing event": function () {
var inputJson = {
schema: 'iglu:com.acme/user/jsonschema/1-0-1',
data: {
name: 'Eric'
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackSelfDescribingEvent(inputJson), expected, 'A self-describing event should be tracked correctly');
},
"Track a link click": function () {
var targetUrl = 'http://www.example.com';
var elementId = 'first header';
var elementClasses = ['header'];
var elementContent = 'link';
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1',
data: {
targetUrl: targetUrl,
elementId: elementId,
elementClasses: elementClasses,
elementContent: elementContent
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackLinkClick(targetUrl, elementId, elementClasses, null, elementContent), expected, 'A link click should be tracked correctly');
},
"Track a screen view": function () {
var name = 'intro';
var id = '7398-4352-5345-1950';
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/screen_view/jsonschema/1-0-0',
data: {
name: name,
id: id
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackScreenView(name, id), expected, 'A screen view should be tracked correctly');
},
"Track an ad impression": function () {
var impressionId = 'a0e8f8780ab3';
var costModel = 'cpc';
var cost = 0.5;
var targetUrl = 'http://adsite.com';
var bannerId = '123';
var zoneId = 'zone-14';
var advertiserId = 'ad-company';
var campaignId = 'campaign-7592';
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/ad_impression/jsonschema/1-0-0',
data: {
impressionId: impressionId,
costModel: costModel,
cost: cost,
targetUrl: targetUrl,
bannerId: bannerId,
zoneId: zoneId,
advertiserId: advertiserId,
campaignId: campaignId
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackAdImpression(impressionId, costModel, cost, targetUrl, bannerId, zoneId, advertiserId, campaignId), expected, 'An ad impression should be tracked correctly');
},
"Track an ad click": function () {
var targetUrl = 'http://adsite.com';
var clickId = 'click-321';
var costModel = 'cpc';
var cost = 0.5;
var bannerId = '123';
var zoneId = 'zone-14';
var impressionId = 'a0e8f8780ab3';
var advertiserId = 'ad-company';
var campaignId = 'campaign-7592';
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/ad_click/jsonschema/1-0-0',
data: {
targetUrl: targetUrl,
clickId: clickId,
costModel: costModel,
cost: cost,
bannerId: bannerId,
zoneId: zoneId,
impressionId: impressionId,
advertiserId: advertiserId,
campaignId: campaignId
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackAdClick(targetUrl, clickId, costModel, cost, bannerId, zoneId, impressionId, advertiserId, campaignId), expected, 'An ad click should be tracked correctly');
},
"Track an ad conversion": function () {
var conversionId = 'conversion-59';
var costModel = 'cpc';
var cost = 0.5;
var category = 'cat';
var action = 'act';
var property = 'prop';
var initialValue = 7;
var advertiserId = 'ad-company';
var campaignId = 'campaign-7592';
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/ad_conversion/jsonschema/1-0-0',
data: {
conversionId: conversionId,
costModel: costModel,
cost: cost,
category: category,
action: action,
property: property,
initialValue: initialValue,
advertiserId: advertiserId,
campaignId: campaignId
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackAdConversion(conversionId, costModel, cost, category, action, property, initialValue, advertiserId, campaignId), expected, 'An ad conversion should be tracked correctly');
},
"Track a social interaction": function () {
var action = 'like';
var network = 'facebook';
var target = 'status-0000345345';
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/social_interaction/jsonschema/1-0-0',
data: {
action: action,
network: network,
target: target
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackSocialInteraction(action, network, target), expected);
},
"Track an add-to-cart event": function () {
var sku = '4q345';
var unitPrice = 17;
var quantity = 2;
var name = 'red shoes';
var category = 'clothing';
var currency = 'USD';
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/add_to_cart/jsonschema/1-0-0',
data: {
sku: sku,
name: name,
category: category,
unitPrice: unitPrice,
quantity: quantity,
currency: currency
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackAddToCart(sku, name, category, unitPrice, quantity, currency), expected);
},
"Track a remove-from-cart event": function () {
var sku = '4q345';
var unitPrice = 17;
var quantity = 2;
var name = 'red shoes';
var category = 'clothing';
var currency = 'USD';
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/remove_from_cart/jsonschema/1-0-0',
data: {
sku: sku,
name: name,
category: category,
unitPrice: unitPrice,
quantity: quantity,
currency: currency
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackRemoveFromCart(sku, name, category, unitPrice, quantity, currency), expected);
},
"Track a form focus event": function () {
var formId = "parent";
var elementId = "child";
var nodeName = "INPUT";
var type = "text";
var elementClasses = ["important"];
var value = "male";
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/focus_form/jsonschema/1-0-0',
data: {
formId: formId,
elementId: elementId,
nodeName: nodeName,
type: type,
elementClasses: elementClasses,
value: value
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackFormFocusOrChange('focus_form', formId, elementId, nodeName, type, elementClasses, value), expected);
},
"Track a form change event": function () {
var formId = "parent";
var elementId = "child";
var nodeName = "INPUT";
var type = "text";
var elementClasses = ["important"];
var value = "male";
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/change_form/jsonschema/1-0-0',
data: {
formId: formId,
elementId: elementId,
nodeName: nodeName,
type: type,
elementClasses: elementClasses,
value: value
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackFormFocusOrChange('change_form', formId, elementId, nodeName, type, elementClasses, value), expected);
},
"Track a form submission event": function () {
var formId = "parent";
var formClasses = ["formclass"];
var elements = [{
name: "gender",
value: "male",
nodeName: "INPUT",
type: "text"
}];
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/submit_form/jsonschema/1-0-0',
data: {
formId: formId,
formClasses: formClasses,
elements: elements
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackFormSubmission(formId, formClasses, elements), expected);
},
"Track a site seach event": function () {
var terms = ["javascript", "development"];
var filters = {
"safeSearch": true,
"category": "books"
};
var totalResults = 35;
var pageResults = 10;
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/site_search/jsonschema/1-0-0',
data: {
terms: terms,
filters: filters,
totalResults: totalResults,
pageResults: pageResults
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
})
};
compare(tracker.trackSiteSearch(terms, filters, totalResults, pageResults), expected);
},
"Track a consent withdrawn event": function () {
var all = false;
var id = 1234;
var version = 2;
var name = "consent_form";
var description = "user withdraws consent for form";
var tstamp = 1000000000000;
var inputContext = [{
schema: 'iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0',
data: {
id: id,
version: version,
name: name,
description: description
}
}];
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/consent_withdrawn/jsonschema/1-0-0',
data: {
all: all
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
}),
co: JSON.stringify({
schema: 'iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0',
data: inputContext
})
};
compare(tracker.trackConsentWithdrawn(all, id, version, name, description, [], tstamp), expected);
},
"Track a consent granted event": function () {
var id = 1234;
var version = 2;
var name = "consent_form";
var description = "user grants consent for form";
var tstamp = 1000000000000;
var expiry = "01 January, 1970 00:00:00 Universal Time (UTC)";
var inputContext = [{
schema: 'iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0',
data: {
id: id,
version: version,
name: name,
description: description
}
}];
var inputJson = {
schema: 'iglu:com.snowplowanalytics.snowplow/consent_granted/jsonschema/1-0-0',
data: {
expiry: expiry
}
};
var expected = {
e: 'ue',
ue_pr: JSON.stringify({
schema: unstructEventSchema,
data: inputJson
}),
co: JSON.stringify({
schema: 'iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0',
data: inputContext
})
};
compare(tracker.trackConsentGranted(id, version, name, description, expiry, [], tstamp), expected);
},
"Track a page view with custom context": function () {
var url = 'http://www.example.com';
var page = 'title page';
var inputContext = [{
schema: 'iglu:com.acme/user/jsonschema/1-0-0',
data: {
userType: 'tester',
userName: 'Jon'
}
}];
var expected = {
e: 'pv',
url: url,
page: page,
co: JSON.stringify({
schema: 'iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0',
data: inputContext
})
};
compare(tracker.trackPageView(url, page, null, inputContext), expected, 'A custom context should be attached correctly');
},
"Track a page view with a timestamp": function () {
var tstamp = 1000000000000;
assert.strictEqual(tracker.trackPageView('http://www.example.com', null, null, null, tstamp).build()['dtm'], '1000000000000', 'A timestamp should be attached correctly');
},
"Add individual name-value pairs to the payload": function () {
var tracker = core.trackerCore(false);
var url = 'http://www.example.com';
var expected = {
e: 'pv',
url: url,
tna: 'cf',
tv: 'js-2.0.0'
};
tracker.addPayloadPair('tna', 'cf');
tracker.addPayloadPair('tv', 'js-2.0.0');
compare(tracker.trackPageView(url), expected, 'Payload name-value pairs should be set correctly');
},
"Add a dictionary of name-value pairs to the payload": function () {
var tracker = core.trackerCore(false);
var url = 'http://www.example.com';
var expected = {
e: 'pv',
url: url,
tv: 'js-2.0.0',
tna: 'cf',
aid: 'cf325'
};
tracker.addPayloadPair('tv', 'js-2.0.0');
tracker.addPayloadDict({
tna: 'cf',
aid: 'cf325'
});
compare(tracker.trackPageView(url), expected, 'Payload name-value pairs should be set correctly');
},
"Reset payload name-value pairs": function () {
var tracker = core.trackerCore(false);
var url = 'http://www.example.com';
var expected = {
e: 'pv',
url: url,
tna: 'cf'
};
tracker.addPayloadPair('tna', 'mistake');
tracker.resetPayloadPairs({'tna': 'cf'});
compare(tracker.trackPageView(url), expected, 'Payload name-value pairs should be reset correctly');
},
"Execute a callback": function () {
var callbackTarget;
var tracker = core.trackerCore(false, function (payload) {
callbackTarget = payload;
});
var url = 'http://www.example.com';
var expected = {
e: 'pv',
url: url
};
tracker.trackPageView(url);
compare(callbackTarget, expected, 'The callback should be executed correctly');
},
"Use setter methods": function () {
var tracker = core.trackerCore(false);
tracker.setTrackerVersion('js-3.0.0');
tracker.setTrackerNamespace('cf1');
tracker.setAppId('my-app');
tracker.setPlatform('web');
tracker.setUserId('jacob');
tracker.setScreenResolution(400, 200);
tracker.setViewport(500, 800);
tracker.setColorDepth(24);
tracker.setTimezone('Europe London');
tracker.setIpAddress('37.151.33.154');
var url = 'http://www.example.com';
var page = 'title page';
var expected = {
e: 'pv',
url: url,
page: page,
tna: 'cf1',
tv: 'js-3.0.0',
aid: 'my-app',
p: 'web',
uid: 'jacob',
res: '400x200',
vp: '500x800',
cd: 24,
tz: 'Europe London',
ip: '37.151.33.154'
};
compare(tracker.trackPageView(url, page), expected, 'setXXX methods should work correctly');
},
"Set true timestamp": function () {
var url = 'http://www.example.com';
var page = 'title page';
var result = tracker.trackPageView(url, page, null, null, { type: 'ttm', value: 1477403862 }).build();
assert('ttm' in result, 'ttm should be attached');
assert.strictEqual(result['ttm'] , '1477403862', 'ttm should be attached as is');
assert(!('dtm' in result), 'dtm should absent');
},
"Set device timestamp as ADT": function () {
var inputJson = {
schema: 'iglu:com.acme/user/jsonschema/1-0-1',
data: {
name: 'Eric'
}
};
// Object structure should be enforced by typesystem
var result = tracker.trackSelfDescribingEvent(inputJson, [inputJson], {type: 'dtm', value: 1477403869}).build();
assert('dtm' in result, 'dtm should be attached');
assert.strictEqual(result['dtm'] , '1477403869', 'dtm should be attached as is');
assert(!('ttm' in result), 'ttm should absent');
}
});
});