diff --git a/webroot/test/ui/Gruntfile.js b/webroot/test/ui/Gruntfile.js
new file mode 100644
index 000000000..d614e6f4f
--- /dev/null
+++ b/webroot/test/ui/Gruntfile.js
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
+ */
+module.exports = function (grunt) {
+ grunt.loadNpmTasks("grunt-contrib-jshint");
+ grunt.loadNpmTasks("grunt-contrib-qunit");
+ grunt.loadNpmTasks('grunt-qunit-junit');
+ grunt.loadNpmTasks('grunt-karma');
+ //this option is to avoid interruption of test case execution on failure of one in sequence
+ //grunt.option('force',true);
+ grunt.option('stack', true);
+
+ var commonFiles = [
+ {pattern: 'contrail-web-core/webroot/assets/**/!(tests)/*.js', included: false},
+ {pattern: 'contrail-web-core/webroot/assets/**/*.css', included: false},
+ {pattern: 'contrail-web-core/webroot/css/**/*.css', included: false},
+ {pattern: 'contrail-web-core/webroot/test/ui/**/*.css', included: false},
+
+ {pattern: 'contrail-web-core/webroot/font/**/*.woff', included: false},
+ {pattern: 'contrail-web-core/webroot/assets/**/*.woff', included: false},
+ {pattern: 'contrail-web-core/webroot/assets/**/*.ttf', included: false},
+
+ {pattern: 'contrail-web-core/webroot/img/**/*.png', included: false},
+ {pattern: 'contrail-web-core/webroot/css/**/*.png', included: false},
+ {pattern: 'contrail-web-core/webroot/assets/select2/styles/**/*.png', included: false},
+ {pattern: 'contrail-web-core/webroot/css/**/*.gif', included: false},
+
+ {pattern: 'contrail-web-core/webroot/test/ui/js/co.test.app.js'},
+ {pattern: 'contrail-web-core/webroot/test/ui/js/**/co.test.*.js', included: false},
+ {pattern: 'contrail-web-core/webroot/test/ui/js/**/*.lib.test.suite.js', included: false},
+ {pattern: 'contrail-web-core/webroot/test/ui/js/**/*.lib.test.js', included: false},
+ //{pattern: 'contrail-web-core/webroot/test/ui/js/**/*.lib.test.js', included: false},
+ //{pattern: 'contrail-web-core/webroot/test/ui/js/**/*.lib.test.suite.js', included: false},
+ //{pattern: 'contrail-web-core/webroot/test/ui/js/**/{!(*.lib.test.js), !(*.test.suite.js)}', included: false},
+ //{pattern: 'contrail-web-core/webroot/test/ui/js/**/*.js', included: false},
+
+ {pattern: 'contrail-web-core/webroot/js/**/*.js', included: false},
+ {pattern: 'contrail-web-core/webroot/templates/*.tmpl', included: false}
+ ];
+
+ var karmaConfig = {
+ options: {
+ configFile: 'karma.config.js',
+ },
+ grid: {
+ options: {
+ files: [
+ //{pattern: 'contrail-web-core/webroot/assets/slickgrid/js/slick.*.js'},
+ {pattern: 'contrail-web-core/webroot/test/ui/js/grid/GridView.lib.test.js', included: false}
+ ],
+ preprocessors: {
+ 'contrail-web-core/webroot/assets/slickgrid/js/slick.*.js': ['coverage']
+ }
+ }
+ }
+ };
+
+ for (var feature in karmaConfig) {
+ if (feature != 'options') {
+ karmaConfig[feature]['options']['files'] = commonFiles.concat(karmaConfig[feature]['options']['files']);
+ }
+ }
+
+ grunt.initConfig({
+ pkg: grunt.file.readJSON(__dirname + "/../../../../contrail-web-core/package.json"),
+ karma: karmaConfig,
+ jshint: {
+ options: {
+ jshintrc: ".jshintrc"
+ },
+ files: ["Gruntfile.js"]
+ },
+ api: {
+ grid: 'grid'
+ }
+
+ });
+
+ grunt.registerMultiTask('api', 'Core libs API Test Cases', function () {
+ if (this.target == 'grid') {
+ grunt.task.run('karma:grid');
+
+ }
+ });
+};
diff --git a/webroot/test/ui/js/co.test.app.js b/webroot/test/ui/js/co.test.app.js
new file mode 100644
index 000000000..fe65b1c47
--- /dev/null
+++ b/webroot/test/ui/js/co.test.app.js
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved.
+ */
+
+var coreBaseDir = "/base/contrail-web-core/webroot",
+ featurePkg = "testLibApi";
+
+require([
+ coreBaseDir + '/js/core-app-utils.js',
+ coreBaseDir + '/test/ui/js/co.test.app.utils.js'
+], function () {
+ globalObj['env'] = "test";
+
+
+ requirejs.config({
+ baseUrl: coreBaseDir,
+ paths: getCoreAppAndCoreTestAppPaths(coreBaseDir),
+ map: coreAppMap,
+ shim: getCoreAppAndCoreTestAppShims(),
+ waitSeconds: 0
+ });
+
+ require(['co-test-init'], function () {
+ setFeaturePkgAndInit(featurePkg);
+ });
+
+
+ function getCoreAppAndCoreTestAppPaths(coreBaseDir) {
+ var coreTestAppPathObj = {};
+ var coreAppPaths = getCoreAppPaths(coreBaseDir);
+ var coreTestAppPaths = getCoreTestAppPaths(coreBaseDir);
+
+ for (var key in coreAppPaths) {
+ if (coreAppPaths.hasOwnProperty(key)) {
+ var value = coreAppPaths[key];
+ coreTestAppPathObj[key] = value;
+ }
+ }
+
+ for (var key in coreTestAppPaths) {
+ if (coreTestAppPaths.hasOwnProperty(key)) {
+ var value = coreTestAppPaths[key];
+ coreTestAppPathObj[key] = value;
+ }
+ }
+
+ return coreTestAppPathObj;
+ };
+
+ function getCoreAppAndCoreTestAppShims() {
+
+ var coreTestAppShims = {};
+
+ for (var key in coreAppShim) {
+ if (coreAppShim.hasOwnProperty(key)) {
+ var value = coreAppShim[key];
+ coreTestAppShims[key] = value;
+ }
+ }
+
+ for (var key in coreTestAppShim) {
+ if (coreTestAppShim.hasOwnProperty(key)) {
+ var value = coreTestAppShim[key];
+ coreTestAppShims[key] = value;
+ }
+ }
+
+ return coreTestAppShims;
+ };
+
+});
diff --git a/webroot/test/ui/js/co.test.app.utils.js b/webroot/test/ui/js/co.test.app.utils.js
index 02c28f757..28afe9983 100644
--- a/webroot/test/ui/js/co.test.app.utils.js
+++ b/webroot/test/ui/js/co.test.app.utils.js
@@ -11,13 +11,22 @@ function getCoreTestAppPaths(coreBaseDir) {
'co-test-constants' : coreTestAppBaseDir + '/co.test.constants',
'co-test-utils' : coreTestAppBaseDir + '/co.test.utils',
'co-test-messages' : coreTestAppBaseDir + '/co.test.messages',
- 'co-test-mockdata' : coreTestAppBaseDir + '/co.test.mockdata',
- 'co-unit-test' : coreTestAppBaseDir + '/co.unit.test',
- 'co-test-grid-listmodel': coreTestAppBaseDir + '/grid/listmodel.test',
- 'co-test-grid-gridview' : coreTestAppBaseDir + '/grid/gridview.test'
+ 'co-test-mockdata' : coreTestAppBaseDir + '/co.test.mock.data',
+ 'co-test-unit' : coreTestAppBaseDir + '/co.test.unit',
+ 'co-grid-contrail-list-model-test-suite' : coreTestAppBaseDir + '/grid/ContrailListModel.test.suite',
+ 'co-grid-view-test-suite' : coreTestAppBaseDir + '/grid/GridView.test.suite',
+ 'co-grid-contrail-list-model-lib-test-suite' : coreTestAppBaseDir + '/grid/ContrailListModel.lib.test.suite',
+ 'co-grid-view-lib-test-suite' : coreTestAppBaseDir + '/grid/GridView.lib.test.suite'
};
}
function coreTestAppShim() {
- return {};
+ return {
+ 'co-grid-contrail-list-model-lib-test-suite' : {
+ deps: ['slick.core', 'slick.dataview']
+ },
+ 'co-grid-view-lib-test-suite' : {
+ deps: ['slick.core', 'slick.grid', 'jquery-ui', 'slick.enhancementpager']
+ }
+ };
}
\ No newline at end of file
diff --git a/webroot/test/ui/js/co.test.init.js b/webroot/test/ui/js/co.test.init.js
index f0257b2e4..b59300dcc 100644
--- a/webroot/test/ui/js/co.test.init.js
+++ b/webroot/test/ui/js/co.test.init.js
@@ -2,12 +2,12 @@
* Copyright (c) 2014 Juniper Networks, Inc. All rights reserved.
*/
-var cowc, cowu, cowf, cowch, cowm, cotc;
+var cowc, cowu, cowf, cowl, cowch, cowm, cotc;
var allTestFiles = [], nmTestKarma = window.__karma__;
for (var file in nmTestKarma.files) {
- if (/Test\.js$/.test(file)) {
+ if (/\.test\.js$/.test(file)) {
allTestFiles.push(file);
}
}
@@ -62,6 +62,9 @@ function setFeaturePkgAndInit(featurePkg) {
featurePkgObj.webServerInfo = 'smWebServerInfoMockData';
break;
+ case 'testLibApi':
+ return testLibApiAppInit({});
+
}
testAppInit(getTestAppConfig(featurePkgObj));
@@ -124,3 +127,44 @@ function testAppInit(testAppConfig) {
});
});
}
+
+function testLibApiAppInit(testAppConfig) {
+
+ require(['jquery', 'knockout', 'bezier'], function ($, Knockout, Bezier) {
+ window.ko = Knockout;
+ window.Bezier = Bezier;
+
+ if (document.location.pathname.indexOf('/vcenter') == 0) {
+ $('head').append('');
+ }
+
+ require(depArray, function ($, _, validation, CoreConstants, CoreUtils, CoreFormatters, CoreMessages, CoreLabels, Knockout, Cache,
+ contrailCommon, CoreCommonTmpl, CoreTestUtils, CoreTestConstants, LayoutHandler) {
+ cowc = new CoreConstants();
+ cowu = new CoreUtils();
+ cowf = new CoreFormatters();
+ cowm = new CoreMessages();
+ cowl = new CoreLabels();
+ cowch = new Cache();
+ cotc = CoreTestConstants;
+
+ $("body").addClass('navbar-fixed');
+ $("body").append(CoreTestUtils.getPageHeaderHTML());
+ $("body").append(CoreTestUtils.getSidebarHTML());
+ $("body").append(CoreCommonTmpl);
+
+ var cssList = CoreTestUtils.getCSSList();
+
+ for (var i = 0; i < cssList.length; i++) {
+ $("body").append(cssList[i]);
+ }
+ require(allTestFiles, function () {
+ requirejs.config({
+ deps: allTestFiles,
+ callback: window.__karma__.start
+ });
+ });
+ });
+ });
+
+}
\ No newline at end of file
diff --git a/webroot/test/ui/js/co.test.mock.data.js b/webroot/test/ui/js/co.test.mock.data.js
new file mode 100644
index 000000000..0aa76b2ed
--- /dev/null
+++ b/webroot/test/ui/js/co.test.mock.data.js
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
+ */
+define(['underscore'], function (_) {
+
+ //Compares client UTC time with the server UTC time and display alert if mismatch exceeds the threshold
+ var webServerInfoMockData = {
+ "orchestrationModel": [
+ "openstack"
+ ],
+ "serverUTCTime": 1436203008000,
+ "hostName": "a7s14",
+ "role": [
+ "superAdmin"
+ ],
+ "featurePkg": {
+ "webController": false,
+ "webStorage": false,
+ "serverManager": false
+ },
+ "uiConfig": {
+ "nodemanager": {
+ "installed": true
+ }
+ },
+ "loggedInOrchestrationMode": "openstack"
+ };
+
+ var disabledFeatureMockData = {"disabled":["config_alarms","mon_infra_mx"]},
+ webControllerMockData = {"webController":{"path":"/usr/src/contrail-web-controller","enable":true}},
+ ctWebServerInfoMockData = _.extend({}, webServerInfoMockData, {"featurePkg": { "webController": true }}),
+ smWebServerInfoMockData = _.extend({}, webServerInfoMockData, {"featurePkg": { "serverManager": true }}),
+ sWebServerInfoMockData = _.extend({}, webServerInfoMockData, {"featurePkg": { "webStorage": true }});
+
+ return {
+ ctWebServerInfoMockData: ctWebServerInfoMockData,
+ smWebServerInfoMockData: smWebServerInfoMockData,
+ sWebServerInfoMockData: sWebServerInfoMockData,
+ disabledFeatureMockData: disabledFeatureMockData,
+ webControllerMockData: webControllerMockData
+ }
+});
\ No newline at end of file
diff --git a/webroot/test/ui/js/co.test.unit.js b/webroot/test/ui/js/co.test.unit.js
new file mode 100644
index 000000000..17d1d0fd1
--- /dev/null
+++ b/webroot/test/ui/js/co.test.unit.js
@@ -0,0 +1,305 @@
+/*
+ * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
+ */
+define([
+ 'jquery',
+ 'underscore',
+ 'co-test-utils',
+ 'co-test-constants'
+], function ($, _, cotu, cotc) {
+
+ var defaultTestSuiteConfig = {
+ class: '',
+ groups: [],
+ severity: cotc.SEVERITY_LOW
+ };
+
+ var createTestSuiteConfig = function (testClass, groups, severity) {
+ severity = ifNull(severity, cotc.SEVERITY_LOW);
+ groups = ifNull(groups, ['all']);
+ return $.extend({}, defaultTestSuiteConfig, {class: testClass, groups: groups, severity: severity});
+ };
+
+ var createViewTestConfig = function (viewId, testSuiteConfig, mokDataConfig) {
+ var viewTestConfig = {};
+ viewTestConfig.viewId = ifNull(viewId, "");
+ viewTestConfig.testSuites = [];
+ if (testSuiteConfig != null) {
+ _.each(testSuiteConfig, function (suiteConfig) {
+ viewTestConfig.testSuites.push(suiteConfig);
+ });
+ }
+ viewTestConfig.mockDataConfig = ifNull(mokDataConfig, {});
+
+ return viewTestConfig;
+ };
+
+ var defaultFakeServerConfig = {
+ options: {
+ autoRespondAfter: 100
+ },
+ responses: [],
+ getResponsesConfig: function () {
+ return [];
+ }
+ };
+
+ this.getDefaultFakeServerConfig = function () {
+ return defaultFakeServerConfig;
+ };
+
+ this.createFakeServerResponse = function (respObj) {
+ var defaultResponse = {
+ method: 'GET',
+ url: '/',
+ statusCode: 200,
+ headers: {"Content-Type": "application/json"},
+ body: ''
+ };
+ return $.extend({}, defaultResponse, respObj);
+ }
+
+ var defaultPageConfig = {
+ hashParams: {
+ p: ''
+ },
+ loadTimeout: 1000
+ };
+
+ this.getDefaultPageConfig = function () {
+ return defaultPageConfig;
+ }
+
+ var defaultPageTestConfig = {
+ moduleId: 'Set moduleId for your Test in pageTestConfig',
+ fakeServer: this.getDefaultFakeServerConfig(),
+ page: this.getDefaultPageConfig(),
+ getTestConfig: function () {
+ return {};
+ }
+ };
+
+ this.createPageTestConfig = function (moduleId, fakeServerConfig, pageConfig, getTestConfigCB) {
+ var pageTestConfig = defaultPageTestConfig;
+ if (moduleId != null) {
+ pageTestConfig.moduleId = moduleId;
+ }
+ if (fakeServerConfig != null) {
+ pageTestConfig.fakeServer = $.extend({}, pageTestConfig.fakeServer, fakeServerConfig);
+ }
+ if (pageConfig != null) {
+ pageTestConfig.page = $.extend({}, pageTestConfig.page, pageConfig);
+ }
+ if (getTestConfigCB != null) {
+ pageTestConfig.getTestConfig = getTestConfigCB;
+ }
+ return pageTestConfig;
+ };
+
+ this.cTest = function (message, callback, severity) {
+ severity = ifNull(severity, cotc.SEVERITY_LOW);
+ return {
+ severity: severity,
+ test: function () {
+ return test(message, callback);
+ },
+ type: cotc.TYPE_CONTRAIL_TEST
+ };
+ };
+
+ var testGroup = function (name) {
+ this.name = ifNull(name, '');
+ this.type = cotc.TYPE_CONTRAIL_TEST_GROUP; //set constant type.
+ this.tests = [];
+
+ /**
+ * test is an object of CTest.
+ * @param test
+ */
+ this.registerTest = function (testObj) {
+ if (testObj.type == cotc.TYPE_CONTRAIL_TEST) {
+ this.tests.push(testObj);
+ } else {
+ console.log("Test should be object of type CUnit.test");
+ }
+
+ }
+
+ this.run = function (severity) {
+ _.each(this.tests, function (testObj) {
+ if (severity == cotc.SEVERITY_HIGH) {
+ if (testObj.severity == cotc.SEVERITY_HIGH) {
+ testObj.test();
+ }
+ } else if (severity == cotc.SEVERITY_MEDIUM) {
+ if (testObj.severity == cotc.SEVERITY_HIGH || testObj.severity == cotc.SEVERITY_MEDIUM) {
+ testObj.test();
+ }
+ } else if (severity == cotc.SEVERITY_LOW) {
+ testObj.test();
+ } else {
+ }
+ });
+ };
+ };
+
+ this.createTestGroup = function (name) {
+ return new testGroup(name);
+ };
+
+ var testSuite = function (name) {
+ this.name = ifNull(name, '');
+ this.groups = [];
+ this.type = cotc.TYPE_CONTRAIL_TEST_SUITE; //set constant type.
+
+ this.createTestGroup = function (name) {
+ var group = new testGroup(name);
+ this.groups.push(group);
+ return group;
+ };
+
+ this.registerGroup = function (group) {
+ if (group.type == cotc.TYPE_CONTRAIL_TEST_GROUP) {
+ this.groups.push(group);
+ } else {
+ console.log("Group should be object of CUnit.testGroup.")
+ }
+ }
+
+ this.run = function (groupNames, severity) {
+ var self = this;
+ _.each(groupNames, function (groupName) {
+ if (groupName == 'all') {
+ //run all the groups.
+ _.each(self.groups, function (group) {
+ group.run(severity);
+ })
+
+ } else {
+ //run only the group that matches name.
+ _.each(self.groups, function (group) {
+ if (group.name == groupName) {
+ group.run(severity);
+ }
+ });
+ }
+ });
+ }
+ }
+
+ this.createTestSuite = function (name) {
+ return new testSuite(name);
+ }
+
+ this.executeCommonTests = function (testConfigObj) {
+ _.each(testConfigObj, function (testConfig) {
+
+ _.each(testConfig.suites, function (suiteConfig) {
+ if (contrail.checkIfExist(suiteConfig.class)) {
+ suiteConfig.class(testConfig.viewObj, suiteConfig);
+ }
+ });
+ });
+ };
+
+ this.executeLibTests = function (testConfig) {
+ _.each(testConfig.suites, function(suiteConfig) {
+ if (contrail.checkIfExist(suiteConfig.class)) {
+ suiteConfig.class(suiteConfig);
+ }
+ });
+ }
+
+ /**
+ * moduleId
+ * fakeServer.options {}
+ * fakeServer.responses
+ * page.hashParams
+ * page.loadTimeout
+ * rootView
+ * testConfig.getTestConfig()
+ * @param PageTestConfig
+ */
+ this.startCommonTestRunner = function (pageTestConfig) {
+ var self = this,
+ fakeServer;
+
+ module(pageTestConfig.moduleId, {
+ setup: function () {
+ fakeServer = cotu.getFakeServer(pageTestConfig.fakeServer.options);
+ _.each(pageTestConfig.fakeServer.responses, function (response) {
+ fakeServer.respondWith(response.method, response.url, [response.statusCode, response.headers, response.data]);
+ });
+
+ $.ajaxSetup({
+ cache: true
+ });
+ },
+ teardown: function () {
+ fakeServer.restore();
+ delete fakeServer;
+ }
+ });
+
+ asyncTest("Core Tests", function (assert) {
+ expect(0);
+ var loadingStartedDefObj = loadFeature(pageTestConfig.page.hashParams);
+ loadingStartedDefObj.done(function () {
+ //additional fake server response setup
+ var responses = pageTestConfig.fakeServer.getResponsesConfig();
+ _.each(responses, function (response) {
+ fakeServer.respondWith(response.method, response.url, [response.statusCode, response.headers, response.body]);
+ });
+
+ var pageLoadTimeOut = pageTestConfig.page.loadTimeout;
+
+ setTimeout(function () {
+ var testConfig = pageTestConfig.getTestConfig();
+ var mockDataDefObj = $.Deferred();
+
+ cotu.setViewObjAndViewConfig4All(testConfig.rootView, testConfig.tests);
+
+ //create and update mock data in test config
+ cotu.createMockData(testConfig.rootView, testConfig.tests, mockDataDefObj);
+
+ $.when(mockDataDefObj).done(function () {
+ self.executeCommonTests(testConfig.tests);
+ QUnit.start();
+ });
+
+ }, pageLoadTimeOut);
+ });
+ });
+
+ };
+
+ this.startLibTestRunner = function(libTestConfig) {
+ var self = this;
+ asyncTest("Start Library Tests - " + ifNull(libTestConfig.libName, ""), function (assert) {
+ expect(0);
+ libTestConfig.testInitFn();
+ setTimeout(function() {
+ self.executeLibTests(libTestConfig);
+ QUnit.start();
+ }, 1000);
+
+ });
+ };
+
+ return {
+ getDefaultFakeServerConfig: getDefaultFakeServerConfig,
+ createFakeServerResponse: createFakeServerResponse,
+ getDefaultPageConfig: getDefaultPageConfig,
+ createTestSuiteConfig: createTestSuiteConfig,
+ createViewTestConfig: createViewTestConfig,
+ createPageTestConfig: createPageTestConfig,
+ executeCommonTests: executeCommonTests,
+ executeLibTests: executeLibTests,
+ test: cTest,
+ createTestGroup: createTestGroup,
+ createTestSuite: createTestSuite,
+ startTestRunner: startCommonTestRunner,
+ startCommonTestRunner : startCommonTestRunner,
+ startLibTestRunner: startLibTestRunner
+ };
+});
diff --git a/webroot/test/ui/js/grid/ContrailListModel.lib.test.suite.js b/webroot/test/ui/js/grid/ContrailListModel.lib.test.suite.js
new file mode 100644
index 000000000..d13af2d0a
--- /dev/null
+++ b/webroot/test/ui/js/grid/ContrailListModel.lib.test.suite.js
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
+ */
+
+define([
+ 'co-test-utils',
+ 'co-test-messages',
+ 'co-test-constants',
+ 'co-test-unit',
+], function (cotu, cotm, cotc, CUnit) {
+
+ //TODO update test groups and test cases.
+
+ var libTestSuiteClass = function (suiteConfig) {
+ var mockData = ifNull(suiteConfig.mockData, []),
+ gridListModel = new Slick.Data.DataView,
+ dataParsers;
+
+ if (contrail.checkIfExist(suiteConfig.modelConfig)) {
+ dataParsers = suiteConfig.modelConfig.dataParsers;
+ }
+
+ module(cotu.formatTestModuleMessage(cotm.TEST_SLICKGRID_LISTMODEL, "GridView-Lib"));
+
+ var gridListModelTestSuite = CUnit.createTestSuite('GridListModelTest');
+
+ var basicTestGroup = gridListModelTestSuite.createTestGroup('basic');
+
+ basicTestGroup.registerTest(CUnit.test(cotm.SLICKGRID_LISTMODEL_INITIAL_SETUP, function () {
+ if (mockData == null) {
+ assertEmpty(gridListModel);
+ } else {
+ assertEqual(gridListModel, mockData, dataParsers);
+ }
+
+ }, cotc.SEVERITY_HIGH));
+
+ basicTestGroup.registerTest(CUnit.test(cotm.SLICKGRID_LISTMODEL_REFRESH, function () {
+ gridListModel.refresh();
+ if (mockData == null) {
+ assertEmpty(gridListModel);
+ } else {
+ assertEqual(gridListModel, mockData, dataParsers);
+ }
+ }, cotc.SEVERITY_HIGH));
+
+
+ gridListModelTestSuite.run(suiteConfig.groups, suiteConfig.severity);
+ };
+
+ function assertEmpty(gridListModel) {
+ expect(6);
+ deepEqual(0, gridListModel.getLength(), "rows is initialized to an empty array");
+ deepEqual(gridListModel.getItems().length, 0, "getItems().length");
+ deepEqual(undefined, gridListModel.getIdxById("id_0"), "getIdxById should return undefined if not found");
+ deepEqual(undefined, gridListModel.getRowById("id_0"), "getRowById should return undefined if not found");
+ deepEqual(undefined, gridListModel.getItemById("id_0"), "getItemById should return undefined if not found");
+ deepEqual(undefined, gridListModel.getItemByIdx(0), "getItemByIdx should return undefined if not found");
+ }
+
+ function assertEqual(gridListModel, mockData, dataParsers) {
+ var gridListModelItems = gridListModel.getItems();
+ if (dataParsers != null) {
+ if (contrail.checkIfExist(dataParsers.gridDataParseFn)) {
+ gridListModelItems = dataParsers.gridDataParseFn(gridListModelItems);
+ }
+ }
+ expect(6);
+ notDeepEqual(0, gridListModel.getLength(), "rows is initialized to an non-empty array");
+ deepEqual(gridListModelItems.length, mockData.length, "getItems().length should equal with mockData.length");
+ notDeepEqual(undefined, gridListModel.getIdxById("id_0"), "getIdxById should not be undefined");
+ notDeepEqual(undefined, gridListModel.getRowById("id_0"), "getRowById should not be undefined");
+ notDeepEqual(undefined, gridListModel.getItemById("id_0"), "getItemById should not be undefined");
+ deepEqual(mockData[0], gridListModelItems[0], "getItemByIdx[0] (listmodel first item) should equal to mockData[0]");
+ }
+
+ return libTestSuiteClass;
+
+});
diff --git a/webroot/test/ui/js/grid/listmodel.test.js b/webroot/test/ui/js/grid/ContrailListModel.test.suite.js
similarity index 99%
rename from webroot/test/ui/js/grid/listmodel.test.js
rename to webroot/test/ui/js/grid/ContrailListModel.test.suite.js
index ce1d175a5..d38c60a8e 100644
--- a/webroot/test/ui/js/grid/listmodel.test.js
+++ b/webroot/test/ui/js/grid/ContrailListModel.test.suite.js
@@ -5,7 +5,7 @@
define([
'co-test-utils',
'co-test-messages',
- 'co-unit-test',
+ 'co-test-unit',
], function (cotu, cotm, CUnit) {
var testSuiteClass = function (viewObj, suiteConfig) {
diff --git a/webroot/test/ui/js/grid/GridView.lib.test.js b/webroot/test/ui/js/grid/GridView.lib.test.js
new file mode 100644
index 000000000..a9eb15250
--- /dev/null
+++ b/webroot/test/ui/js/grid/GridView.lib.test.js
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
+ */
+define([
+ 'co-test-constants',
+ 'co-grid-contrail-list-model-lib-test-suite',
+ 'co-grid-view-lib-test-suite',
+ 'co-test-unit'
+], function (cotc, ContrailListModelLibTestSuite, GridViewLibTestSuite, CUnit) {
+
+ var libTestConfig = {
+ libName: "GridView",
+ testInitFn : function() {
+ same = QUnit.deepEqual;
+ $('#content-container').append('
');
+ },
+ suites: [
+ {
+ class: ContrailListModelLibTestSuite,
+ group: ['all'],
+ severity: cotc.SEVERITY_LOW
+ }
+ ]
+ };
+
+ CUnit.startLibTestRunner(libTestConfig);
+
+});
\ No newline at end of file
diff --git a/webroot/test/ui/js/grid/GridView.lib.test.suite.js b/webroot/test/ui/js/grid/GridView.lib.test.suite.js
new file mode 100644
index 000000000..f28027fac
--- /dev/null
+++ b/webroot/test/ui/js/grid/GridView.lib.test.suite.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
+ */
+
+define([
+ 'underscore',
+ 'co-test-utils',
+ 'co-test-messages',
+ 'co-test-constants',
+ 'co-test-unit'
+], function (_, cotu, cotm, cotc, CUnit) {
+
+ var libTestSuiteClass = function (suiteConfig){
+
+ var gridViewTestSuite = CUnit.createTestSuite('LibGridViewTest');
+
+ //TODO add test groups and test cases
+
+
+ gridViewTestSuite.run(suiteConfig.groups, suiteConfig.severity);
+
+ };
+
+ return libTestSuiteClass;
+});
\ No newline at end of file
diff --git a/webroot/test/ui/js/grid/gridview.test.js b/webroot/test/ui/js/grid/GridView.test.suite.js
similarity index 99%
rename from webroot/test/ui/js/grid/gridview.test.js
rename to webroot/test/ui/js/grid/GridView.test.suite.js
index fca878962..de3edfa74 100644
--- a/webroot/test/ui/js/grid/gridview.test.js
+++ b/webroot/test/ui/js/grid/GridView.test.suite.js
@@ -7,7 +7,7 @@ define([
'co-test-utils',
'co-test-messages',
'co-test-constants',
- 'co-unit-test'
+ 'co-test-unit'
], function (_, cotu, cotm, cotc, CUnit) {
var testSuiteClass = function (viewObj, suiteConfig){
diff --git a/webroot/test/ui/karma.config.js b/webroot/test/ui/karma.config.js
new file mode 100644
index 000000000..ebb91f783
--- /dev/null
+++ b/webroot/test/ui/karma.config.js
@@ -0,0 +1,63 @@
+/*/*
+ * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
+ */
+module.exports = function (config) {
+ config.set({
+ basePath: __dirname + '/../../../..',
+ autoWatch: false,
+ frameworks: ['qunit', 'sinon', 'requirejs'],
+ plugins: [
+ 'karma-phantomjs-launcher',
+ 'karma-coverage',
+ 'karma-qunit',
+ 'karma-sinon',
+ 'karma-htmlfile-reporter',
+ //'karma-html-reporter',
+ 'karma-requirejs',
+ 'karma-junit-reporter',
+ 'karma-html2js-preprocessor',
+ 'karma-firefox-launcher',
+ 'karma-chrome-launcher',
+ ],
+ browsers: [
+ 'PhantomJS',
+ //'PhantomJS_custom',
+ //'Firefox',
+ //'Chrome'
+ ],
+ customLaunchers: {
+ 'PhantomJS_custom': {
+ base: 'PhantomJS',
+ options: {
+ viewportSize: {
+ width: 1280,
+ height: 1024
+ }
+ }
+ }
+ },
+
+ //port: 8143,
+
+ reporters: ['progress', 'html', 'coverage', 'junit'],
+ // the default configuration
+ junitReporter: {
+ outputFile: __dirname + '/reports/test-results.xml',
+ suite: ''
+ },
+ preprocessors: {
+ '*.view': ['html2js'],
+ '*.tmpl': ['html2js']
+ },
+ htmlReporter: {
+ outputFile: __dirname + '/reports/test-results.html'
+ },
+ coverageReporter: {
+ type : 'html',
+ dir : __dirname + '/reports/coverage/'
+ },
+ singleRun: false,
+ colors: true
+ });
+};
+