diff --git a/.npmignore b/.npmignore index 1a875007..414ec52b 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,4 @@ +# src should not be here, we need to publish it for typings. .idea node_modules integration-test @@ -6,4 +7,3 @@ remote-pay-cloud.iml npm-debug.log .gradle gradle -src \ No newline at end of file diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..cf7bb808 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @david-clover-com @mike-clover-com \ No newline at end of file diff --git a/README.md b/README.md index baf31bac..b6c5fb82 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Do not change this or the versioning may not reflect the npm version correctly. ---> ## Version -Current version: 1.4.2 +Current version: 1.4.3 ## Platforms supported @@ -34,6 +34,13 @@ Please see the [Getting started with Clover Connector tutorial for JavaScript](h ### Examples Example applications can be found on [GitHub](https://github.com/clover/remote-pay-cloud-examples). +### Additional resources +- [Online Docs](http://clover.github.io/remote-pay-cloud/1.4.3/) +- [Release Notes](https://github.com/clover/remote-pay-cloud/releases) +- [Tutorial for the Browser SDK](https://docs.clover.com/build/getting-started-with-cloverconnector/?sdk=browser) +- [API Class Documentation](http://clover.github.io/remote-pay-cloud-api/1.4.2/) +- [Clover Developer Community](https://community.clover.com/index.html) + ## License Copyright © 2017 Clover Network, Inc. All rights reserved. diff --git a/build.gradle b/build.gradle index 8e06e501..31192066 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,8 @@ plugins { node { download = true + version = '8.9.3' + npmVersion = '5.5.1' } task build(type: GulpTask, dependsOn: [installGulp, npmInstall]) { diff --git a/index.js b/index.js index 10413ad9..cbb704f9 100644 --- a/index.js +++ b/index.js @@ -35,7 +35,7 @@ var WebSocketCloverTransport = require('./dist/com/clover/remote/client/transpor var WebSocketState = require('./dist/com/clover/websocket/WebSocketState.js').WebSocketState; var CloverWebSocketInterface = require('./dist/com/clover/websocket/CloverWebSocketInterface.js').CloverWebSocketInterface; var BrowserWebSocketImpl = require('./dist/com/clover/websocket/BrowserWebSocketImpl.js').BrowserWebSocketImpl; - +var JSONToCustomObject = require('./dist/com/clover/json/JSONToCustomObject.js').JSONToCustomObject; var CloverConnectorFactoryBuilder = require('./dist/com/clover/remote/client/CloverConnectorFactoryBuilder.js').CloverConnectorFactoryBuilder; var ICloverConnectorFactory = require('./dist/com/clover/remote/client/ICloverConnectorFactory.js').ICloverConnectorFactory; @@ -66,6 +66,7 @@ module.exports = { WebSocketCloverTransport: WebSocketCloverTransport, CloverWebSocketInterface: CloverWebSocketInterface, BrowserWebSocketImpl: BrowserWebSocketImpl, + JSONToCustomObject: JSONToCustomObject, ImageUtil: ImageUtil, Logger: Logger, HttpSupport: HttpSupport, diff --git a/integration-test/.gitignore b/integration-test/.gitignore deleted file mode 100644 index f92b7f34..00000000 --- a/integration-test/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -public/css/ -public/testConfig.json -built/ -.gradle/ \ No newline at end of file diff --git a/integration-test/.npmrc b/integration-test/.npmrc deleted file mode 100644 index 9cf94950..00000000 --- a/integration-test/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false \ No newline at end of file diff --git a/integration-test/README.md b/integration-test/README.md deleted file mode 100644 index a7b90a2b..00000000 --- a/integration-test/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Integration Test Application - -This is a web application that is intended for Clover internal use. It is both a driver and reporting mechanism for our integration tests. These tests require a connection to a Clover device and exercise the SDK as well as Cloud and Network Pay Display. - -# Requirements - -This application relies on JSON test definitions that are pulled from an internal/private Clover project called Pidgin (pidgin-test).allows for manual execution of our automated test suite. It assumes the test-definitions-api REST service is running on localhost:3001. - -Run: -``` -gradlew build startTestApp -``` -and navigate to localhost:3000 \ No newline at end of file diff --git a/integration-test/build.gradle b/integration-test/build.gradle deleted file mode 100644 index 0da22021..00000000 --- a/integration-test/build.gradle +++ /dev/null @@ -1,40 +0,0 @@ -plugins { - id "com.moowork.node" -} - -node { - download = true -} - -ext { - nodeModulesPath = './node_modules' - scssFile = "scss/test-automater.scss" -} - -task sass(type: NodeTask, dependsOn: npmInstall) { - script = file(nodeModulesPath + '/node-sass/bin/node-sass') - args = [scssFile, "-o", "public/css"] - - inputs.files scssFile - outputs.file file('public/css/test-automater.scss') -} - -task sassWatch(type: NodeTask, dependsOn: npmInstall) { - script = file(nodeModulesPath + '/node-sass/bin/node-sass') - args = ["scss/test-automater.scss", "-o", "public/css", "-w"] -} - -task build(type: NodeTask, dependsOn: [npmInstall, sass]) { - script = [nodeModulesPath + '/webpack/bin/webpack'] -} - -task watchTestApp(type: NodeTask, dependsOn: npmInstall) { - script = [nodeModulesPath + '/webpack/bin/webpack'] - args = ['--watch'] -} - -task startTestApp(type: NodeTask, dependsOn: [npmInstall, build]) { - script = ['./integration-test/server.js'] -} - -defaultTasks 'build' \ No newline at end of file diff --git a/integration-test/package.json b/integration-test/package.json deleted file mode 100644 index 0883148c..00000000 --- a/integration-test/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "pidgin-test-app", - "version": "0.0.0", - "private": true, - "dependencies": { - "ag-grid": "14.2.0", - "ag-grid-react": "14.2.0", - "react-bootstrap": "0.31.5", - "bootstrap-sass": "3.3.7", - "express": "4.15.5", - "react": "16.1.1", - "react-dom": "16.1.1", - "react-dom-factories": "1.0.2", - "react-router-dom": "4.2.2", - "immutable": "^3.8.2", - "select2": "3.5.1", - "webpack": "3.8.1", - "remote-pay-cloud": "dev", - "react-select2-wrapper": "1.0.4-beta5", - "babel-cli": "^6.11.4", - "babel-core": "^6.13.2", - "babel-preset-env": "1.6.1", - "babel-preset-react": "^6.11.1", - "babel-loader": "7.1.2", - "rxjs": "5.5.2", - "node-sass": "4.7.2" - } -} diff --git a/integration-test/public/Constants.js b/integration-test/public/Constants.js deleted file mode 100644 index 3cf950e7..00000000 --- a/integration-test/public/Constants.js +++ /dev/null @@ -1,9 +0,0 @@ -const create = () => { - - return { - localStorageConfigKey: "pidgin-test-config", - localStorageSelectedTests: "selected-pidgin-tests" - } -}; - -export {create} \ No newline at end of file diff --git a/integration-test/public/app/EventService.js b/integration-test/public/app/EventService.js deleted file mode 100644 index ebc67eec..00000000 --- a/integration-test/public/app/EventService.js +++ /dev/null @@ -1,13 +0,0 @@ -import Rx from "rxjs"; - -const testObservable = new Rx.Subject(); -const pairingObservable = new Rx.Subject(); -const get = () => { - - return { - testObservable: testObservable, - pairingObservable: pairingObservable - } -}; - -export {get} diff --git a/integration-test/public/app/TestRunner.js b/integration-test/public/app/TestRunner.js deleted file mode 100644 index b408a153..00000000 --- a/integration-test/public/app/TestRunner.js +++ /dev/null @@ -1,271 +0,0 @@ -import React from "react"; -import Select2 from "react-select2-wrapper"; -import * as Constants from "../Constants"; -import Popup from "./components/Popup"; -import ResultsGrid from "./components/ResultsGrid"; - -import {List, fromJS} from "immutable"; -import {LogLevel, Logger} from "../test-engine/util/Logger"; -import * as lstrNester from "../test-engine/CloverConnectorLstrNester"; -import * as cloverConnectorTestManager from "../test-engine/CloverConnectorTestManager"; -import * as EventService from "./EventService" -import {Button, ButtonGroup, DropdownButton, MenuItem, Modal} from "react-bootstrap"; -import * as ActionStatus from "../test-engine/ActionStatus"; - -export default class TestRunner extends React.Component { - - constructor(props) { - super(props); - this.state = { - testCases: ["loading..."], - results: List() - }; - - this.constants = Constants.create(); - - jQuery.ajax({ - type: "GET", - url: "../testConfig.json", - error: (xhr, status, message) => { - Logger.log(LogLevel.ERROR, `Failure: An error has occurred and the connection configuration could not be loaded: Details ${message}.`); - } - }).done(testConfig => { - this.setState({ - testConfig: testConfig - }); - this.state.onlyOneConnectorConfig = this.state.testConfig.connectorConfigs.length === 1 ? true : false; - this.loadTests(); - }); - - this.savedTests = JSON.parse(window.localStorage.getItem(this.constants.localStorageSelectedTests)); - - this.lNester = lstrNester.create(); - - EventService.get().pairingObservable.subscribe(msg => { - this.setState({ - pairingCodeMsg: msg - }); - }); - - this.runTests = this.runTests.bind(this); - this.toggleSelections = this.toggleSelections.bind(this); - this.onRunTestChange = this.onRunTestChange.bind(this); - this.toggleTestConnectors = this.toggleTestConnectors.bind(this); - this.handleTestNameChange = this.handleTestNameChange.bind(this); - this.toggleModal = this.toggleModal.bind(this); - this.loadConfig = this.loadConfig.bind(this); - this.saveSelect2Selection = this.saveSelect2Selection.bind(this); - this.loadTestsIntoSelect2 = this.loadTestsIntoSelect2.bind(this); - } - - loadTests() { - this.lNester.loadTests(this.state.testConfig).done((testDefinitionResponse) => { - if (this.lNester.validateTestDefinitionResponse(testDefinitionResponse)) { - this.testCases = testDefinitionResponse["testCases"]; - const testCasesToRun = []; - lodash.forEach(this.testCases, (value, key) => { - testCasesToRun.push({ - id: key, - text: value.name - }); - }); - this.setState({ - testCases: testCasesToRun - }); - } - }); - } - - onRunTestChange() { - this.setState({ - results: this.getTestCasesToRun() - }); - } - - toggleTestConnectors() { - this.setState({ - displayConnectorConfig: !this.state.displayConnectorConfig - }); - } - - handleTestNameChange (e) { - this.testConfigName = e.target.value; - } - - loadConfig() { - // Get existing config and add to it - let existingTestConfigs = window.localStorage.getItem(this.localStorageSelectedTests); - if (existingTestConfigs) { - this.loadTestsIntoSelect2(JSON.parse(existingTestConfigs)); - } - } - - loadTestsIntoSelect2(tests) { - this.refs.allTestCasesSelect2.el.val(tests).trigger('change'); - } - - saveSelect2Selection() { - let testName = this.refs.testName.value; - let currTests = JSON.parse(window.localStorage.getItem(this.constants.localStorageSelectedTests)) || {}; - currTests[testName] = this.selectedTestCasesToRun; - window.localStorage.setItem(this.constants.localStorageSelectedTests, JSON.stringify(currTests)); - this.setState({ - displayModal: !this.state.displayModal - }); - } - - toggleModal() { - this.setState({ - displayModal: !this.state.displayModal - }); - } - - runTests() { - const testCasesToRun = this.getTestCasesToRun(); - - // Reset the state so that results are cleared for each test run. - this.setState({ - results: testCasesToRun - }); - - EventService.get().testObservable.subscribe(update => { - // Update the results, if a test name match is found. - // Currently, assumes there are no duplicate test names. - const updatedResults = this.state.results.update( - this.state.results.findIndex(function(item) { - return item.get("name") === update.name; - }), function() { - update.result = {}; - if (update.testActions) { - // Roll-up action status to the test. - for (let i = 0; i < update.testActions.length; i++) { - const action = update.testActions[i]; - if (action.result) { - if (action.result !== ActionStatus.get().pass) { - update.result.status = action.result.status; - break; - } - } else { - update.result.status = ActionStatus.get().executing; - break; - } - } - if (!update.result.status) { - update.result.status = ActionStatus.get().pass; - } - } - return fromJS(update); - } - ); - this.setState({ - results: updatedResults - }); - }); - - cloverConnectorTestManager.create().execute(this.state.testConfig, testCasesToRun.toJS()); - } - - getTestCasesToRun() { - this.selectedTestCasesToRun = this.refs.allTestCasesSelect2.el.val(); - return fromJS(lodash.map(this.selectedTestCasesToRun, (fileName) => { - return this.testCases[fileName]; - })); - } - - toggleSelections(event) { - let selectedItems = []; - if (event && event.target.checked) { - selectedItems = jQuery(this.refs.allTestCasesSelect2.el).find('option').map(function() { return this.value }); - } - this.refs.allTestCasesSelect2.el.val(selectedItems).trigger('change'); - } - - render() { - let closeCallback = () => { - this.state.pairingCodeMsg = undefined; - }; - - let savedTests = JSON.parse(window.localStorage.getItem(this.constants.localStorageSelectedTests)); - let menuItems = []; - if (savedTests) { - lodash.forEach(savedTests, (value, key) => { - menuItems.push( {this.loadTestsIntoSelect2(value)}}>{key}); - }); - } - - return ( -
- {this.state.onlyOneConnectorConfig && -
-
- Warning! To completely test the JavaScript SDK you should be running with one Network and one Cloud connector configuration! - -
-
} -
-
- -
-
-
- {this.state.pairingCodeMsg && } - - - Save Seleted Tests - - - Test Name: - - - - - - -
- Select/Deselect all tests: -
-
-
- - - - -
-
-

