/*
 * JavaScript tracker for Snowplow: tests/nonfunctional/helpers.js
 *
 * Significant portions copyright 2010 Anthon Pang. Remainder copyright
 * 2012-2014 Snowplow Analytics Ltd. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of Anthon Pang nor Snowplow Analytics Ltd nor the
 *   names of their contributors may be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

define([
	"intern!object",
	"intern/chai!assert",
	"intern/dojo/node!../../src/js/lib/helpers"
], function (registerSuite, assert, helpers) {

	var decorateQuerystring = helpers.decorateQuerystring;
	var resolveDynamicContexts = helpers.resolveDynamicContexts;

	registerSuite({
		name: "decorateQuerystring test",
		"Decorate a URL with no querystring or fragment": function () {
			var url = 'http://www.example.com';
			var expected = 'http://www.example.com?_sp=a.b';
			var actual = decorateQuerystring(url, '_sp', 'a.b');
			assert.equal(actual, expected);
		},

		"Decorate a URL with a fragment but no querystring": function () {
			var url = 'http://www.example.com#fragment';
			var expected = 'http://www.example.com?_sp=a.b#fragment';
			var actual = decorateQuerystring(url, '_sp', 'a.b');
			assert.equal(actual, expected);
		},

		"Decorate a URL with an empty querystring": function () {
			var url = 'http://www.example.com?';
			var expected = 'http://www.example.com?_sp=a.b';
			var actual = decorateQuerystring(url, '_sp', 'a.b');
			assert.equal(actual, expected);
		},

		"Decorate a URL with a nonempty querystring": function () {
			var url = 'http://www.example.com?name=value';
			var expected = 'http://www.example.com?_sp=a.b&name=value';
			var actual = decorateQuerystring(url, '_sp', 'a.b');
			assert.equal(actual, expected);
		},

		"Override an existing field": function () {
			var url = 'http://www.example.com?_sp=outdated';
			var expected = 'http://www.example.com?_sp=a.b';
			var actual = decorateQuerystring(url, '_sp', 'a.b');
			assert.equal(actual, expected);
		},

		"Decorate a URL whose querystring contains multiple question marks": function () {
			var url = 'http://www.example.com?test=working?&name=value';
			var expected = 'http://www.example.com?_sp=a.b&test=working?&name=value';
			var actual = decorateQuerystring(url, '_sp', 'a.b');
			assert.equal(actual, expected);
		},

		"Override a field in a querystring containing a question mark": function () {
			var url = 'http://www.example.com?test=working?&_sp=outdated';
			var expected = 'http://www.example.com?test=working?&_sp=a.b';
			var actual = decorateQuerystring(url, '_sp', 'a.b');
			assert.equal(actual, expected);
		},

		"Decorate a querystring with multiple ?s and #s": function () {
			var url = 'http://www.example.com?test=working?&_sp=outdated?&?name=value#fragment?#?#';
			var expected = 'http://www.example.com?test=working?&_sp=a.b&?name=value#fragment?#?#';
			var actual = decorateQuerystring(url, '_sp', 'a.b');
			assert.equal(actual, expected);
		},
	});

	registerSuite({
		name: "getCssClasses test",
		"Tokenize a DOM element's className field": function () {
			var element = {
				className: '   the  quick   brown_fox-jumps/over\nthe\t\tlazy   dog  '
			};
			var expected = ['the', 'quick', 'brown_fox-jumps/over', 'the', 'lazy', 'dog'];
			var actual = helpers.getCssClasses(element);
			assert.deepEqual(actual, expected);
		},
	});

  registerSuite({
    name: "resolveDynamicContexts tests",
    "Resolves context generators and static contexts": function () {
      var contextGenerator = function () {
      	return {
      		'schema': 'iglu:com.acme.marketing/some_event/jsonschema/1-0-0',
					'data': {'test': 1}
      	}
			};
      var staticContext = {
        'schema': 'iglu:com.acme.marketing/some_event/jsonschema/1-0-0',
				'data': {'test': 1}
      };
      var expected = [contextGenerator(), staticContext];
      var actual = resolveDynamicContexts([contextGenerator, staticContext]);
      assert.deepEqual(actual, expected);
    },

    "Resolves context generators with arguments": function () {
      var contextGenerator = function (argOne, argTwo) {
        return {
          'schema': 'iglu:com.acme.marketing/some_event/jsonschema/1-0-0',
          'data': {
          	'firstVal': argOne,
						'secondVal': argTwo
          }
        }
      };
      var expected = [
      	{
					'schema': 'iglu:com.acme.marketing/some_event/jsonschema/1-0-0',
					'data': {
						'firstVal': 1,
						'secondVal': 2
					}
      	}
      ];
      var actual = resolveDynamicContexts([contextGenerator], 1, 2);
      assert.deepEqual(actual, expected);
    },
  });
});