Manipulator: path.resolve(__dirname, '../js/src/dom/manipulator.js'),
Polyfill: path.resolve(__dirname, '../js/src/dom/polyfill.js'),
SelectorEngine: path.resolve(__dirname, '../js/src/dom/selector-engine.js'),
- Alert: path.resolve(__dirname, '../js/src/alert/alert.js'),
- Button: path.resolve(__dirname, '../js/src/button/button.js'),
- Carousel: path.resolve(__dirname, '../js/src/carousel/carousel.js'),
- Collapse: path.resolve(__dirname, '../js/src/collapse/collapse.js'),
- Dropdown: path.resolve(__dirname, '../js/src/dropdown/dropdown.js'),
- Modal: path.resolve(__dirname, '../js/src/modal/modal.js'),
- Popover: path.resolve(__dirname, '../js/src/popover/popover.js'),
- ScrollSpy: path.resolve(__dirname, '../js/src/scrollspy/scrollspy.js'),
- Tab: path.resolve(__dirname, '../js/src/tab/tab.js'),
- Toast: path.resolve(__dirname, '../js/src/toast/toast.js'),
- Tooltip: path.resolve(__dirname, '../js/src/tooltip/tooltip.js')
+ Alert: path.resolve(__dirname, '../js/src/alert.js'),
+ Button: path.resolve(__dirname, '../js/src/button.js'),
+ Carousel: path.resolve(__dirname, '../js/src/carousel.js'),
+ Collapse: path.resolve(__dirname, '../js/src/collapse.js'),
+ Dropdown: path.resolve(__dirname, '../js/src/dropdown.js'),
+ Modal: path.resolve(__dirname, '../js/src/modal.js'),
+ Popover: path.resolve(__dirname, '../js/src/popover.js'),
+ ScrollSpy: path.resolve(__dirname, '../js/src/scrollspy.js'),
+ Tab: path.resolve(__dirname, '../js/src/tab.js'),
+ Toast: path.resolve(__dirname, '../js/src/toast.js'),
+ Tooltip: path.resolve(__dirname, '../js/src/tooltip.js')
}
-const rootPath = '../js/dist/'
+const rootPath = path.resolve(__dirname, '../js/dist/')
const defaultPluginConfig = {
external: [
name: plugin,
sourcemap: true,
globals,
- file: path.resolve(__dirname, `${pluginPath}${pluginFilename}`)
+ file: path.resolve(__dirname, `${pluginPath}/${pluginFilename}`)
})
.then(() => console.log(`Building ${plugin} plugin... Done!`))
.catch(error => console.error(`${plugin}: ${error}`))
* --------------------------------------------------------------------------
*/
-import Alert from './src/alert/alert'
-import Button from './src/button/button'
-import Carousel from './src/carousel/carousel'
-import Collapse from './src/collapse/collapse'
-import Dropdown from './src/dropdown/dropdown'
-import Modal from './src/modal/modal'
-import Popover from './src/popover/popover'
-import ScrollSpy from './src/scrollspy/scrollspy'
-import Tab from './src/tab/tab'
-import Toast from './src/toast/toast'
-import Tooltip from './src/tooltip/tooltip'
+import Alert from './src/alert'
+import Button from './src/button'
+import Carousel from './src/carousel'
+import Collapse from './src/collapse'
+import Dropdown from './src/dropdown'
+import Modal from './src/modal'
+import Popover from './src/popover'
+import ScrollSpy from './src/scrollspy'
+import Tab from './src/tab'
+import Toast from './src/toast'
+import Tooltip from './src/tooltip'
export {
Alert,
* --------------------------------------------------------------------------
*/
-import Alert from './src/alert/alert'
-import Button from './src/button/button'
-import Carousel from './src/carousel/carousel'
-import Collapse from './src/collapse/collapse'
-import Dropdown from './src/dropdown/dropdown'
-import Modal from './src/modal/modal'
-import Popover from './src/popover/popover'
-import ScrollSpy from './src/scrollspy/scrollspy'
-import Tab from './src/tab/tab'
-import Toast from './src/toast/toast'
-import Tooltip from './src/tooltip/tooltip'
+import Alert from './src/alert'
+import Button from './src/button'
+import Carousel from './src/carousel'
+import Collapse from './src/collapse'
+import Dropdown from './src/dropdown'
+import Modal from './src/modal'
+import Popover from './src/popover'
+import ScrollSpy from './src/scrollspy'
+import Tab from './src/tab'
+import Toast from './src/toast'
+import Tooltip from './src/tooltip'
export default {
Alert,
emulateTransitionEnd,
getElementFromSelector,
getTransitionDurationFromElement
-} from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import SelectorEngine from '../dom/selector-engine'
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
* --------------------------------------------------------------------------
*/
-import { getjQuery } from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import SelectorEngine from '../dom/selector-engine'
+import { getjQuery } from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
reflow,
triggerTransitionEnd,
typeCheckConfig
-} from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import Manipulator from '../dom/manipulator'
-import SelectorEngine from '../dom/selector-engine'
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import Manipulator from './dom/manipulator'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
makeArray,
reflow,
typeCheckConfig
-} from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import Manipulator from '../dom/manipulator'
-import SelectorEngine from '../dom/selector-engine'
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import Manipulator from './dom/manipulator'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
makeArray,
noop,
typeCheckConfig
-} from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import Manipulator from '../dom/manipulator'
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import Manipulator from './dom/manipulator'
import Popper from 'popper.js'
-import SelectorEngine from '../dom/selector-engine'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
makeArray,
reflow,
typeCheckConfig
-} from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import Manipulator from '../dom/manipulator'
-import SelectorEngine from '../dom/selector-engine'
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import Manipulator from './dom/manipulator'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
* --------------------------------------------------------------------------
*/
-import { getjQuery } from '../util/index'
-import Data from '../dom/data'
-import SelectorEngine from '../dom/selector-engine'
-import Tooltip from '../tooltip/tooltip'
+import { getjQuery } from './util/index'
+import Data from './dom/data'
+import SelectorEngine from './dom/selector-engine'
+import Tooltip from './tooltip'
/**
* ------------------------------------------------------------------------
getUID,
makeArray,
typeCheckConfig
-} from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import Manipulator from '../dom/manipulator'
-import SelectorEngine from '../dom/selector-engine'
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import Manipulator from './dom/manipulator'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
getTransitionDurationFromElement,
makeArray,
reflow
-} from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import SelectorEngine from '../dom/selector-engine'
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
getTransitionDurationFromElement,
reflow,
typeCheckConfig
-} from '../util/index'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import Manipulator from '../dom/manipulator'
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import Manipulator from './dom/manipulator'
/**
* ------------------------------------------------------------------------
makeArray,
noop,
typeCheckConfig
-} from '../util/index'
+} from './util/index'
import {
DefaultWhitelist,
sanitizeHtml
-} from '../util/sanitizer'
-import Data from '../dom/data'
-import EventHandler from '../dom/event-handler'
-import Manipulator from '../dom/manipulator'
+} from './util/sanitizer'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import Manipulator from './dom/manipulator'
import Popper from 'popper.js'
-import SelectorEngine from '../dom/selector-engine'
+import SelectorEngine from './dom/selector-engine'
/**
* ------------------------------------------------------------------------
## How does Bootstrap's test suite work?
-Bootstrap uses [Jasmine](https://jasmine.github.io/). Each plugin has a file dedicated to its tests in `src/<plugin-name>/<plugin-name>.spec.js`.
+Bootstrap uses [Jasmine](https://jasmine.github.io/). Each plugin has a file dedicated to its tests in `tests/units/<plugin-name>.spec.js`.
* `visual/` contains "visual" tests which are run interactively in real browsers and require manual verification by humans.
## How do I add a new unit test?
-1. Locate and open the file dedicated to the plugin which you need to add tests to (`src/<plugin-name>/<plugin-name>.spec.js`).
+1. Locate and open the file dedicated to the plugin which you need to add tests to (`tests/units/<plugin-name>.spec.js`).
2. Review the [Jasmine API Documentation](https://jasmine.github.io/pages/docs_home.html) and use the existing tests as references for how to structure your new tests.
3. Write the necessary unit test(s) for the new or revised functionality.
4. Run `npm run js-test` to see the results of your newly-added test(s).
## Code coverage
-Currently we're aiming for at least 90% test coverage for our code. To ensure your changes meet or exceed this limit, run `npm run js-compile && npm run js-test` and open the file in `js/coverage/lcov-report/index.html` to see the code coverage for each plugin. See more details when you select a plugin and ensure your change is fully covered by unit tests.
+Currently we're aiming for at least 90% test coverage for our code. To ensure your changes meet or exceed this limit, run `npm run js-test-karma` and open the file in `js/coverage/lcov-report/index.html` to see the code coverage for each plugin. See more details when you select a plugin and ensure your change is fully covered by unit tests.
### Example tests
}
}
-const rollupPreprocessor = {
- plugins: [
- istanbul({
- exclude: ['js/src/**/*.spec.js']
- }),
- babel({
- // Only transpile our source code
- exclude: 'node_modules/**',
- // Include only required helpers
- externalHelpersWhitelist: [
- 'defineProperties',
- 'createClass',
- 'inheritsLoose',
- 'defineProperty',
- 'objectSpread2'
- ],
- plugins: [
- '@babel/plugin-proposal-object-rest-spread'
- ]
- }),
- resolve()
- ],
- output: {
- format: 'iife',
- name: 'bootstrapTest',
- sourcemap: 'inline'
- }
-}
-
-let files = [
- 'node_modules/hammer-simulator/index.js'
-]
-
const conf = {
basePath: '../..',
port: 9876,
concurrency: Infinity,
client: {
clearContext: false
+ },
+ files: [
+ 'node_modules/hammer-simulator/index.js',
+ { pattern: 'js/tests/units/**/*.spec.js', watched: !browserStack }
+ ],
+ preprocessors: {
+ 'js/tests/units/**/*.spec.js': ['rollup']
+ },
+ rollupPreprocessor: {
+ plugins: [
+ istanbul({
+ exclude: ['js/tests/units/**/*.spec.js', 'js/tests/helpers/**/*.js']
+ }),
+ babel({
+ // Only transpile our source code
+ exclude: 'node_modules/**',
+ // Include only required helpers
+ externalHelpersWhitelist: [
+ 'defineProperties',
+ 'createClass',
+ 'inheritsLoose',
+ 'defineProperty',
+ 'objectSpread2'
+ ],
+ plugins: [
+ '@babel/plugin-proposal-object-rest-spread'
+ ]
+ }),
+ resolve()
+ ],
+ output: {
+ format: 'iife',
+ name: 'bootstrapTest',
+ sourcemap: 'inline'
+ }
}
}
conf.customLaunchers = browsers
conf.browsers = browsersKeys
reporters.push('BrowserStack', 'kjhtml')
- files = files.concat([
- { pattern: 'js/src/**/*.spec.js', watched: false }
- ])
- conf.preprocessors = {
- 'js/src/**/*.spec.js': ['rollup']
- }
- conf.rollupPreprocessor = rollupPreprocessor
} else {
frameworks.push('detectBrowsers')
plugins.push(
'karma-detect-browsers',
'karma-coverage-istanbul-reporter'
)
- files = files.concat([
- { pattern: 'js/src/**/*.spec.js', watched: true }
- ])
reporters.push('coverage-istanbul')
- conf.preprocessors = {
- 'js/src/**/*.spec.js': ['rollup']
- }
- conf.rollupPreprocessor = rollupPreprocessor
conf.customLaunchers = customLaunchers
conf.detectBrowsers = detectBrowsers
conf.coverageIstanbulReporter = {
conf.frameworks = frameworks
conf.plugins = plugins
conf.reporters = reporters
-conf.files = files
module.exports = karmaConfig => {
// possible values: karmaConfig.LOG_DISABLE || karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN || karmaConfig.LOG_INFO || karmaConfig.LOG_DEBUG
{
"root": true,
"extends": [
- "../../.eslintrc.json"
+ "../../../.eslintrc.json"
],
"overrides": [
{
-import Alert from './alert'
-import { makeArray, getTransitionDurationFromElement } from '../util/index'
+import Alert from '../../src/alert'
+import { makeArray, getTransitionDurationFromElement } from '../../src/util/index'
/** Test helpers */
-import { getFixture, clearFixture, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, jQueryMock } from '../helpers/fixture'
describe('Alert', () => {
let fixtureEl
-import Button from './button'
-import EventHandler from '../dom/event-handler'
+import Button from '../../src/button'
+import EventHandler from '../../src/dom/event-handler'
/** Test helpers */
import {
clearFixture,
createEvent,
jQueryMock
-} from '../../tests/helpers/fixture'
+} from '../helpers/fixture'
describe('Button', () => {
let fixtureEl
-import Carousel from './carousel'
-import EventHandler from '../dom/event-handler'
+import Carousel from '../../src/carousel'
+import EventHandler from '../../src/dom/event-handler'
/** Test helpers */
-import { getFixture, clearFixture, createEvent, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, createEvent, jQueryMock } from '../helpers/fixture'
describe('Carousel', () => {
const { Simulator, PointerEvent, MSPointerEvent } = window
-import Collapse from './collapse'
-import EventHandler from '../dom/event-handler'
-import { makeArray } from '../util/index'
+import Collapse from '../../src/collapse'
+import EventHandler from '../../src/dom/event-handler'
+import { makeArray } from '../../src/util/index'
/** Test helpers */
-import { getFixture, clearFixture, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, jQueryMock } from '../helpers/fixture'
describe('Collapse', () => {
let fixtureEl
-import Data from './data'
+import Data from '../../../src/dom/data'
/** Test helpers */
-import { getFixture, clearFixture } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture } from '../../helpers/fixture'
describe('Data', () => {
let fixtureEl
-import EventHandler from './event-handler'
+import EventHandler from '../../../src/dom/event-handler'
/** Test helpers */
-import { getFixture, clearFixture } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture } from '../../helpers/fixture'
describe('EventHandler', () => {
let fixtureEl
-import Manipulator from './manipulator'
+import Manipulator from '../../../src/dom/manipulator'
/** Test helpers */
-import { getFixture, clearFixture } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture } from '../../helpers/fixture'
describe('Manipulator', () => {
let fixtureEl
-import SelectorEngine from './selector-engine'
-import { makeArray } from '../util/index'
+import SelectorEngine from '../../../src/dom/selector-engine'
+import { makeArray } from '../../../src/util/index'
/** Test helpers */
-import { getFixture, clearFixture } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture } from '../../helpers/fixture'
describe('SelectorEngine', () => {
let fixtureEl
import Popper from 'popper.js'
-import Dropdown from './dropdown'
-import EventHandler from '../dom/event-handler'
+import Dropdown from '../../src/dropdown'
+import EventHandler from '../../src/dom/event-handler'
/** Test helpers */
-import { getFixture, clearFixture, createEvent, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, createEvent, jQueryMock } from '../helpers/fixture'
describe('Dropdown', () => {
let fixtureEl
-import Modal from './modal'
-import EventHandler from '../dom/event-handler'
-import { makeArray } from '../util/index'
+import Modal from '../../src/modal'
+import EventHandler from '../../src/dom/event-handler'
+import { makeArray } from '../../src/util/index'
/** Test helpers */
-import { getFixture, clearFixture, createEvent, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, createEvent, jQueryMock } from '../helpers/fixture'
describe('Modal', () => {
let fixtureEl
-import Popover from './popover'
-import { makeArray } from '../util/index'
+import Popover from '../../src/popover'
+import { makeArray } from '../../src/util/index'
/** Test helpers */
-import { getFixture, clearFixture, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, jQueryMock } from '../helpers/fixture'
describe('Popover', () => {
let fixtureEl
-import ScrollSpy from './scrollspy'
-import Manipulator from '../dom/manipulator'
-import EventHandler from '../dom/event-handler'
+import ScrollSpy from '../../src/scrollspy'
+import Manipulator from '../../src/dom/manipulator'
+import EventHandler from '../../src/dom/event-handler'
/** Test helpers */
-import { getFixture, clearFixture, createEvent, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, createEvent, jQueryMock } from '../helpers/fixture'
describe('ScrollSpy', () => {
let fixtureEl
-import Tab from './tab'
+import Tab from '../../src/tab'
/** Test helpers */
-import { getFixture, clearFixture, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, jQueryMock } from '../helpers/fixture'
describe('Tab', () => {
let fixtureEl
-import Toast from './toast'
+import Toast from '../../src/toast'
/** Test helpers */
-import { getFixture, clearFixture, jQueryMock } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, jQueryMock } from '../helpers/fixture'
describe('Toast', () => {
let fixtureEl
-import Tooltip from './tooltip'
-import EventHandler from '../dom/event-handler'
-import { makeArray, noop } from '../util/index'
+import Tooltip from '../../src/tooltip'
+import EventHandler from '../../src/dom/event-handler'
+import { makeArray, noop } from '../../src/util/index'
/** Test helpers */
-import { getFixture, clearFixture, jQueryMock, createEvent } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture, jQueryMock, createEvent } from '../helpers/fixture'
describe('Tooltip', () => {
let fixtureEl
-import * as Util from './index'
+import * as Util from '../../../src/util/index'
/** Test helpers */
-import { getFixture, clearFixture } from '../../tests/helpers/fixture'
+import { getFixture, clearFixture } from '../../helpers/fixture'
describe('Util', () => {
let fixtureEl
-import { DefaultWhitelist, sanitizeHtml } from './sanitizer'
+import { DefaultWhitelist, sanitizeHtml } from '../../../src/util/sanitizer'
describe('Sanitizer', () => {
describe('sanitizeHtml', () => {
"files": [
"dist/{css,js}/*.{css,js,map}",
"js/{src,dist}/**/*.{js,map}",
- "!js/src/**/*.spec.js",
"scss/**/*.scss"
],
"hugo-bin": {