siesta-lite
Version:
Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers
192 lines (132 loc) • 5.17 kB
JavaScript
/*
Siesta 5.6.1
Copyright(c) 2009-2022 Bryntum AB
https://bryntum.com/contact
https://bryntum.com/products/siesta/license
*/
/**
@class Siesta.Project.NodeJS
@extends Siesta.Project
Class, representing the NodeJS project.
For a getting start guide and manual, please refer to <a href="#!/guide/getting_started_browser">Siesta getting started in browser environment</a> guide.
Synopsys
========
var siesta = require('siesta-lite')
var project = new siesta.NodeJsHarness()
project.configure({
title : 'Awesome Test Suite',
autoCheckGlobals : true,
expectedGlobals : [
'Ext',
'Sch'
],
preload : [
]
})
project.plan(
// simple string - url relative to project file
'sanity.t.js',
// test file descriptor with own configuration options
{
url : 'basic.t.js',
// replace `preload` option of project
preload : [
"../awesome-project-all.js"
]
},
// groups ("folders") of test files (possibly with own options)
{
group : 'Sanity',
autoCheckGlobals : false,
items : [
'data/crud.t.js',
...
]
},
...
)
project.start()
Running the test suite in NodeJS
================================
To run the suite in NodeJS, launch the project javascript file:
> node t/index.js
*/
!function () {
var fs = require('fs')
var path = require('path')
var glob = require('glob')
Class('Siesta.Project.NodeJS', {
isa : Siesta.Project,
does : [
Siesta.Util.Role.CanEscapeRegExp,
Siesta.Launcher.Role.CanProcessArguments
],
has : {
/**
* @cfg {Class} testClass The test class which will be used for creating test instances, defaults to {@link Siesta.Test.NodeJS}.
* You can subclass {@link Siesta.Test.NodeJS} and provide a new class, please refer to the <a href="#!/guide/extending_test_clas">Extending test class</a> guide.
*
* This option can be also specified in the test file descriptor.
*/
testClass : Siesta.Test.NodeJS,
transparentEx : true,
baseDirectory : null,
contentManagerClass : Siesta.Content.Manager.NodeJS,
scopeProvider : 'Scope.Provider.NodeJsEmbed',
chdirToIndex : true,
ecmaModulesEnabled : function () {
return Boolean(require('module')._extensions[ '.mjs' ])
}
},
methods : {
getScopeProviderConfigFor : function (desc, launchId) {
var config = this.SUPER(desc, launchId)
config.requireFunc = PROJECT_REQUIRE || require
return config
},
startAnonymously : function () {
var isLauncher = typeof AS_LAUNCHER != 'undefined'
var testFileGlob = this.ecmaModulesEnabled ? "**/*.t.?(m)js" : "**/*.t.js"
var res = this.processArguments(process.argv.slice(isLauncher ? 2 : 3))
var argv = res.argv
var options = res.options
if (argv.length == 0 && (options.help || options.version)) {
// shortcut to show the help/version text immediately, w/o scanning current directory
this.start()
} else {
var globPattern = argv[ 0 ] || options.glob || testFileGlob
var files = glob.sync(globPattern, { matchBase : false, ignore : '**/node_modules/**' })
var baseDir = process.cwd()
var me = this
var items = []
files.forEach(function (file) {
var stat = fs.statSync(file)
if (stat.isDirectory()) {
me.planDirectory(file, baseDir)
} else
items.push(file)
})
this.plan(items)
this.start()
}
},
/**
* This method scans the given directory for test files (`*.t.js` by default)
* and adds them to the project plan.
*
* @param {String} dirname The directory to scan for test files
*/
planDirectory : function (dirname, baseDir) {
baseDir = baseDir || dirname
var testFileGlob = this.ecmaModulesEnabled ? "**/*.t.?(m)js" : "**/*.t.js"
var testsInDir = glob.sync(testFileGlob, { cwd : dirname, matchBase : true, ignore : '**/node_modules/**' })
this.plan(
testsInDir.map(function (testFile) {
return path.relative(baseDir, path.resolve(dirname, testFile))
})
)
}
}
})
//eof Siesta.Project.NodeJS
}()