From f7ac9f8069ea5e8ad8eb5c0f899f6ac8e39ef07f Mon Sep 17 00:00:00 2001
From: Vincent Petry <pvince81@owncloud.com>
Date: Mon, 27 Jan 2014 21:15:21 +0100
Subject: [PATCH] Fixed unit test scripts + coverage

Tried to add more apps (others break).
"preprocessors" is now populated automatically based on the tested apps.
---
 .gitignore            |  1 +
 autotest-js.sh        |  2 +-
 core/js/core.json     | 43 +++++++++++++----------------
 tests/karma.config.js | 64 +++++++++++++++++++++++++++++++++++--------
 4 files changed, 73 insertions(+), 37 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8c8b61d701b..25cb1b227f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -88,6 +88,7 @@ nbproject
 # Tests - auto-generated files
 /data-autotest
 /tests/coverage*
+/tests/karma-coverage
 /tests/autoconfig*
 /tests/autotest*
 /tests/data/lorem-copy.txt
diff --git a/autotest-js.sh b/autotest-js.sh
index 78f4948e7ad..8b9a106b021 100755
--- a/autotest-js.sh
+++ b/autotest-js.sh
@@ -33,5 +33,5 @@ then
 	exit 2
 fi
 
-KARMA_TESTSUITE="$1" $KARMA start tests/karma.config.js --single-run
+NODE_PATH='build/node_modules' KARMA_TESTSUITE="$1" $KARMA start tests/karma.config.js --single-run
 
diff --git a/core/js/core.json b/core/js/core.json
index 79cfc42f587..4beab7cf796 100644
--- a/core/js/core.json
+++ b/core/js/core.json
@@ -1,28 +1,23 @@
 {
+	"libraries": [
+		"jquery-1.10.0.min.js",
+		"jquery-migrate-1.2.1.min.js",
+		"jquery-ui-1.10.0.custom.js",
+		"jquery-showpassword.js",
+		"jquery.infieldlabel.js",
+		"jquery.placeholder.js",
+		"jquery-tipsy.js"
+	],
 	"modules": [
-	"jquery-1.10.0.min.js",
-	"jquery-migrate-1.2.1.min.js",
-	"jquery-ui-1.10.0.custom.js",
-	"jquery-showpassword.js",
-	"jquery.infieldlabel.js",
-	"jquery.placeholder.js",
-	"jquery-tipsy.js",
-	"compatibility.js",
-	"jquery.ocdialog.js",
-	"oc-dialogs.js",
-	"js.js",
-	"octemplate.js",
-	"eventsource.js",
-	"config.js",
-	"multiselect.js",
-	"search.js",
-	"router.js",
-	"oc-requesttoken.js",
-	"styles.js",
-	"apps.js",
-	"fixes.js",
-	"jquery-ui-2.10.0.custom.js",
-	"jquery-tipsy.js",
-	"jquery.ocdialog.js"
+		"compatibility.js",
+		"jquery.ocdialog.js",
+		"oc-dialogs.js",
+		"js.js",
+		"octemplate.js",
+		"eventsource.js",
+		"config.js",
+		"multiselect.js",
+		"router.js",
+		"oc-requesttoken.js"
 	]
 }
diff --git a/tests/karma.config.js b/tests/karma.config.js
index f73ade0f3c6..529bd31338f 100644
--- a/tests/karma.config.js
+++ b/tests/karma.config.js
@@ -29,25 +29,52 @@
  * environment variable to the apps name, for example "core" or "files_encryption".
  * Multiple apps can be specified by separating them with space.
  *
+ * Setting the environment variable NOCOVERAGE to 1 will disable the coverage
+ * preprocessor, which is needed to be able to debug tests properly in a browser.
  */
+
+/* jshint node: true */
 module.exports = function(config) {
 
+	function findApps() {
+		/*
+		var fs = require('fs');
+		var apps = fs.readdirSync('apps');
+		return apps;
+		*/
+		// other apps tests don't run yet... needs further research / clean up
+		return ['files'];
+	}
+
+	// respect NOCOVERAGE env variable
+	// it is useful to disable coverage for debugging
+	// because the coverage preprocessor will wrap the JS files somehow
+	var enableCoverage = !parseInt(process.env.NOCOVERAGE, 10);
+	console.log('Coverage preprocessor: ', enableCoverage?'enabled':'disabled');
+
 	// default apps to test when none is specified (TODO: read from filesystem ?)
-	var defaultApps = 'core files';
-	var appsToTest = process.env.KARMA_TESTSUITE || defaultApps;
+	var appsToTest = process.env.KARMA_TESTSUITE;
+    if (appsToTest) {
+		appsToTest = appsToTest.split(' ');
+	}
+	else {
+		appsToTest = ['core'].concat(findApps());
+	}
+
+	console.log('Apps to test: ', appsToTest);
 
 	// read core files from core.json,
 	// these are required by all apps so always need to be loaded
 	// note that the loading order is important that's why they
 	// are specified in a separate file
 	var corePath = 'core/js/';
-	var coreFiles = require('../' + corePath + 'core.json').modules;
+	var coreModule = require('../' + corePath + 'core.json');
 	var testCore = false;
 	var files = [];
 	var index;
+	var preprocessors = {};
 
 	// find out what apps to test from appsToTest
-	appsToTest = appsToTest.split(' ');
 	index = appsToTest.indexOf('core');
 	if (index > -1) {
 		appsToTest.splice(index, 1);
@@ -60,11 +87,23 @@ module.exports = function(config) {
 	// core mocks
 	files.push(corePath + 'tests/specHelper.js');
 
-	// add core files
-	for ( var i = 0; i < coreFiles.length; i++ ) {
-		files.push( corePath + coreFiles[i] );
+	// add core library files
+	for ( var i = 0; i < coreModule.libraries.length; i++ ) {
+		var srcFile = corePath + coreModule.libraries[i];
+		files.push(srcFile);
+	}
+
+	// add core modules files
+	for ( var i = 0; i < coreModule.modules.length; i++ ) {
+		var srcFile = corePath + coreModule.modules[i];
+		files.push(srcFile);
+		if (enableCoverage) {
+			preprocessors[srcFile] = 'coverage';
+		}
 	}
 
+	// TODO: settings pages
+
 	// need to test the core app as well ?
 	if (testCore) {
 		// core tests
@@ -73,7 +112,11 @@ module.exports = function(config) {
 
 	for ( var i = 0; i < appsToTest.length; i++ ) {
 		// add app JS
-		files.push('apps/' + appsToTest[i] + '/js/*.js');
+		var srcFile = 'apps/' + appsToTest[i] + '/js/*.js';
+		files.push(srcFile);
+		if (enableCoverage) {
+			preprocessors[srcFile] = 'coverage';
+		}
 		// add test specs
 		files.push('apps/' + appsToTest[i] + '/tests/js/*.js');
 	}
@@ -83,7 +126,6 @@ module.exports = function(config) {
 		// base path, that will be used to resolve files and exclude
 		basePath: '..',
 
-
 		// frameworks to use
 		frameworks: ['jasmine'],
 
@@ -106,9 +148,7 @@ module.exports = function(config) {
 		// web server port
 		port: 9876,
 
-		preprocessors: {
-			'apps/files/js/*.js': 'coverage'
-		},
+		preprocessors: preprocessors,
 
 		coverageReporter: {
 			dir:'tests/karma-coverage',
-- 
GitLab