-
- - - - {menuItems} - - -
-

-
- - {this.state.displayConnectorConfig && } -
-
-
- -
- ); - } -} \ No newline at end of file diff --git a/integration-test/public/app/components/Popup.js b/integration-test/public/app/components/Popup.js deleted file mode 100644 index 1e2b9453..00000000 --- a/integration-test/public/app/components/Popup.js +++ /dev/null @@ -1,51 +0,0 @@ -import React from "react"; - -export default class Popup extends React.Component { - constructor(props) { - super(props); - this.state = { - displayed: true, - message: '', - fadeBackground: false - }; - this.closeCallback = this.closeCallback.bind(this); - this.fadeBackground = this.fadeBackground.bind(this); - this.unfadeBackground = this.unfadeBackground.bind(this); - this.unfadeBackground = this.unfadeBackground.bind(this); - this.setMessage = this.setMessage.bind(this); - } - - closeCallback() { - this.setState({fadeBackground: false, displayed: false}); - this.props.closeCallback(); - } - - setMessage(msg) { - this.setState({message: msg}); - } - - fadeBackground(){ // fades background for popup - this.setState({ fadeBackground: true }); - } - - unfadeBackground(){ // unfades background - this.setState({ fadeBackground: false }); - } - - render () { - let popup; - if (this.state.displayed) { - popup = ( -
-
-
X
-
{this.props.message}
-
- ); - } else { - popup = null; - } - - return (popup); - } -} diff --git a/integration-test/public/app/components/ResultsGrid.js b/integration-test/public/app/components/ResultsGrid.js deleted file mode 100644 index 049f3d46..00000000 --- a/integration-test/public/app/components/ResultsGrid.js +++ /dev/null @@ -1,119 +0,0 @@ -import React, {Component} from "react"; -import {AgGridReact} from "ag-grid-react"; -import * as ActionStatus from "../../test-engine/ActionStatus"; - -export default class ResultsGrid extends Component { - - constructor(props) { - super(props); - - this.state = { - gridOptions: { - context: { - componentParent: this - } - }, - columnDefs: ResultsGrid.createColumnDefs(), - getNodeChildDetails: function getNodeChildDetails(rowItem) { - if (rowItem.before || rowItem.after) { - rowItem.beforeAndAfters = rowItem.beforeAndAfters || []; - if (rowItem.beforeAndAfters.length === 0) { - // Don't reinitialize - if (rowItem.before) { - rowItem.before.forEach(beforeTest => { - beforeTest.name += "(before)"; - }); - rowItem.beforeAndAfters = rowItem.beforeAndAfters.concat(rowItem.before); - } - if (rowItem.after) { - rowItem.after.forEach(afterTest => { - afterTest.name += "(after)"; - }); - rowItem.beforeAndAfters = rowItem.beforeAndAfters.concat(rowItem.after); - } - } - return { - group: true, - expanded: true, - children: rowItem.beforeAndAfters, - key: rowItem.name - }; - } else if (rowItem.testActions) { - return { - group: true, - expanded: true, - children: rowItem.testActions, - key: rowItem.name - }; - } else { - return null; - } - } - }; - - this.onGridReady = this.onGridReady.bind(this); - } - - componentDidUpdate(prevProps, prevState) { - if (this.gridApi) { - // Update the grid data, only if it changed. - if (!this.props.rowData.equals(prevProps.rowData)) { - this.gridApi.setRowData(this.props.rowData.toJS()); - } - } - } - - onGridReady(params) { - this.gridApi = params.api; - this.columnApi = params.columnApi; - this.gridApi.sizeColumnsToFit(); - } - - static createColumnDefs() { - return [ - { - headerName: "Name", - field: "name", - cellRenderer: "group", - width: 100, - cellRendererParams: { - padding: 10 - } - }, - { - headerName: "Status", - field: "result.status", - width: 60, - cellRenderer: (params) => { - if (params.value === ActionStatus.get().pass) { - return `${params.value}`; - } else if (params.value === ActionStatus.get().fail) { - return `${params.value}`; - } else if (params.value === ActionStatus.get().executing) { - return `... ${params.value}`; - } else { - return ``; - } - } - }, - { - headerName: "Message", - field: "result.message" - } - ]; - } - - render() { - return ( -
- - -
- ); - } -}; \ No newline at end of file diff --git a/integration-test/public/images/clover_logo.png b/integration-test/public/images/clover_logo.png deleted file mode 100644 index ac6ba61d..00000000 Binary files a/integration-test/public/images/clover_logo.png and /dev/null differ diff --git a/integration-test/public/images/loading.gif b/integration-test/public/images/loading.gif deleted file mode 100644 index dce8fa3f..00000000 Binary files a/integration-test/public/images/loading.gif and /dev/null differ diff --git a/integration-test/public/index.html b/integration-test/public/index.html deleted file mode 100644 index dae006c2..00000000 --- a/integration-test/public/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Pidgin Automation Tests -
- - - - \ No newline at end of file diff --git a/integration-test/public/index.js b/integration-test/public/index.js deleted file mode 100644 index 1b20c9ee..00000000 --- a/integration-test/public/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react' -import { render } from 'react-dom' -import TestRunner from "./app/TestRunner"; - -render(( - -), document.getElementById('react-root')); diff --git a/integration-test/public/test-engine/ActionExecutor.js b/integration-test/public/test-engine/ActionExecutor.js deleted file mode 100644 index ecb7a641..00000000 --- a/integration-test/public/test-engine/ActionExecutor.js +++ /dev/null @@ -1,168 +0,0 @@ -import * as testExecutor from "./TestExecutor"; -import {LogLevel, Logger} from "./util/Logger"; -import * as iterable from "./util/Iterable"; -import * as testUtils from "./util/TestUtils"; -import * as EventService from "../app/EventService"; -import * as ActionStatus from "./ActionStatus"; - -/** - * Utility for executing actions. - * - * @returns {{executeActions: executeActions, executeAction: executeAction}} - */ -const create = (resultCache, testConnector, testCase) => { - - return { - - /** - * Executes an actions iterable. Returns a promise that is resolved when all actions have completed. - * - * @param actionItr - */ - executeActions: function (actionItr) { - const actionsCompleteDeferred = new jQuery.Deferred(); - return executeActionsInternal(actionsCompleteDeferred, actionItr); - }, - - /** - * Executes an action. Returns a promise that is resolved when the action has completed. - * - * @param action - */ - executeAction: function (action) { - return executeActionInternal(action); - } - }; - - /** - * For each root action we need to serially execute all before actions, action iterations, and after actions. - * - * @param actionsCompleteDeferred - * @param actionItr - */ - function executeActionsInternal(actionsCompleteDeferred, actionItr, actionResults) { - if (!actionResults) { - actionResults = []; - } - if (actionItr.hasNext()) { - const action = actionItr.next().value; - const beforeActionItr = iterable.makeIterator(action["before"] || []); - const executeBeforeActionsDeferred = new jQuery.Deferred(); - executeBeforeOrAfterActions(executeBeforeActionsDeferred, beforeActionItr) - .then(() => { - const iterations = lodash.get(action, ["parameters", "iterations"], 1); - let allActionIterations = []; - // Populate test actions for each iteration. - for (let i = 0; i < iterations; i++) { - allActionIterations = allActionIterations.concat(action); - } - const executeActionIterationsDeferred = new jQuery.Deferred(); - const allActionsItr = iterable.makeIterator(allActionIterations); - return executeActionIterations(executeActionIterationsDeferred, allActionsItr, actionResults); - }) - .then(() => { - const executeAfterActionsDeferred = new jQuery.Deferred(); - const afterActionItr = iterable.makeIterator(action["after"] || []); - return executeBeforeOrAfterActions(executeAfterActionsDeferred, afterActionItr, false); - }) - .then(() => { - executeActionsInternal(actionsCompleteDeferred, actionItr, actionResults); - }); - } else { - actionsCompleteDeferred.resolve(actionResults); - } - return actionsCompleteDeferred.promise(); - }; - - /** - * Executes before/after actions. - * - * @param actionItr - * @param actionResults - * @param before - */ - function executeBeforeOrAfterActions(executeActionsDeferred, actionItr, before = true) { - let action = null; - try { - const order = before ? "before" : "after"; - if (actionItr.hasNext()) { - action = actionItr.next().value; - Logger.log(`Executing ${order} action ${action.name}.`); - // Set the action as before/after for reporting purposes. - //before ? action.before = true : action.before = false; - executeActionInternal(action, []) - .then(() => { - executeBeforeOrAfterActions(executeActionsDeferred, actionItr, before) - }); - } else { - executeActionsDeferred.resolve(); - } - } catch (e) { - const beforeOrAfter = before ? "before" : "after"; - handleActionFailure(action, [], `An error has occurred executing ${beforeOrAfter} action. Details: ${e.message}`, true); - executeActionsDeferred.resolve(); - } - return executeActionsDeferred.promise(); - }; - - /** - * Executes each action iteration. - * - * @param allActionsItr - * @param actionResults - */ - function executeActionIterations(executeActionIterationsDeferred, allActionsItr, actionResults) { - let action = null; - try { - if (allActionsItr.hasNext()) { - action = allActionsItr.next().value; - executeActionInternal(action, actionResults) - .then(() => { - executeActionIterations(executeActionIterationsDeferred, allActionsItr, actionResults) - }); - } else { - executeActionIterationsDeferred.resolve(); - } - } catch (e) { - handleActionFailure(action, actionResults, `An error has occurred executing action iteration for ${action.name}. Details: ${e.message}`, true); - executeActionIterationsDeferred.resolve(); - } - return executeActionIterationsDeferred.promise(); - }; - - function executeActionInternal(action, actionResults) { - Logger.log(LogLevel.INFO, `Executing action ${action.name}`); - - if (!action.result) { - action.result = {}; - } - - action.result.status = ActionStatus.get().executing; - actionResults.push(action); - - if (testCase) { - EventService.get().testObservable.next({ - name: testCase.name, - testActions: actionResults - }); - } - - const actionCompleteDeferred = new jQuery.Deferred(); - const executor = testExecutor.create(action, actionCompleteDeferred, testConnector, resultCache); - // Update the listener with the current executor - testConnector.getListener().setTestExecutor(executor); - executor.executeAction() - .then((action) => { - actionCompleteDeferred.resolve(action); - }); - return actionCompleteDeferred.promise(); - }; - - function handleActionFailure(action, actionResults, message, log = false) { - actionResults.push(action); - testUtils.create().handleActionFailure(action, message, log); - }; -}; - -export {create} - diff --git a/integration-test/public/test-engine/ActionStatus.js b/integration-test/public/test-engine/ActionStatus.js deleted file mode 100644 index 54f45005..00000000 --- a/integration-test/public/test-engine/ActionStatus.js +++ /dev/null @@ -1,10 +0,0 @@ -const get = () => { - - return { - pass: "Pass", - fail: "Fail", - executing: "Executing" - } -}; - -export {get} diff --git a/integration-test/public/test-engine/CloverConnectorLstrNester.js b/integration-test/public/test-engine/CloverConnectorLstrNester.js deleted file mode 100644 index f7fbe4b6..00000000 --- a/integration-test/public/test-engine/CloverConnectorLstrNester.js +++ /dev/null @@ -1,133 +0,0 @@ -import * as cloverConnectorTestManager from "./CloverConnectorTestManager"; -import {LogLevel, Logger} from "./util/Logger"; - -const create = () => { - return { - - /** - * Fire off the test engine. - * - * @param testConfig - */ - loadAndRunTests: function (testConfig) { - if (validateTestConfig(testConfig)) { - loadTests(testConfig).done((testDefinitionResponse) => { - if (validateTestDefinitionResponse(testDefinitionResponse)) { - const testCases = testDefinitionResponse["testCases"]; - const testCasesToRun = lodash.map(testCases, (testCase) => testCase); - //const testCasesToRun = [testCases["infuse_test.json"]]; - cloverConnectorTestManager.create().execute(testConfig, testCasesToRun); - } - }); - } else { - Logger.log(LogLevel.ERROR, "Failure. The tests could not be executed the configuration is not valid."); - } - }, - - - - /** - * Loads the test definitions returns a Promise. - * - * @returns {*} - */ - loadTests: function (testConfig) { - if (testConfig && testConfig.definitionEndpoint) { - // JQuery provided globally via a webpack plugin - https://stackoverflow.com/questions/40035976/how-to-configure-and-use-jquery-with-webpack - return jQuery.ajax({ - type: "GET", - url: testConfig.definitionEndpoint, - error: (xhr, status, message) => { - message = message || "Is the test-definitions REST service up?"; - Logger.log(LogLevel.ERROR, `Failure: An error has occurred and the test definitions could not be loaded: Details: ${message}`); - } - }); - } else { - Logger.log(LogLevel.ERROR, "Failure: Cannot load test definitions. Either no test configuration exists or a definitionEndpoint is not specified on the test configuration."); - } - - }, - - /** - * Validate that the response from retrieving the test-definitions is valid. - * - * @param testDefinitionResponse - * @returns {boolean} - */ - validateTestDefinitionResponse: function(testDefinitionResponse) { - if (!testDefinitionResponse || testDefinitionResponse.status !== "success") { - Logger.log(LogLevel.ERROR, `Failure: An error occurred retrieving the test definitions: Details: ${testDefinitionResponse.message}`); - return false; - } - return true; - } - } - - - /** - * Validates that the test config is valid. - * - * @param testConfig - * @returns {boolean} - */ - function validateTestConfig(testConfig) { - let isValid = true; - const connectorConfigs = testConfig["connectorConfigs"]; - if (!connectorConfigs && lodash.isArray(connectorConfigs)) { - Logger.log(LogLevel.ERROR, "Failure: The test configuration must contain a connectorConfigs property which is an array."); - isValid = false; - } - connectorConfigs.forEach((connectorConfig) => { - if (!validateConnectorConfig(connectorConfig)) { - isValid = false; - } - }); - return isValid; - }; - - /** - * Validates that each connector config. within the test config is valid. - * - * @param connectorConfig - * @returns {boolean} - */ - function validateConnectorConfig(connectorConfig) { - let isValid = true; - if (!lodash.isObject(connectorConfig)) { - Logger.log(LogLevel.ERROR, "Failure: Connector configurations must be objects."); - isValid = false; - } - const connectorConfigType = lodash.get(connectorConfig, "type"); - if (!lodash.has(connectorConfig, "type") || ["cloud", "network"].indexOf(connectorConfigType) < 0) { - Logger.log(LogLevel.ERROR, "Failure: Connector configuration objects must contain a type and the type must be 'network' or 'cloud'."); - isValid = false; - } - if (connectorConfigType === "cloud") { - const requiredCloudConfigProps = ["applicationId", "accessToken", "cloverServer", "merchantId", "deviceId"]; - requiredCloudConfigProps.forEach((requiredCloudConfigProp) => { - if (!lodash.has(connectorConfig, requiredCloudConfigProp)) { - Logger.log(LogLevel.ERROR, `Failure: Cloud configuration objects must define the ${requiredCloudConfigProp} property.`); - isValid = false; - } - }); - } - if (connectorConfigType === "network") { - const requiredNetworkConfigProps = ["applicationId", "wsScheme", "ipAddress", "wsPort"]; - requiredNetworkConfigProps.forEach((requiredNetworkConfigProp) => { - if (!lodash.has(connectorConfig, requiredNetworkConfigProp)) { - Logger.log(LogLevel.ERROR, `Failure: Network configuration objects must define the ${requiredNetworkConfigProp} property.`); - isValid = false; - } - }); - } - return isValid; - }; - - -}; - -export {create}; - - - - diff --git a/integration-test/public/test-engine/CloverConnectorTestManager.js b/integration-test/public/test-engine/CloverConnectorTestManager.js deleted file mode 100644 index 144401cc..00000000 --- a/integration-test/public/test-engine/CloverConnectorTestManager.js +++ /dev/null @@ -1,149 +0,0 @@ -import * as actionExecutor from "./ActionExecutor"; -import * as testConnector from "./TestConnector"; -import * as iterable from "./util/Iterable"; -import {LogLevel, Logger} from "./util/Logger"; -import * as EventService from "../app/EventService" - -const create = () => { - return { - execute: function (testConfig, testCases) { - const connectorConfigs = testConfig["connectorConfigs"]; - // Create a test connector for each configuration. - const testConnectors = connectorConfigs.map((connectorConfig) => testConnector.create(connectorConfig)); - // Initialize the testConnectors, continue when they are paired and ready to process requests. - testConnectors.forEach((testConnector) => { - testConnector.initializeConnection(testConfig) - .then(() => { - const testCaseItr = iterable.makeIterator(testCases); - runTests(testConfig, testCaseItr, testConnector); - }) - .fail((code) => { - handleDeviceFailure(code, testConnector); - }); - }); - } - }; - - // Private members - - /** - * Entry point for test case execution, jQuery deferred/promise is used to enforce this serial execution. - * - * @param testConfig - * @param testCaseItr - * @param testConnector - */ - function runTests(testConfig, testCaseItr, testConnector) { - // Iterate through the test cases serially. - if (testCaseItr.hasNext()) { - const testCase = testCaseItr.next().value; - prepareAndRunTest(testCase, testConnector, testConfig) - .then(() => runTests(testConfig, testCaseItr, testConnector)) - .fail((code) => { - const message = (code == 504) ? `A timeout occurred running test case ${testCase.name}` : `An error was encountered running test case ${testCase.name}`; - Logger.log(LogLevel.ERROR, `Test Failure: ${message}.`); - EventService.get().testObservable.next({ - name: testCase.name, - message: message - }); - }); - } else { - testConnector.closeConnection(); - Logger.log(LogLevel.INFO, "All test cases have been executed."); - } - }; - - /** - * Makes sure that the Clover Connector is ready to process requests - * then runs each test. - * - * @param testCase - * @param testConnector - * @param testConfig - */ - function prepareAndRunTest(testCase, testConnector, testConfig) { - Logger.log(LogLevel.INFO, `Running test '${testCase.name}' ...`); - const testCompleteDeferred = new jQuery.Deferred(); - testConnector.initializeConnection(testConfig) - .then(() => { - runTest(testCompleteDeferred, testCase, testConnector) - }) - .fail((code) => handleDeviceFailure(code, testConnector)); - - // If the test has not been completed in testConfig["testExecutionTimeout"] millis, timeout and reject. - const testExecutionTimeout = testConfig["testExecutionTimeout"] || 15000; - setTimeout(() => testCompleteDeferred.reject(504), testExecutionTimeout); - return testCompleteDeferred.promise(); - }; - - /** - * Runs each test (all actions), testCompleteDeferred doesn't resolve until all test actions have completed. - * - * @param testCompleteDeferred - * @param testCase - * @param testConnector - */ - function runTest(testCompleteDeferred, testCase, testConnector) { - // Reset device (if necessary) - const resetDevice = lodash.get(testCase, "resetDevice", false); - if (resetDevice) { - testConnector.cloverConnector.resetDevice(); - } - const resultCache = {}; - const iterations = lodash.get(testCase, "iterations", 1); - let allTestActions = []; - // Populate test actions for each iteration. - for (let i = 0; i < iterations; i++) { - let nextIterationTestActions = testCase.testActions; - nextIterationTestActions.name += i; - allTestActions = allTestActions.concat(nextIterationTestActions); - } - const actionItr = iterable.makeIterator(allTestActions); - actionExecutor.create(resultCache, testConnector, testCase).executeActions(actionItr) - // actionResults is an array of all actions that were executed. The 'result' property on each - // action result contains the status information for that action. - .then((actionResults) => { - Logger.log(LogLevel.TRACE, actionResults); - EventService.get().testObservable.next({ - name: testCase.name, - testActions: actionResults - }); - // If there is a delay between test executions - const delayBetween = lodash.get(testCase, "delayBetweenExecutions", 0); - if (delayBetween > 0) { - setTimeout(() => completeTest(testCompleteDeferred, testCase, testConnector), delayBetween); - } else { - completeTest(testCompleteDeferred, testCase, testConnector); - completeTest(testCompleteDeferred, testCase, testConnector); - } - }); - }; - - /** - * Test clean-up utility. Resolves testCompleteDeferred when all actions have been completed. - * - * @param testCompleteDeferred - * @param testCase - * @param testConnector - */ - function completeTest(testCompleteDeferred, testCase, testConnector) { - // Dispose the connector and reinitialize if dispose flag is set - const disposeBetweenExecutions = lodash.get(testCase, "disposeBetweenExecutions", false); - if (disposeBetweenExecutions) { - testConnector.closeConnection(); - } - testCompleteDeferred.resolve(); - }; - - function handleDeviceFailure(code, testConnector) { - const message = (code == 504) ? "Timed-out initializing a connection to the device" : "An error has occurred establishing a connection to the device"; - Logger.log(LogLevel.ERROR, `Device Connection Failure: ${message}. The connection is being closed and no tests will be run on this device.`); - testConnector.closeConnection(); - if (code === 504) { - EventService.get().pairingObservable.next(message); - } - }; - -}; - -export {create} \ No newline at end of file diff --git a/integration-test/public/test-engine/ExchangeConstants.js b/integration-test/public/test-engine/ExchangeConstants.js deleted file mode 100644 index ca391ff5..00000000 --- a/integration-test/public/test-engine/ExchangeConstants.js +++ /dev/null @@ -1,210 +0,0 @@ -import * as sdk from "remote-pay-cloud-api"; -import {CardEntryMethods} from "../../../dist/com/clover/remote/client/CardEntryMethods"; - -const create = () => { - - return { - responseMethods: { - onDeviceActivityStart: "onDeviceActivityStart", - onDeviceActivityEnd: "onDeviceActivityEnd", - onDeviceError: "onDeviceError", - onPreAuthResponse: "onPreAuthResponse", - onAuthResponse: "onAuthResponse", - onTipAdjustAuthResponse: "onTipAdjustAuthResponse", - onCapturePreAuthResponse: "onCapturePreAuthResponse", - onCloseoutResponse: "onCloseoutResponse", - onSaleResponse: "onSaleResponse", - onManualRefundResponse: "onManualRefundResponse", - onRefundPaymentResponse: "onRefundPaymentResponse", - onTipAdded: "onTipAdded", - onVoidPaymentResponse: "onVoidPaymentResponse", - onVaultCardResponse: "onVaultCardResponse", - onPrintJobStatusResponse: "onPrintJobStatusResponse", - onRetrievePrintersResponse: "onRetrievePrintersResponse", - onPrintManualRefundReceipt: "onPrintManualRefundReceipt", - onPrintManualRefundDeclineReceipt: "onPrintManualRefundDeclineReceipt", - onPrintPaymentReceipt: "onPrintPaymentReceipt", - onPrintPaymentDeclineReceipt: "onPrintPaymentDeclineReceipt", - onPrintPaymentMerchantCopyReceipt: "onPrintPaymentMerchantCopyReceipt", - onPrintRefundPaymentReceipt: "onPrintRefundPaymentReceipt", - onRetrievePendingPaymentsResponse: "onRetrievePendingPaymentsResponse", - onReadCardDataResponse: "onReadCardDataResponse", - onMessageFromActivity: "onMessageFromActivity", - onCustomActivityResponse: "onCustomActivityResponse", - onRetrieveDeviceStatusResponse: "onRetrieveDeviceStatusResponse", - onResetDeviceResponse: "onResetDeviceResponse", - onRetrievePaymentResponse: "onRetrievePaymentResponse" - }, - - testActionToRemoteCall: { - "SALE": { - method: "sale", - payloadResolver: { - type: sdk.remotepay.SaleRequest - } - }, - "ACCEPT_SIGNATURE": { - method: "acceptSignature", - payloadResolver: { - type: sdk.remotepay.VerifySignatureRequest - } - }, - "REJECT_SIGNATURE": { - method: "rejectSignature", - payloadResolver: { - type: sdk.remotepay.VerifySignatureRequest - } - }, - "ACCEPT_PAYMENT": { - method: "acceptPayment", - payloadResolver: { - type: sdk.remotepay.Payment - } - }, - "REJECT_PAYMENT": { - method: "rejectPayment", - payloadResolver: [{ - type: sdk.remotepay.Payment, - key: "payment" - }, { - type: sdk.base.Challenge, - key: "challenge" - }] - }, - "AUTH": { - method: "auth", - payloadResolver: { - type: sdk.remotepay.AuthRequest - } - }, - "PREAUTH": { - method: "preAuth", - payloadResolver: { - type: sdk.remotepay.PreAuthRequest - } - }, - "CAPTURE_PREAUTH": { - method: "capturePreAuth", - payloadResolver: { - type: sdk.remotepay.CapturePreAuthRequest - } - }, - "TIP_ADJUST": { - method: "tipAdjustAuth", - payloadResolver: { - type: sdk.remotepay.TipAdjustAuthRequest - } - }, - "VOID_PAYMENT": { - method: "voidPayment", - payloadResolver: { - type: sdk.remotepay.VoidPaymentRequest - } - }, - "REFUND_PAYMENT": { - method: "refundPayment", - payloadResolver: { - type: sdk.remotepay.RefundPaymentRequest - } - }, - "MANUAL_REFUND": { - method: "manualRefund", - payloadResolver: { - type: sdk.remotepay.ManualRefundRequest - } - }, - "VAULT_CARD": { - method: "vaultCard", - payloadResolver: { - key: "cardEntryMethods" - } - }, - "CANCEL": { - method: "cancel" - }, - "CLOSEOUT": { - method: "closeout", - payloadResolver: { - type: sdk.remotepay.CloseoutRequest - } - }, - "PRINT": { - method: "print" - }, - "RETRIEVE_PRINTERS": { - method: "retrievePrinters", - payloadResolver: { - type: sdk.remotepay.RetrievePrintersRequest - } - }, - "RETRIEVE_PRINT_JOB_STATUS": { - method: "retrievePrintJobStatus", - payloadResolver: { - type: sdk.remotepay.PrintJobStatusRequest - } - }, - "OPEN_CASH_DRAWER": { - method: "openCashDrawer", - payloadResolver: { - type: sdk.remotepay.OpenCashDrawerRequest - } - }, - "PRINT_TEXT": { - method: "printText", - payloadResolver: (payload) => { - return payload["text"] || []; - } - }, - "PRINT_IMAGE_URL": { - method: "printImageFromURL" - }, - "SHOW_MESSAGE": { - method: "showMessage" - }, - "SHOW_WELCOME": { - method: "showWelcomeScreen" - }, - "SHOW_THANK_YOU": { - method: "showThankYouScreen" - }, - "SHOW_DISPLAY_ORDER": { - method: "showDisplayOrder", - payloadResolver: { - type: sdk.order.DisplayOrder - } - }, - "REMOVE_DISPLAY_ORDER": { - method: "removeDisplayOrder" - }, - "INVOKE_INPUT_OPTION": { - method: "invokeInputOption" - }, - "RESET": { - method: "resetDevice" - }, - "RETRIEVE_PENDING_PAYMENTS": { - method: "retrievePendingPayments" - }, - "READ_CARD_DATA": { - method: "readCardData", - payloadResolver: { - type: sdk.remotepay.ReadCardDataRequest - } - }, - "SEND_ACTIVITY_MESSAGE": { - method: "sendMessageToActivity" - }, - "START_ACTIVITY": { - method: "startCustomActivity" - }, - "DEVICE_STATUS": { - method: "retrieveDeviceStatus" - }, - "RETRIEVE_PAYMENT": { - method: "retrievePayment" - } - } - } -}; - -export {create} \ No newline at end of file diff --git a/integration-test/public/test-engine/TestCloverConnectorListener.js b/integration-test/public/test-engine/TestCloverConnectorListener.js deleted file mode 100644 index 0a09b088..00000000 --- a/integration-test/public/test-engine/TestCloverConnectorListener.js +++ /dev/null @@ -1,162 +0,0 @@ -import * as exchangeConstants from "./ExchangeConstants"; - -const create = (cloverConnector) => { - - var cloverConnector = cloverConnector; - var testExecutor = null; - var responseMethods = exchangeConstants.create().responseMethods; - - return { - setTestExecutor: function (testExecutorIn) { - testExecutor = testExecutorIn; - }, - - onDeviceActivityStart: function (event) { - testExecutor.processDeviceEvent(event); - testExecutor.processResult(responseMethods.onDeviceActivityStart, event); - }, - - onDeviceActivityEnd: function (event) { - testExecutor.processResult(responseMethods.onDeviceActivityEnd, event); - }, - - onDeviceError: function (event) { - testExecutor.processResult(responseMethods.onDeviceError, event); - }, - - onPreAuthResponse: function (response) { - testExecutor.processResult(responseMethods.onPreAuthResponse, response); - }, - - onAuthResponse: function (response) { - testExecutor.processResult(responseMethods.onAuthResponse, response); - }, - - onTipAdjustAuthResponse: function (response) { - testExecutor.processResult(responseMethods.onTipAdjustAuthResponse, response); - }, - - onCapturePreAuthResponse: function (response) { - testExecutor.processResult(responseMethods.onCapturePreAuthResponse, response); - }, - - onVerifySignatureRequest: function (request) { - if (testExecutor.acceptSignature()) { - cloverConnector.acceptSignature(request); - } else { - cloverConnector.rejectSignature(request); - } - }, - - onConfirmPaymentRequest: function (request) { - request.challenges.forEach((challenge) => { - if (!testExecutor.confirmPaymentChallenge(challenge.type)) { - cloverConnector.rejectPayment(request.getPayment(), challenge); - return; - } - }); - // accept by default - cloverConnector.acceptPayment(request.getPayment()); - }, - - onCloseoutResponse: function (response) { - testExecutor.processResult(responseMethods.onCloseoutResponse, response); - }, - - onSaleResponse: function (response) { - testExecutor.processResult(responseMethods.onSaleResponse, response); - }, - - onManualRefundResponse: function (response) { - testExecutor.processResult(responseMethods.onManualRefundResponse, response); - }, - - - onRefundPaymentResponse: function (response) { - testExecutor.processResult(responseMethods.onRefundPaymentResponse, response); - }, - - onTipAdded: function (message) { - testExecutor.processResult(responseMethods.onTipAdded, message); - }, - - onVoidPaymentResponse: function (response) { - testExecutor.processResult(responseMethods.onVoidPaymentResponse, response); - }, - - onDeviceDisconnected: function () { - }, - - onDeviceConnected: function () { - }, - - onDeviceReady: function (merchantInfo) { - }, - - onVaultCardResponse: function (response) { - testExecutor.processResult(responseMethods.onVaultCardResponse, response); - }, - - onPrintJobStatusResponse: function (response) { - testExecutor.processResult(responseMethods.onPrintJobStatusResponse, response); - }, - - onRetrievePrintersResponse: function (response) { - testExecutor.processResult(responseMethods.onRetrievePrintersResponse, response); - }, - - onPrintManualRefundReceipt: function (message) { - testExecutor.processResult(responseMethods.onPrintManualRefundReceipt, message); - }, - - onPrintManualRefundDeclineReceipt: function (message) { - testExecutor.processResult(responseMethods.onPrintManualRefundDeclineReceipt, message); - }, - - onPrintPaymentReceipt: function (message) { - testExecutor.processResult(responseMethods.onPrintPaymentReceipt, message); - }, - - onPrintPaymentDeclineReceipt: function (message) { - testExecutor.processResult(responseMethods.onPrintPaymentDeclineReceipt, message); - }, - - onPrintPaymentMerchantCopyReceipt: function (message) { - testExecutor.processResult(responseMethods.onPrintPaymentMerchantCopyReceipt, message); - }, - - onPrintRefundPaymentReceipt: function (message) { - testExecutor.processResult(responseMethods.onPrintRefundPaymentReceipt, message); - }, - - onRetrievePendingPaymentsResponse: function (response) { - testExecutor.processResult(responseMethods.onRetrievePendingPaymentsResponse, response); - }, - - onReadCardDataResponse: function (response) { - testExecutor.processResult(responseMethods.onReadCardDataResponse, response); - }, - - onMessageFromActivity: function (message) { - testExecutor.processResult(responseMethods.onMessageFromActivity, message); - }, - - onCustomActivityResponse: function (response) { - testExecutor.processResult(responseMethods.onCustomActivityResponse, response); - }, - - onRetrieveDeviceStatusResponse: function (response) { - testExecutor.processResult(responseMethods.onRetrieveDeviceStatusResponse, response); - }, - - onResetDeviceResponse: function (response) { - testExecutor.processResult(responseMethods.onResetDeviceResponse, response); - }, - - onRetrievePaymentResponse: function (response) { - testExecutor.processResult(responseMethods.onRetrievePaymentResponse, response); - } - } -}; - -export {create} \ No newline at end of file diff --git a/integration-test/public/test-engine/TestConnector.js b/integration-test/public/test-engine/TestConnector.js deleted file mode 100644 index 32020d20..00000000 --- a/integration-test/public/test-engine/TestConnector.js +++ /dev/null @@ -1,173 +0,0 @@ -import * as testCloverConnectorListener from "./TestCloverConnectorListener"; -import {LogLevel, Logger} from "./util/Logger"; -import {WebSocketCloudCloverDeviceConfiguration} from "../../../dist/com/clover/remote/client/device/WebSocketCloudCloverDeviceConfiguration"; -import {WebSocketPairedCloverDeviceConfiguration} from "../../../dist/com/clover/remote/client/device/WebSocketPairedCloverDeviceConfiguration"; -import {CloverConnectorFactoryBuilder} from "../../../dist/com/clover/remote/client/CloverConnectorFactoryBuilder"; -import {BrowserWebSocketImpl} from "../../../dist/com/clover/websocket/BrowserWebSocketImpl"; -import {ImageUtil} from "../../../dist/com/clover/util/ImageUtil"; -import {HttpSupport} from "../../../dist/com/clover/util/HttpSupport"; -import * as sdk from "remote-pay-cloud-api"; - -import * as EventService from "../app/EventService" - - -const create = (connectorConfig) => { - return { - initializeConnection: function (testConfig, parentComponent) { - Logger.log(LogLevel.TRACE, "Device Connection: Initializing connection to Clover Connector."); - // Resolved when the device is ready to process requests. - const connectionInitializedDeferred = new jQuery.Deferred(); - - if (cloverConnector != null) { - Logger.log(LogLevel.INFO, "A Clover Connector already exists and is ready to process requests!"); - connectionInitializedDeferred.resolve("Device Ready"); - return connectionInitializedDeferred.promise(); - } - - const baseConfiguration = { - "applicationId": connectorConfig.applicationId, - "posName": "Cloud Starter POS", - "serialNumber": "Register_1", - "webSocketFactoryFunction": BrowserWebSocketImpl.createInstance, - "imageUtil": new ImageUtil() - }; - let cloverDeviceConnectionConfiguration = null; - const useCloudConfiguration = connectorConfig.type === "cloud"; - if (!useCloudConfiguration) { - Logger.log(LogLevel.TRACE, `Device Connection: Connecting via the Network.`); - const endpoint = `${connectorConfig.wsScheme}://${connectorConfig.ipAddress}:${connectorConfig.wsPort}/remote_pay`; - const networkConfiguration = { - "endpoint": endpoint - } - const authToken = getAuthToken(); - if (authToken && authToken.length > 0) { - Logger.log(LogLevel.TRACE, `Device Connection: Using cached auth token ${authToken}`); - networkConfiguration["authToken"] = authToken; - } - cloverDeviceConnectionConfiguration = getDeviceConfigurationForNetwork(Object.assign({}, baseConfiguration, networkConfiguration), parentComponent); - } else { - Logger.log(LogLevel.TRACE, `Device Connection: Connecting via the Cloud.`); - cloverDeviceConnectionConfiguration = getDeviceConfigurationForCloud(Object.assign({}, baseConfiguration, { - "accessToken": connectorConfig.accessToken, - "cloverServer": connectorConfig.cloverServer, - "httpSupport": new HttpSupport(XMLHttpRequest), - "merchantId": connectorConfig.merchantId, - "deviceId": connectorConfig.deviceId, - "friendlyId": "Automated Test" - })); - } - let builderConfiguration = {}; - builderConfiguration[CloverConnectorFactoryBuilder.FACTORY_VERSION] = CloverConnectorFactoryBuilder.VERSION_12; - let cloverConnectorFactory = CloverConnectorFactoryBuilder.createICloverConnectorFactory(builderConfiguration); - cloverConnector = cloverConnectorFactory.createICloverConnector(cloverDeviceConnectionConfiguration); - const startupListener = buildCloverConnectionStartUpListener(cloverConnector, connectionInitializedDeferred); - cloverConnector.addCloverConnectorListener(startupListener); - cloverConnector.initializeConnection(); - - const connectorReadyTimeout = testConfig["connectorReadyTimeout"] || 15000; - // If the connection is not established in testConfig["connectorReadyTimeout"] millis, timeout and reject. - setTimeout(() => connectionInitializedDeferred.reject(504), connectorReadyTimeout); - return connectionInitializedDeferred.promise(); - }, - - closeConnection: function () { - if (cloverConnector != null) { - Logger.log(LogLevel.INFO, "Closing Clover Connector."); - if (listener != null) { - cloverConnector.removeCloverConnectorListener(listener); - listener = null; - } - cloverConnector.dispose(); - cloverConnector = null; - } - }, - - getCloverConnector: function () { - return cloverConnector; - }, - - getListener: function () { - return listener; - } - } - - // Private Members - - var cloverConnector = null; - var listener = null; - var authToken = null; - - /** - * The definition of the listener. It extends the functionality to the "interface" ICloverConnectorListener. - * This implementation has a reference to the ICloverConnector passed in so that it can use it during the - * program lifecycle. - * - * @param cloverConnector - * @param connectionInitializedDeferred - jQuery deferred, resolved when the device is ready. - * - * @constructor - */ - function buildCloverConnectionStartUpListener(cloverConnector, connectionInitializedDeferred) { - return Object.assign({}, sdk.remotepay.ICloverConnectorListener.prototype, { - onDeviceReady: function (merchantInfo) { - Logger.log(LogLevel.INFO, {message: "Device Ready to process requests!", merchantInfo: merchantInfo}); - cloverConnector.removeCloverConnectorListener(this); - listener = Object.assign({}, sdk.remotepay.ICloverConnectorListener.prototype, testCloverConnectorListener.create(cloverConnector)); - cloverConnector.addCloverConnectorListener(listener); - connectionInitializedDeferred.resolve("Device Ready"); - } - }); - }; - - function getDeviceConfigurationForCloud(connectionConfiguration) { - return new WebSocketCloudCloverDeviceConfiguration( - connectionConfiguration.applicationId, - connectionConfiguration.webSocketFactoryFunction, - connectionConfiguration.imageUtil, - connectionConfiguration.cloverServer, - connectionConfiguration.accessToken, - connectionConfiguration.httpSupport, - connectionConfiguration.merchantId, - connectionConfiguration.deviceId, - connectionConfiguration.friendlyId, - connectionConfiguration.forceReconnect); - }; - - function getDeviceConfigurationForNetwork(connectionConfiguration) { - let deviceConfiguration = new WebSocketPairedCloverDeviceConfiguration( - connectionConfiguration.endpoint, - connectionConfiguration.applicationId, - connectionConfiguration.posName, - connectionConfiguration.serialNumber, - connectionConfiguration.authToken, - connectionConfiguration.webSocketFactoryFunction, - connectionConfiguration.imageUtil); - // Append the pairing code handlers to the device configuration. - deviceConfiguration = Object.assign(deviceConfiguration, { - onPairingCode: function (pairingCode) { - let pairingCodeMessage = `Please enter pairing code ${pairingCode} on the device`; - Logger.log(LogLevel.INFO, ` > ${pairingCodeMessage}`); - EventService.get().pairingObservable.next(pairingCodeMessage); - - }, - onPairingSuccess: function (authToken) { - Logger.log(LogLevel.INFO, ` > Got Pairing Auth Token: ${authToken}`); - EventService.get().pairingObservable.next(undefined); - - setAuthToken(authToken); - } - }); - return deviceConfiguration; - }; - - function getAuthToken() { - return authToken; - }; - - function setAuthToken(authTokenIn) { - authToken = authTokenIn; - }; - -}; - -export {create} diff --git a/integration-test/public/test-engine/TestExecutor.js b/integration-test/public/test-engine/TestExecutor.js deleted file mode 100644 index f97705a5..00000000 --- a/integration-test/public/test-engine/TestExecutor.js +++ /dev/null @@ -1,375 +0,0 @@ -import {JSONToCustomObject} from "../../../dist/com/clover/json/JSONToCustomObject"; -import * as exchangeConstants from "./ExchangeConstants"; -import {LogLevel, Logger} from "./util/Logger"; -import * as testUtils from "./util/TestUtils"; -import * as ActionStatus from "./ActionStatus"; - -const create = (action, actionCompleteDeferred, testConnector, storedValues) => { - - let resultDeferred = null; - let cloverConnector = testConnector.getCloverConnector(); - let delay = lodash.get(action, ["parameters", "delay"], 0); - let responseTimeout = lodash.get(action, ["parameters", "responseTimeout"], 30000); - let waitForResponse = lodash.get(action, ["parameters", "waitForResponse"], true); - if (action.response != null) { - waitForResponse = true; - } - - return { - executeAction: function () { - const executeActionDeferred = new jQuery.Deferred(); - - // Record request time - if (!action.result) { - action.result = {}; - } - - action.result.requestTime = new Date(); - - // Wait for a delay, if any - if (delay > 0) { - setTimeout(() => { - executeActionInternal() - .then((action) => { - executeActionDeferred.resolve(action); - }); - }, delay); - } else { - executeActionInternal() - .then((action) => { - executeActionDeferred.resolve(action); - }); - } - return executeActionDeferred; - }, - - /** - * Processes the response from the device. - * - * @param remoteMethod - * @param remoteResponse - */ - processResult: function (remoteMethod, remoteResponse) { - const expectedActionResponse = lodash.get(action, ["assert", "response"]); - if (expectedActionResponse && expectedActionResponse.method === remoteMethod) { - Logger.log(LogLevel.info, `Processing response ${remoteMethod}`); - if (waitForResponse) { - action.result.responseTime = new Date(); - } - - const expectSuccess = lodash.get(expectedActionResponse, ["payload", "success"]); - let responseError = false; - if (expectSuccess) { - responseError = lodash.get(remoteResponse, "result", "") === "FAIL" || !lodash.get(remoteResponse, "success", true); - if (responseError) { - action.result.status = ActionStatus.get().fail; - action.result.message = remoteResponse["message"] || remoteResponse["reason"] || `A failure occurred processing ${action.name}.`; - } - } - - if (!responseError) { - try { - processResultInternal(remoteResponse, expectedActionResponse.payload); - } catch (e) { - handleActionFailure(`An error has occurred processing the result. Details: ${e.message}`, true); - } - - const store = lodash.get(expectedActionResponse, "store"); - if (store) { - try { - for (let key in store) { - storeResult(remoteResponse[key], store[key]); - } - } catch (e) { - Logger.log(LogLevel.ERROR, "Error storing results"); - } - } - - if (action.result.status !== ActionStatus.get().fail) { - action.result.status = ActionStatus.get().pass; - } - } - - // Resolve the responses deferred. - if (resultDeferred) { - const message = action.result.message || "n/a"; - Logger.log(LogLevel.Info, `Action status ${action.result.status} and ${message}.`); - resultDeferred.resolve(); - } - } - }, - - /** - * Processes device events, executing actions for any input options specified in the test case. - * - * @param event - */ - processDeviceEvent: function (event) { - const testDefInputOptions = lodash.get(action, ["context", "inputOptions"], null); - if (testDefInputOptions) { - let testDefInputOption = lodash.find(testDefInputOptions, ['on', event.getEventState()]); - if (testDefInputOption) { - testDefInputOption.description = testDefInputOption.description || testDefInputOption.select; - const eventOptions = event.getInputOptions(); - if (eventOptions) { - let inputOption = null; - // Find the matching input option from the device event. - eventOptions.some((eventOption) => { - if (testDefInputOption.select === eventOption.keyPress) { - inputOption = eventOption; - return true; - } else if (testDefInputOption.method) { - inputOption = null; - cloverConnector[testDefInputOption.method](eventOption); - return true; - } else { - const pattern = new RegExp(testDefInputOption.description); - if (pattern.exec(eventOption.description)) { - inputOption = eventOption; - return true; - } - } - }); - if (inputOption) { - cloverConnector.invokeInputOption(inputOption); - } else { - Logger.log(LogLevel.info, `No matching input option found for ${JSON.stringify(testDefInputOption)}`); - } - } - } - } - }, - - confirmPaymentChallenge: function (name) { - const deviceRequests = lodash.get(action, ["context", "deviceRequests"]); - if (deviceRequests) { - const confirmMappings = deviceRequests.paymentConfirmation; - if (confirmMappings != null && "REJECT" === confirmMappings[name]) { - return false; - } - } - // Accept by default - return true; - }, - - acceptSignature: function () { - const deviceRequests = lodash.get(action, ["context", "deviceRequests"]); - if (deviceRequests && "REJECT" === deviceRequests.signatureVerification) { - return false; - } - // Accept by default - return true; - } - }; - - /** - * Executes the action. - */ - function executeActionInternal() { - const executeActionDeferred = new jQuery.Deferred(); - resultDeferred = new jQuery.Deferred(); - if (executeRequest()) { - if (waitForResponse) { - resultDeferred.promise().then(() => { - executeActionDeferred.resolve(); - }); - } else { - executeActionDeferred.resolve(); - } - } else { - executeActionDeferred.resolve(); - } - // If a responseTimeout has been set for the action and a response has not been received within the timeout - // indicate a failure on the action's result. - if (responseTimeout && responseTimeout > 0) { - setTimeout(() => { - if (resultDeferred.state() === "pending") { - handleActionFailure(`Timeout: A response was not received within ${responseTimeout} milli(s).`); - executeActionDeferred.resolve(); - } - }, responseTimeout); - } - return executeActionDeferred.promise(); - } - - /** - * Executes a request to the Clover Connector for the specified action. - * - * @param action - * @returns {boolean} - */ - function executeRequest() { - const requestFromActionDefinition = lodash.get(action, ["context", "request"]); - const methodFromActionDefinition = lodash.get(requestFromActionDefinition, "method"); - // See the resolveRequestParameters function for an explanation of the purpose of methodMapping. - const methodMapping = exchangeConstants.create().testActionToRemoteCall[methodFromActionDefinition]; - if (methodMapping) { - const payload = resolveRequestParameters(requestFromActionDefinition, methodMapping); - const methodToCall = lodash.get(methodMapping, "method"); - Logger.log(LogLevel.INFO, `Executing remote request, method: ${methodFromActionDefinition}.`); - if (!methodToCall) { - const message = `Test Failure: Unsupported method type: ${method}`; - handleActionFailure(message, true); - return false; - } - cloverConnector[methodToCall](payload); - return true; - } else { - const message = `Test Failure: A mapping for method ${methodFromActionDefinition} was not found in ExchangeConstants.requestDefToMethod.`; - handleActionFailure(message, true); - return false; - } - }; - - /** - * The request payload in the test definition is defined as JSON. The SDK works with JavaScript objects - * from remote-pay-cloud-api that have meta-data. The correct types need to be created from the test case JSON. - * This method uses a simple mapping (ExchangeConstants.testActionToRemoteCall) to properly build the remote-pay-cloud-api - * JavaScript Objects. - */ - function resolveRequestParameters(requestFromActionDefinition, methodMapping) { - const request = lodash.get(action, ["context", "request"]); - const payloadResolver = lodash.get(methodMapping, "payloadResolver"); - let payload = lodash.get(request, "payload", {}); - if (payloadResolver) { - if (lodash.isArray(payloadResolver)) { - payload = payloadResolver.map(() => resolveRequestParameter(requestFromActionDefinition, payloadResolver)) - } else if (lodash.isFunction(payloadResolver)) { - payload = payloadResolver(payload); - } else { - payload = resolveRequestParameter(requestFromActionDefinition, payloadResolver); - } - } - // No payloadResolver, return parameters as they exist in the test cases request. - return payload; - }; - - /** - * See resolveRequestParameters - * - * @param requestFromActionDefinition - * @param payloadResolver - */ - function resolveRequestParameter(requestFromActionDefinition, payloadResolver) { - const key = lodash.get(payloadResolver, "key"); - const type = lodash.get(payloadResolver, "type"); - let payload = resolveStoredValues(lodash.get(requestFromActionDefinition, key || "payload")); - if (type) { - // payloadResolver.type is a reference to the constructor of the SDK class type. - const sdkClassConstructorRef = lodash.bind(payloadResolver.type, this); - // Create a new instance of the sdk class. - const sdkClass = new sdkClassConstructorRef; - // Transfers values from payload into the SDK class. - new JSONToCustomObject().transfertoObject(payload, sdkClass, true); - payload = sdkClass; - } - return payload; - }; - - function resolveStoredValues(payload) { - // If payload is null or undefined so be it. Passing an empty object to the clover connector - // when it is expecting null/undefined will cause problems. - const resolved = payload ? {} : null; - if (payload) { - for (let key in payload) { - resolved[key] = resolveStoredValue(payload[key]); - } - } - return resolved; - }; - - function resolveStoredValue(element) { - if (lodash.isString(element)) { - if (lodash.startsWith(element, "$:")) { - // Value is populated from a stored variable - const storedValueKey = element.substring(2); - const storedValue = storedValues[storedValueKey]; - if (!storedValue) { - const message = `A stored value for ${storedValueKey} was not found.`; - handleActionFailure(message, true); - } - return storedValue || ""; - } else if (lodash.startsWith(element, "#:")) { - // Value is populated from a function - const storedValueFunction = element.substring(2); - const testUtilsIn = testUtils.create(); - if (storedValueFunction === "GEN_EXT_ID") { - return testUtilsIn.getNextId(); - } - } - // Just use the existing value - return element; - } else if (lodash.isObject(element)) { - return resolveStoredValue(element); - } else if (lodash.isArray(element)) { - return element.map((arrElement) => resolveStoredValue(arrElement)); - } else { - return element; - } - }; - - /** - * Validate the actual response against the expected response. - * - * @param remoteResponse - * @param expectedResponse - */ - function processResultInternal(remoteResponse, expectedResponse) { - for (let key in expectedResponse) { - let expectedElement = expectedResponse[key]; - const remoteElement = remoteResponse[key]; - if (!lodash.isObject(expectedElement)) { - if (expectedElement !== "*") { - // expected is not null or a wildcard - if (lodash.startsWith(expectedElement, "$:")) { - // Target is actually a stored variable - const storedValue = storedValues[expectedElement.substring(2)]; - if (!storedValue) { - handleActionFailure(`${key}: Cannot resolve expected value = ${expectedElement}; Actual value = ${resultElement}`); - continue; - } else if (lodash.isObject(storedValue) || lodash.isArray(storedValue)) { - handleActionFailure(`${key}: Cannot resolve expected value [not a primitive] = ${expectedElement}; Actual value = ${remoteElement}`); - continue; - } - expectedElement = storedValue; - } - // should match - if (expectedElement !== remoteElement) { - handleActionFailure(`${key}: Expected value = ${expectedElement}; Actual value = ${remoteElement}`); - } - } else if (!remoteElement) { - // Result is null, and expected is not null - handleActionFailure(`${key}: Expected value = ${expectedElement}; Actual value = null`); - } - } else { - processResultInternal(remoteElement, expectedElement); - } - } - }; - - function storeResult(valueFromResponse, templateValueFromTestCase) { - if (!valueFromResponse) { - Logger.log(LogLevel.ERROR, `No result for storedValue key: ${templateValueFromTestCase}`); - return; - } - if (!lodash.isObject(templateValueFromTestCase) && !lodash.isArray(templateValueFromTestCase)) { - storedValues[templateValueFromTestCase] = valueFromResponse; - } else if (lodash.isObject(templateValueFromTestCase)) { - if (!lodash.isObject(valueFromResponse)) { - Logger.log(LogLevel.ERROR, `"Invalid result [Object Expected] for storedValue key: ${templateValueFromTestCase}`); - return; - } - for (let key in templateValueFromTestCase) { - storeResult(valueFromResponse[key], templateValueFromTestCase[key]); - } - } - }; - - function handleActionFailure(message, log = false) { - testUtils.create().handleActionFailure(action, message, log); - resultDeferred.resolve(); - }; - -}; - -export {create} \ No newline at end of file diff --git a/integration-test/public/test-engine/util/Iterable.js b/integration-test/public/test-engine/util/Iterable.js deleted file mode 100644 index ebc1ee24..00000000 --- a/integration-test/public/test-engine/util/Iterable.js +++ /dev/null @@ -1,22 +0,0 @@ -// create() returns the public interface. -const makeIterator = (array) => { - var nextIndex = 0; - - return { - next: function() { - return nextIndex < array.length ? - {value: array[nextIndex++], done: false} : - {done: true}; - }, - - hasNext: function() { - if (!array || array.length === 0) { - return false; - } - return nextIndex < array.length; - } - }; - -}; - -export {makeIterator} \ No newline at end of file diff --git a/integration-test/public/test-engine/util/Logger.js b/integration-test/public/test-engine/util/Logger.js deleted file mode 100644 index 75a40e28..00000000 --- a/integration-test/public/test-engine/util/Logger.js +++ /dev/null @@ -1,20 +0,0 @@ -var logLevel = 1; - -export const LogLevel = { - TRACE: 1, - DEBUG: 2, - INFO: 3, - WARN: 4, - ERROR: 5 -}; - -export const Logger = { - log: function(level = 2, toLog) { - if (level >= logLevel) { - console.log(toLog); - if (level === 5) { - console.trace(); - } - } - } -}; \ No newline at end of file diff --git a/integration-test/public/test-engine/util/TestUtils.js b/integration-test/public/test-engine/util/TestUtils.js deleted file mode 100644 index 51c9f949..00000000 --- a/integration-test/public/test-engine/util/TestUtils.js +++ /dev/null @@ -1,32 +0,0 @@ -import {LogLevel, Logger} from "./Logger"; -import * as ActionStatus from "../ActionStatus"; -const create = () => { - - var vals = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"]; - - return { - getNextId: function () { - const id = []; - for (let i = 0; i < 13; i++) { - let idx = Math.floor(Math.random() * vals.length); - id.push(vals[idx]); - } - return id.join(""); - }, - - handleActionFailure: function (action, message, log = false) { - if (action) { - if (!lodash.has(action, "result")) { - lodash.set(action, "result", {}); - } - action.result.status = ActionStatus.get().fail; - action.result.message = message; - } - if (log) { - Logger.log(LogLevel.ERROR, message); - } - } - } -}; - -export {create} diff --git a/integration-test/public/testConfig.json b/integration-test/public/testConfig.json deleted file mode 100644 index 8ef3ed5c..00000000 --- a/integration-test/public/testConfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "definitionEndpoint": "http://localhost:3001/test-definitions", - "connectorReadyTimeout": 15000, - "testExecutionTimeout": 300000, - "connectorConfigs": [ - { - "applicationId": "", - "accessToken": "ccac08fe-7897-55dd-808f-d2468574db0f", - "cloverServer": "https://dev1.dev.clover.com", - "merchantId": "59RECDKBW11G6", - "deviceId": "c368b68c4175f5971af6d0359054d109", - "friendlyId": "Cloud Starter", - "type": "cloud" - } - ] -} - diff --git a/integration-test/scss/test-automater.scss b/integration-test/scss/test-automater.scss deleted file mode 100644 index fb9ef51e..00000000 --- a/integration-test/scss/test-automater.scss +++ /dev/null @@ -1,121 +0,0 @@ -@import "node_modules/react-select2-wrapper/css/select2"; -@import "node_modules/ag-grid/dist/styles/ag-grid"; -@import "node_modules/ag-grid/dist/styles/theme-fresh"; -@import "node_modules/bootstrap-sass/assets/stylesheets/_bootstrap.scss"; - -.normal_button { - border-radius: 3px; - border: none; - font-size: 16px; -} - -.btn-margin{ - margin-left: 10px; -} - -.center{ - vertical-align: middle; - justify-content: center; - align-items: center; -} - -.column_plain{ - display: flex; - flex-direction: column; - overflow: auto; -} - -.pairing_code{ - padding: 10px 10px 20px 10px; - text-align: center; -} - -.pairing_code > span { - font-weight: bold; -} - -.popup{ - background: white; - box-shadow: 0 0 4px #000000; - position: absolute; - top: 30%; - margin-left: auto; - margin-right: auto; - left: 0; - right: 0; - z-index: 2; -} - -.close_popup{ - padding-top: 0px; - text-align: right; - font-size: 14px !important; -} - -.popup_container{ - display: flex; - width: 380px; - flex-direction: column; - padding: 10px; - word-wrap: break-word; -} - -.popup_opaque{ - position: absolute; - background-color: #e6e6e6; - opacity: 0.65; - width: 100vw; - height: 100vh; - top: 0; - left: 0; - z-index: 1; -} - -.popup_full_opaque{ - position: absolute; - background-color: #e6e6e6; - width: 100vw; - height: 100vh; - top: 0; - left: 0; - z-index: 1; -} - -.popup_full_opaque_white{ - position: absolute; - background-color: white; - width: 100vw; - height: 100vh; - top: 0; - left: 0; - z-index: 1; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; -} - -.button_white{ - background: white; - border: 1px solid black; -} - -.button_green { - background: #547554; - color: white; -} - -.button_red { - background: #ffb3b3; - color: black; -} - -.normal_button:disabled{ - opacity: 0.3; - filter: alpha(opacity=30); - color: grey; -} - -.clover_logo{ - width: 500px; -} \ No newline at end of file diff --git a/integration-test/server.js b/integration-test/server.js deleted file mode 100644 index 77ed79f7..00000000 --- a/integration-test/server.js +++ /dev/null @@ -1,16 +0,0 @@ -const path = require("path"); -const express = require("express"); -const app = express(); - -const contentDir = path.join(__dirname, "public"); -app.use(express.static(contentDir)); - -app.get("/*", function(req, res) { - res.sendFile(path.join(__dirname, 'public', 'index.html')) -}); - -app.set("port", (process.env.PORT || 3000)); - -app.listen(app.get("port"), function () { - console.log("Pidgin Automation Server started: http://localhost:" + app.get("port") + "/"); -}); \ No newline at end of file diff --git a/integration-test/webpack.config.js b/integration-test/webpack.config.js deleted file mode 100644 index 105df641..00000000 --- a/integration-test/webpack.config.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -const webpack = require('webpack'); -const path = require('path'); - -var APP_DIR = path.resolve(__dirname, 'public'); - - -module.exports = { - entry: { - index_js: APP_DIR + "/index.js" - }, - resolve: { - extensions: [".js"], - alias: { - 'remotepay': path.resolve(path.join(__dirname, 'node_modules', 'remote-pay-cloud-api')), - 'remote-pay-cloud-api': path.resolve(path.join(__dirname, 'node_modules', 'remote-pay-cloud-api')), - 'sdk': path.resolve(path.join(__dirname, 'node_modules', 'remote-pay-cloud-api')), - 'clover': path.resolve(path.join(__dirname, 'node_modules', 'remote-pay-cloud-api')) - } - }, - output: { - path: path.resolve(__dirname, 'public/built'), - filename: 'bundle.js', - libraryTarget: "var", - library: "pidgin" - }, - module: { - loaders: [ - { - test: path.join(__dirname, 'public'), - include: APP_DIR, - loader: "babel-loader", - query: { - presets: [ - 'env', - 'react' - ] - } - } - - ] - }, - plugins: [ - new webpack.ProvidePlugin({ - jQuery: "jquery", - lodash: "lodash" - }) - ], - devtool: 'eval-source-map' -}; \ No newline at end of file diff --git a/package.json b/package.json index 541dedd6..3f679a1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "remote-pay-cloud", - "version": "1.4.3-alpha.8", + "version": "1.4.3", "description": "Access Clover devices through the cloud.", "keywords": [ "clover", @@ -27,35 +27,33 @@ "scripts": { "build": "gulp", "updateVersion": "scripts/postversion.sh \"$npm_package_version\"", - "build-pidgin": "webpack --config ./pidgin/webpack.config.js", - "start-pidgin": "npm run build-pidgin && node ./pidgin/server.js", "dev-publish": "npm version prerelease --no-git-tag-version && npm publish --tag dev", "test": "mocha test/unit-tests --exit" }, "dependencies": { "eventemitter3": "1.1.1", - "remote-pay-cloud-api": "dev", + "remote-pay-cloud-api": "1.4.2", "typescript": "2.4.1" }, "devDependencies": { "@types/node": "7.0.5", + "chai": "4.1.2", "del": "2.2.2", "express": "^4.16.2", - "gulp": "3.9.1", + "gulp": "^3.9.1", "gulp-sourcemaps": "2.4.1", "gulp-typedoc": "^2.0.2", "gulp-typescript": "3.2.2", - "chai": "4.1.2", - "rxjs": "^5.5.2", - "mocha": "4.0.1", - "typedoc": "0.9.0", "jquery": "^3.2.1", + "jsdoc": "3.4.3", "lodash": "^4.17.4", - "ts-loader": "3.0.5", "merge2": "^1.2.0", - "jsdoc": "3.4.3", + "mocha": "4.0.1", "path": "0.12.7", - "webpack-stream": "4.0.0", - "webpack": "3.8.1" + "rxjs": "^5.5.2", + "ts-loader": "3.0.5", + "typedoc": "0.9.0", + "webpack": "3.8.1", + "webpack-stream": "4.0.0" } } diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 71ad1893..00000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include 'integration-test' \ No newline at end of file diff --git a/src/com/clover/Version.ts b/src/com/clover/Version.ts index 1cd0208e..0969145f 100644 --- a/src/com/clover/Version.ts +++ b/src/com/clover/Version.ts @@ -4,9 +4,9 @@ export class Version { /** - * @type {string} - The current verion of this library + * @type {string} - The current version of this library */ - public static CLOVER_CLOUD_SDK_VERSION = "1.4.2"; + public static CLOVER_CLOUD_SDK_VERSION = "1.4.3"; /** * @type {string} - The current SDK name. diff --git a/src/com/clover/remote/client/CardEntryMethods.ts b/src/com/clover/remote/client/CardEntryMethods.ts index 8d989f02..42e5d4cc 100644 --- a/src/com/clover/remote/client/CardEntryMethods.ts +++ b/src/com/clover/remote/client/CardEntryMethods.ts @@ -5,7 +5,7 @@ export class CardEntryMethods { private static KIOSK_CARD_ENTRY_METHODS: number = 1 << 15; - public static CARD_ENTRY_METHOD_MAG_STRIPE: number = 0b0001 | 0b000100000000 | CardEntryMethods.KIOSK_CARD_ENTRY_METHODS; // 33026 + public static CARD_ENTRY_METHOD_MAG_STRIPE: number = 0b0001 | 0b000100000000 | CardEntryMethods.KIOSK_CARD_ENTRY_METHODS; // 33025 public static CARD_ENTRY_METHOD_ICC_CONTACT: number = 0b0010 | 0b001000000000 | CardEntryMethods.KIOSK_CARD_ENTRY_METHODS; // 33282 public static CARD_ENTRY_METHOD_NFC_CONTACTLESS: number = 0b0100 | 0b010000000000 | CardEntryMethods.KIOSK_CARD_ENTRY_METHODS; // 33796 public static CARD_ENTRY_METHOD_MANUAL: number = 0b1000 | 0b100000000000 | CardEntryMethods.KIOSK_CARD_ENTRY_METHODS; // 34824