mirror of
https://github.com/sasjs/adapter.git
synced 2026-01-15 16:10:06 +00:00
fix(csv-convert): fixed data convertion
This commit is contained in:
@@ -5,8 +5,8 @@
|
|||||||
"build": "rimraf build && rimraf node && mkdir node && cp -r src/* node && webpack && rimraf build/src && rimraf node",
|
"build": "rimraf build && rimraf node && mkdir node && cp -r src/* node && webpack && rimraf build/src && rimraf node",
|
||||||
"package:lib": "npm run build && cp ./package.json build && cd build && npm version \"5.0.0\" && npm pack",
|
"package:lib": "npm run build && cp ./package.json build && cd build && npm version \"5.0.0\" && npm pack",
|
||||||
"publish:lib": "npm run build && cd build && npm publish",
|
"publish:lib": "npm run build && cd build && npm publish",
|
||||||
"lint:fix": "npx prettier --write 'src/**/*.{ts,tsx,js,jsx,html,css,sass,less,json,yml,md,graphql}'",
|
"lint:fix": "npx prettier --write 'src/**/*.{ts,tsx,js,jsx,html,css,sass,less,json,yml,md,graphql}' && npx prettier --write 'sasjs-tests/src/**/*.{ts,tsx,js,jsx,html,css,sass,less,json,yml,md,graphql}'",
|
||||||
"lint": "npx prettier --check 'src/**/*.{ts,tsx,js,jsx,html,css,sass,less,json,yml,md,graphql}'",
|
"lint": "npx prettier --check 'src/**/*.{ts,tsx,js,jsx,html,css,sass,less,json,yml,md,graphql}' && npx prettier --check 'sasjs-tests/src/**/*.{ts,tsx,js,jsx,html,css,sass,less,json,yml,md,graphql}'",
|
||||||
"test": "jest --silent --coverage",
|
"test": "jest --silent --coverage",
|
||||||
"prepublishOnly": "cp -r ./build/* . && rm -rf ./build",
|
"prepublishOnly": "cp -r ./build/* . && rm -rf ./build",
|
||||||
"postpublish": "git clean -fd",
|
"postpublish": "git clean -fd",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"trailingComma": "none",
|
"trailingComma": "none",
|
||||||
"tabWidth": 2,
|
"tabWidth": 2,
|
||||||
"semi": true,
|
"semi": false,
|
||||||
"singleQuote": false
|
"singleQuote": true
|
||||||
}
|
}
|
||||||
|
|||||||
2
sasjs-tests/package-lock.json
generated
2
sasjs-tests/package-lock.json
generated
@@ -2005,7 +2005,7 @@
|
|||||||
},
|
},
|
||||||
"@sasjs/adapter": {
|
"@sasjs/adapter": {
|
||||||
"version": "file:../build/sasjs-adapter-5.0.0.tgz",
|
"version": "file:../build/sasjs-adapter-5.0.0.tgz",
|
||||||
"integrity": "sha512-M7R1F4gBHZRjDD/lI3v3v9jnX7Lvhp3W1xD/0imKaLt7LZfth1VSLf4umwwajmlRUlktJ4ht6dugXqZLOh+4wQ==",
|
"integrity": "sha512-DxoQbdJqzqOTIuT7qwSfAbmNTWdpOx5zGkiMuZBSwoi9lSsRNoARiWnJq5Vl6h4RXJlc/FVdBFt35RZm4Mc0ZQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@sasjs/utils": "^2.10.2",
|
"@sasjs/utils": "^2.10.2",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import React, { ReactElement, useState, useContext, useEffect } from "react";
|
import React, { ReactElement, useState, useContext, useEffect } from 'react'
|
||||||
import { TestSuiteRunner, TestSuite, AppContext } from "@sasjs/test-framework";
|
import { TestSuiteRunner, TestSuite, AppContext } from '@sasjs/test-framework'
|
||||||
import { basicTests } from "./testSuites/Basic";
|
import { basicTests } from './testSuites/Basic'
|
||||||
import { sendArrTests, sendObjTests } from "./testSuites/RequestData";
|
import { sendArrTests, sendObjTests } from './testSuites/RequestData'
|
||||||
import { specialCaseTests } from "./testSuites/SpecialCases";
|
import { specialCaseTests } from './testSuites/SpecialCases'
|
||||||
import { sasjsRequestTests } from "./testSuites/SasjsRequests";
|
import { sasjsRequestTests } from './testSuites/SasjsRequests'
|
||||||
import "@sasjs/test-framework/dist/index.css";
|
import '@sasjs/test-framework/dist/index.css'
|
||||||
import { computeTests } from "./testSuites/Compute";
|
import { computeTests } from './testSuites/Compute'
|
||||||
|
|
||||||
const App = (): ReactElement<{}> => {
|
const App = (): ReactElement<{}> => {
|
||||||
const { adapter, config } = useContext(AppContext);
|
const { adapter, config } = useContext(AppContext)
|
||||||
const [testSuites, setTestSuites] = useState<TestSuite[]>([]);
|
const [testSuites, setTestSuites] = useState<TestSuite[]>([])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (adapter) {
|
if (adapter) {
|
||||||
@@ -20,15 +20,15 @@ const App = (): ReactElement<{}> => {
|
|||||||
specialCaseTests(adapter),
|
specialCaseTests(adapter),
|
||||||
sasjsRequestTests(adapter),
|
sasjsRequestTests(adapter),
|
||||||
computeTests(adapter)
|
computeTests(adapter)
|
||||||
]);
|
])
|
||||||
}
|
}
|
||||||
}, [adapter, config]);
|
}, [adapter, config])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="app">
|
<div className="app">
|
||||||
{adapter && testSuites && <TestSuiteRunner testSuites={testSuites} />}
|
{adapter && testSuites && <TestSuiteRunner testSuites={testSuites} />}
|
||||||
</div>
|
</div>
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
export default App;
|
export default App
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
import React, { ReactElement, useState, useCallback, useContext } from "react";
|
import React, { ReactElement, useState, useCallback, useContext } from 'react'
|
||||||
import "./Login.scss";
|
import './Login.scss'
|
||||||
import { AppContext } from "@sasjs/test-framework";
|
import { AppContext } from '@sasjs/test-framework'
|
||||||
import { Redirect } from "react-router-dom";
|
import { Redirect } from 'react-router-dom'
|
||||||
|
|
||||||
const Login = (): ReactElement<{}> => {
|
const Login = (): ReactElement<{}> => {
|
||||||
const [username, setUsername] = useState("");
|
const [username, setUsername] = useState('')
|
||||||
const [password, setPassword] = useState("");
|
const [password, setPassword] = useState('')
|
||||||
const appContext = useContext(AppContext);
|
const appContext = useContext(AppContext)
|
||||||
|
|
||||||
const handleSubmit = useCallback(
|
const handleSubmit = useCallback(
|
||||||
(e) => {
|
(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault()
|
||||||
appContext.adapter.logIn(username, password).then((res) => {
|
appContext.adapter.logIn(username, password).then((res) => {
|
||||||
appContext.setIsLoggedIn(res.isLoggedIn);
|
appContext.setIsLoggedIn(res.isLoggedIn)
|
||||||
});
|
})
|
||||||
},
|
},
|
||||||
[username, password, appContext]
|
[username, password, appContext]
|
||||||
);
|
)
|
||||||
|
|
||||||
return !appContext.isLoggedIn ? (
|
return !appContext.isLoggedIn ? (
|
||||||
<div className="login-container">
|
<div className="login-container">
|
||||||
@@ -48,7 +48,7 @@ const Login = (): ReactElement<{}> => {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<Redirect to="/" />
|
<Redirect to="/" />
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
export default Login;
|
export default Login
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
import React, { ReactElement, useContext, FunctionComponent } from "react";
|
import React, { ReactElement, useContext, FunctionComponent } from 'react'
|
||||||
import { Redirect, Route } from "react-router-dom";
|
import { Redirect, Route } from 'react-router-dom'
|
||||||
import { AppContext } from "@sasjs/test-framework";
|
import { AppContext } from '@sasjs/test-framework'
|
||||||
|
|
||||||
interface PrivateRouteProps {
|
interface PrivateRouteProps {
|
||||||
component: FunctionComponent;
|
component: FunctionComponent
|
||||||
exact?: boolean;
|
exact?: boolean
|
||||||
path: string;
|
path: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const PrivateRoute = (
|
const PrivateRoute = (
|
||||||
props: PrivateRouteProps
|
props: PrivateRouteProps
|
||||||
): ReactElement<PrivateRouteProps> => {
|
): ReactElement<PrivateRouteProps> => {
|
||||||
const { component, path, exact } = props;
|
const { component, path, exact } = props
|
||||||
const appContext = useContext(AppContext);
|
const appContext = useContext(AppContext)
|
||||||
return appContext.isLoggedIn ? (
|
return appContext.isLoggedIn ? (
|
||||||
<Route component={component} path={path} exact={exact} />
|
<Route component={component} path={path} exact={exact} />
|
||||||
) : (
|
) : (
|
||||||
<Redirect to="/login" />
|
<Redirect to="/login" />
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
export default PrivateRoute;
|
export default PrivateRoute
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import React from "react";
|
import React from 'react'
|
||||||
import ReactDOM from "react-dom";
|
import ReactDOM from 'react-dom'
|
||||||
import { Route, HashRouter, Switch } from "react-router-dom";
|
import { Route, HashRouter, Switch } from 'react-router-dom'
|
||||||
import "./index.scss";
|
import './index.scss'
|
||||||
import * as serviceWorker from "./serviceWorker";
|
import * as serviceWorker from './serviceWorker'
|
||||||
import { AppProvider } from "@sasjs/test-framework";
|
import { AppProvider } from '@sasjs/test-framework'
|
||||||
import PrivateRoute from "./PrivateRoute";
|
import PrivateRoute from './PrivateRoute'
|
||||||
import Login from "./Login";
|
import Login from './Login'
|
||||||
import App from "./App";
|
import App from './App'
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<AppProvider>
|
<AppProvider>
|
||||||
@@ -17,10 +17,10 @@ ReactDOM.render(
|
|||||||
</Switch>
|
</Switch>
|
||||||
</HashRouter>
|
</HashRouter>
|
||||||
</AppProvider>,
|
</AppProvider>,
|
||||||
document.getElementById("root")
|
document.getElementById('root')
|
||||||
);
|
)
|
||||||
|
|
||||||
// If you want your app to work offline and load faster, you can change
|
// If you want your app to work offline and load faster, you can change
|
||||||
// unregister() to register() below. Note this comes with some pitfalls.
|
// unregister() to register() below. Note this comes with some pitfalls.
|
||||||
// Learn more about service workers: https://bit.ly/CRA-PWA
|
// Learn more about service workers: https://bit.ly/CRA-PWA
|
||||||
serviceWorker.unregister();
|
serviceWorker.unregister()
|
||||||
|
|||||||
@@ -11,46 +11,46 @@
|
|||||||
// opt-in, read https://bit.ly/CRA-PWA
|
// opt-in, read https://bit.ly/CRA-PWA
|
||||||
|
|
||||||
const isLocalhost = Boolean(
|
const isLocalhost = Boolean(
|
||||||
window.location.hostname === "localhost" ||
|
window.location.hostname === 'localhost' ||
|
||||||
// [::1] is the IPv6 localhost address.
|
// [::1] is the IPv6 localhost address.
|
||||||
window.location.hostname === "[::1]" ||
|
window.location.hostname === '[::1]' ||
|
||||||
// 127.0.0.0/8 are considered localhost for IPv4.
|
// 127.0.0.0/8 are considered localhost for IPv4.
|
||||||
window.location.hostname.match(
|
window.location.hostname.match(
|
||||||
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
|
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
|
||||||
)
|
)
|
||||||
);
|
)
|
||||||
|
|
||||||
export function register(config) {
|
export function register(config) {
|
||||||
if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) {
|
if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
|
||||||
// The URL constructor is available in all browsers that support SW.
|
// The URL constructor is available in all browsers that support SW.
|
||||||
const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
|
const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)
|
||||||
if (publicUrl.origin !== window.location.origin) {
|
if (publicUrl.origin !== window.location.origin) {
|
||||||
// Our service worker won't work if PUBLIC_URL is on a different origin
|
// Our service worker won't work if PUBLIC_URL is on a different origin
|
||||||
// from what our page is served on. This might happen if a CDN is used to
|
// from what our page is served on. This might happen if a CDN is used to
|
||||||
// serve assets; see https://github.com/facebook/create-react-app/issues/2374
|
// serve assets; see https://github.com/facebook/create-react-app/issues/2374
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener("load", () => {
|
window.addEventListener('load', () => {
|
||||||
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
|
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`
|
||||||
|
|
||||||
if (isLocalhost) {
|
if (isLocalhost) {
|
||||||
// This is running on localhost. Let's check if a service worker still exists or not.
|
// This is running on localhost. Let's check if a service worker still exists or not.
|
||||||
checkValidServiceWorker(swUrl, config);
|
checkValidServiceWorker(swUrl, config)
|
||||||
|
|
||||||
// Add some additional logging to localhost, pointing developers to the
|
// Add some additional logging to localhost, pointing developers to the
|
||||||
// service worker/PWA documentation.
|
// service worker/PWA documentation.
|
||||||
navigator.serviceWorker.ready.then(() => {
|
navigator.serviceWorker.ready.then(() => {
|
||||||
console.log(
|
console.log(
|
||||||
"This web app is being served cache-first by a service " +
|
'This web app is being served cache-first by a service ' +
|
||||||
"worker. To learn more, visit https://bit.ly/CRA-PWA"
|
'worker. To learn more, visit https://bit.ly/CRA-PWA'
|
||||||
);
|
)
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
// Is not localhost. Just register service worker
|
// Is not localhost. Just register service worker
|
||||||
registerValidSW(swUrl, config);
|
registerValidSW(swUrl, config)
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,83 +59,83 @@ function registerValidSW(swUrl, config) {
|
|||||||
.register(swUrl)
|
.register(swUrl)
|
||||||
.then((registration) => {
|
.then((registration) => {
|
||||||
registration.onupdatefound = () => {
|
registration.onupdatefound = () => {
|
||||||
const installingWorker = registration.installing;
|
const installingWorker = registration.installing
|
||||||
if (installingWorker == null) {
|
if (installingWorker == null) {
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
installingWorker.onstatechange = () => {
|
installingWorker.onstatechange = () => {
|
||||||
if (installingWorker.state === "installed") {
|
if (installingWorker.state === 'installed') {
|
||||||
if (navigator.serviceWorker.controller) {
|
if (navigator.serviceWorker.controller) {
|
||||||
// At this point, the updated precached content has been fetched,
|
// At this point, the updated precached content has been fetched,
|
||||||
// but the previous service worker will still serve the older
|
// but the previous service worker will still serve the older
|
||||||
// content until all client tabs are closed.
|
// content until all client tabs are closed.
|
||||||
console.log(
|
console.log(
|
||||||
"New content is available and will be used when all " +
|
'New content is available and will be used when all ' +
|
||||||
"tabs for this page are closed. See https://bit.ly/CRA-PWA."
|
'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
|
||||||
);
|
)
|
||||||
|
|
||||||
// Execute callback
|
// Execute callback
|
||||||
if (config && config.onUpdate) {
|
if (config && config.onUpdate) {
|
||||||
config.onUpdate(registration);
|
config.onUpdate(registration)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// At this point, everything has been precached.
|
// At this point, everything has been precached.
|
||||||
// It's the perfect time to display a
|
// It's the perfect time to display a
|
||||||
// "Content is cached for offline use." message.
|
// "Content is cached for offline use." message.
|
||||||
console.log("Content is cached for offline use.");
|
console.log('Content is cached for offline use.')
|
||||||
|
|
||||||
// Execute callback
|
// Execute callback
|
||||||
if (config && config.onSuccess) {
|
if (config && config.onSuccess) {
|
||||||
config.onSuccess(registration);
|
config.onSuccess(registration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.error("Error during service worker registration:", error);
|
console.error('Error during service worker registration:', error)
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkValidServiceWorker(swUrl, config) {
|
function checkValidServiceWorker(swUrl, config) {
|
||||||
// Check if the service worker can be found. If it can't reload the page.
|
// Check if the service worker can be found. If it can't reload the page.
|
||||||
fetch(swUrl, {
|
fetch(swUrl, {
|
||||||
headers: { "Service-Worker": "script" }
|
headers: { 'Service-Worker': 'script' }
|
||||||
})
|
})
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
// Ensure service worker exists, and that we really are getting a JS file.
|
// Ensure service worker exists, and that we really are getting a JS file.
|
||||||
const contentType = response.headers.get("content-type");
|
const contentType = response.headers.get('content-type')
|
||||||
if (
|
if (
|
||||||
response.status === 404 ||
|
response.status === 404 ||
|
||||||
(contentType != null && contentType.indexOf("javascript") === -1)
|
(contentType != null && contentType.indexOf('javascript') === -1)
|
||||||
) {
|
) {
|
||||||
// No service worker found. Probably a different app. Reload the page.
|
// No service worker found. Probably a different app. Reload the page.
|
||||||
navigator.serviceWorker.ready.then((registration) => {
|
navigator.serviceWorker.ready.then((registration) => {
|
||||||
registration.unregister().then(() => {
|
registration.unregister().then(() => {
|
||||||
window.location.reload();
|
window.location.reload()
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
// Service worker found. Proceed as normal.
|
// Service worker found. Proceed as normal.
|
||||||
registerValidSW(swUrl, config);
|
registerValidSW(swUrl, config)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
console.log(
|
console.log(
|
||||||
"No internet connection found. App is running in offline mode."
|
'No internet connection found. App is running in offline mode.'
|
||||||
);
|
)
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function unregister() {
|
export function unregister() {
|
||||||
if ("serviceWorker" in navigator) {
|
if ('serviceWorker' in navigator) {
|
||||||
navigator.serviceWorker.ready
|
navigator.serviceWorker.ready
|
||||||
.then((registration) => {
|
.then((registration) => {
|
||||||
registration.unregister();
|
registration.unregister()
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.error(error.message);
|
console.error(error.message)
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
// allows you to do things like:
|
// allows you to do things like:
|
||||||
// expect(element).toHaveTextContent(/react/i)
|
// expect(element).toHaveTextContent(/react/i)
|
||||||
// learn more: https://github.com/testing-library/jest-dom
|
// learn more: https://github.com/testing-library/jest-dom
|
||||||
import "@testing-library/jest-dom/extend-expect";
|
import '@testing-library/jest-dom/extend-expect'
|
||||||
|
|||||||
@@ -1,102 +1,102 @@
|
|||||||
import SASjs, { SASjsConfig } from "@sasjs/adapter";
|
import SASjs, { SASjsConfig } from '@sasjs/adapter'
|
||||||
import { TestSuite } from "@sasjs/test-framework";
|
import { TestSuite } from '@sasjs/test-framework'
|
||||||
import { ServerType } from "@sasjs/utils/types";
|
import { ServerType } from '@sasjs/utils/types'
|
||||||
|
|
||||||
const stringData: any = { table1: [{ col1: "first col value" }] };
|
const stringData: any = { table1: [{ col1: 'first col value' }] }
|
||||||
|
|
||||||
const defaultConfig: SASjsConfig = {
|
const defaultConfig: SASjsConfig = {
|
||||||
serverUrl: window.location.origin,
|
serverUrl: window.location.origin,
|
||||||
pathSAS9: "/SASStoredProcess/do",
|
pathSAS9: '/SASStoredProcess/do',
|
||||||
pathSASViya: "/SASJobExecution",
|
pathSASViya: '/SASJobExecution',
|
||||||
appLoc: "/Public/seedapp",
|
appLoc: '/Public/seedapp',
|
||||||
serverType: ServerType.SasViya,
|
serverType: ServerType.SasViya,
|
||||||
debug: false,
|
debug: false,
|
||||||
contextName: "SAS Job Execution compute context",
|
contextName: 'SAS Job Execution compute context',
|
||||||
useComputeApi: false,
|
useComputeApi: false,
|
||||||
allowInsecureRequests: false
|
allowInsecureRequests: false
|
||||||
};
|
}
|
||||||
|
|
||||||
const customConfig = {
|
const customConfig = {
|
||||||
serverUrl: "http://url.com",
|
serverUrl: 'http://url.com',
|
||||||
pathSAS9: "sas9",
|
pathSAS9: 'sas9',
|
||||||
pathSASViya: "viya",
|
pathSASViya: 'viya',
|
||||||
appLoc: "/Public/seedapp",
|
appLoc: '/Public/seedapp',
|
||||||
serverType: ServerType.Sas9,
|
serverType: ServerType.Sas9,
|
||||||
debug: false
|
debug: false
|
||||||
};
|
}
|
||||||
|
|
||||||
export const basicTests = (
|
export const basicTests = (
|
||||||
adapter: SASjs,
|
adapter: SASjs,
|
||||||
userName: string,
|
userName: string,
|
||||||
password: string
|
password: string
|
||||||
): TestSuite => ({
|
): TestSuite => ({
|
||||||
name: "Basic Tests",
|
name: 'Basic Tests',
|
||||||
tests: [
|
tests: [
|
||||||
{
|
{
|
||||||
title: "Log in",
|
title: 'Log in',
|
||||||
description: "Should log the user in",
|
description: 'Should log the user in',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
return adapter.logIn(userName, password);
|
return adapter.logIn(userName, password)
|
||||||
},
|
},
|
||||||
assertion: (response: any) =>
|
assertion: (response: any) =>
|
||||||
response && response.isLoggedIn && response.userName === userName
|
response && response.isLoggedIn && response.userName === userName
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Multiple Log in attempts",
|
title: 'Multiple Log in attempts',
|
||||||
description:
|
description:
|
||||||
"Should fail on first attempt and should log the user in on second attempt",
|
'Should fail on first attempt and should log the user in on second attempt',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
await adapter.logOut();
|
await adapter.logOut()
|
||||||
await adapter.logIn("invalid", "invalid");
|
await adapter.logIn('invalid', 'invalid')
|
||||||
return adapter.logIn(userName, password);
|
return adapter.logIn(userName, password)
|
||||||
},
|
},
|
||||||
assertion: (response: any) =>
|
assertion: (response: any) =>
|
||||||
response && response.isLoggedIn && response.userName === userName
|
response && response.isLoggedIn && response.userName === userName
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Trigger login callback",
|
title: 'Trigger login callback',
|
||||||
description:
|
description:
|
||||||
"Should trigger required login callback and after successful login, it should finish the request",
|
'Should trigger required login callback and after successful login, it should finish the request',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
await adapter.logOut();
|
await adapter.logOut()
|
||||||
|
|
||||||
return await adapter.request(
|
return await adapter.request(
|
||||||
"common/sendArr",
|
'common/sendArr',
|
||||||
stringData,
|
stringData,
|
||||||
undefined,
|
undefined,
|
||||||
() => {
|
() => {
|
||||||
adapter.logIn(userName, password);
|
adapter.logIn(userName, password)
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
},
|
},
|
||||||
assertion: (response: any) => {
|
assertion: (response: any) => {
|
||||||
return response.table1[0][0] === stringData.table1[0].col1;
|
return response.table1[0][0] === stringData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Request with debug on",
|
title: 'Request with debug on',
|
||||||
description:
|
description:
|
||||||
"Should complete successful request with debugging switched on",
|
'Should complete successful request with debugging switched on',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
const config = {
|
const config = {
|
||||||
debug: true
|
debug: true
|
||||||
};
|
}
|
||||||
|
|
||||||
return await adapter.request("common/sendArr", stringData, config);
|
return await adapter.request('common/sendArr', stringData, config)
|
||||||
},
|
},
|
||||||
assertion: (response: any) => {
|
assertion: (response: any) => {
|
||||||
return response.table1[0][0] === stringData.table1[0].col1;
|
return response.table1[0][0] === stringData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Default config",
|
title: 'Default config',
|
||||||
description:
|
description:
|
||||||
"Should instantiate with default config when none is provided",
|
'Should instantiate with default config when none is provided',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
return Promise.resolve(new SASjs());
|
return Promise.resolve(new SASjs())
|
||||||
},
|
},
|
||||||
assertion: (sasjsInstance: SASjs) => {
|
assertion: (sasjsInstance: SASjs) => {
|
||||||
const sasjsConfig = sasjsInstance.getSasjsConfig();
|
const sasjsConfig = sasjsInstance.getSasjsConfig()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
sasjsConfig.serverUrl === defaultConfig.serverUrl &&
|
sasjsConfig.serverUrl === defaultConfig.serverUrl &&
|
||||||
@@ -105,17 +105,17 @@ export const basicTests = (
|
|||||||
sasjsConfig.appLoc === defaultConfig.appLoc &&
|
sasjsConfig.appLoc === defaultConfig.appLoc &&
|
||||||
sasjsConfig.serverType === defaultConfig.serverType &&
|
sasjsConfig.serverType === defaultConfig.serverType &&
|
||||||
sasjsConfig.debug === defaultConfig.debug
|
sasjsConfig.debug === defaultConfig.debug
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Custom config",
|
title: 'Custom config',
|
||||||
description: "Should use fully custom config whenever supplied",
|
description: 'Should use fully custom config whenever supplied',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
return Promise.resolve(new SASjs(customConfig));
|
return Promise.resolve(new SASjs(customConfig))
|
||||||
},
|
},
|
||||||
assertion: (sasjsInstance: SASjs) => {
|
assertion: (sasjsInstance: SASjs) => {
|
||||||
const sasjsConfig = sasjsInstance.getSasjsConfig();
|
const sasjsConfig = sasjsInstance.getSasjsConfig()
|
||||||
return (
|
return (
|
||||||
sasjsConfig.serverUrl === customConfig.serverUrl &&
|
sasjsConfig.serverUrl === customConfig.serverUrl &&
|
||||||
sasjsConfig.pathSAS9 === customConfig.pathSAS9 &&
|
sasjsConfig.pathSAS9 === customConfig.pathSAS9 &&
|
||||||
@@ -123,28 +123,28 @@ export const basicTests = (
|
|||||||
sasjsConfig.appLoc === customConfig.appLoc &&
|
sasjsConfig.appLoc === customConfig.appLoc &&
|
||||||
sasjsConfig.serverType === customConfig.serverType &&
|
sasjsConfig.serverType === customConfig.serverType &&
|
||||||
sasjsConfig.debug === customConfig.debug
|
sasjsConfig.debug === customConfig.debug
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Config overrides",
|
title: 'Config overrides',
|
||||||
description: "Should override default config with supplied properties",
|
description: 'Should override default config with supplied properties',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
return Promise.resolve(
|
return Promise.resolve(
|
||||||
new SASjs({ serverUrl: "http://test.com", debug: false })
|
new SASjs({ serverUrl: 'http://test.com', debug: false })
|
||||||
);
|
)
|
||||||
},
|
},
|
||||||
assertion: (sasjsInstance: SASjs) => {
|
assertion: (sasjsInstance: SASjs) => {
|
||||||
const sasjsConfig = sasjsInstance.getSasjsConfig();
|
const sasjsConfig = sasjsInstance.getSasjsConfig()
|
||||||
return (
|
return (
|
||||||
sasjsConfig.serverUrl === "http://test.com" &&
|
sasjsConfig.serverUrl === 'http://test.com' &&
|
||||||
sasjsConfig.pathSAS9 === defaultConfig.pathSAS9 &&
|
sasjsConfig.pathSAS9 === defaultConfig.pathSAS9 &&
|
||||||
sasjsConfig.pathSASViya === defaultConfig.pathSASViya &&
|
sasjsConfig.pathSASViya === defaultConfig.pathSASViya &&
|
||||||
sasjsConfig.appLoc === defaultConfig.appLoc &&
|
sasjsConfig.appLoc === defaultConfig.appLoc &&
|
||||||
sasjsConfig.serverType === defaultConfig.serverType &&
|
sasjsConfig.serverType === defaultConfig.serverType &&
|
||||||
sasjsConfig.debug === false
|
sasjsConfig.debug === false
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,106 +1,100 @@
|
|||||||
import SASjs from "@sasjs/adapter";
|
import SASjs from '@sasjs/adapter'
|
||||||
import { TestSuite } from "@sasjs/test-framework";
|
import { TestSuite } from '@sasjs/test-framework'
|
||||||
|
|
||||||
export const computeTests = (adapter: SASjs): TestSuite => ({
|
export const computeTests = (adapter: SASjs): TestSuite => ({
|
||||||
name: "Compute",
|
name: 'Compute',
|
||||||
tests: [
|
tests: [
|
||||||
{
|
{
|
||||||
title: "Start Compute Job - not waiting for result",
|
title: 'Start Compute Job - not waiting for result',
|
||||||
description: "Should start a compute job and return the session",
|
description: 'Should start a compute job and return the session',
|
||||||
test: () => {
|
test: () => {
|
||||||
const data: any = { table1: [{ col1: "first col value" }] };
|
const data: any = { table1: [{ col1: 'first col value' }] }
|
||||||
return adapter.startComputeJob("/Public/app/common/sendArr", data);
|
return adapter.startComputeJob('/Public/app/common/sendArr', data)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const expectedProperties = ["id", "applicationName", "attributes"];
|
const expectedProperties = ['id', 'applicationName', 'attributes']
|
||||||
return validate(expectedProperties, res);
|
return validate(expectedProperties, res)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Start Compute Job - waiting for result",
|
title: 'Start Compute Job - waiting for result',
|
||||||
description: "Should start a compute job and return the job",
|
description: 'Should start a compute job and return the job',
|
||||||
test: () => {
|
test: () => {
|
||||||
const data: any = { table1: [{ col1: "first col value" }] };
|
const data: any = { table1: [{ col1: 'first col value' }] }
|
||||||
return adapter.startComputeJob(
|
return adapter.startComputeJob(
|
||||||
"/Public/app/common/sendArr",
|
'/Public/app/common/sendArr',
|
||||||
data,
|
data,
|
||||||
{},
|
{},
|
||||||
"",
|
'',
|
||||||
true
|
true
|
||||||
);
|
)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const expectedProperties = [
|
const expectedProperties = [
|
||||||
"id",
|
'id',
|
||||||
"state",
|
'state',
|
||||||
"creationTimeStamp",
|
'creationTimeStamp',
|
||||||
"jobConditionCode"
|
'jobConditionCode'
|
||||||
];
|
]
|
||||||
return validate(expectedProperties, res.job);
|
return validate(expectedProperties, res.job)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Execute Script Viya - complete job",
|
title: 'Execute Script Viya - complete job',
|
||||||
description: "Should execute sas file and return log",
|
description: 'Should execute sas file and return log',
|
||||||
test: () => {
|
test: () => {
|
||||||
const fileLines = [
|
const fileLines = [`data;`, `do x=1 to 100;`, `output;`, `end;`, `run;`]
|
||||||
`data;`,
|
|
||||||
`do x=1 to 100;`,
|
|
||||||
`output;`,
|
|
||||||
`end;`,
|
|
||||||
`run;`
|
|
||||||
];
|
|
||||||
|
|
||||||
return adapter.executeScriptSASViya(
|
return adapter.executeScriptSASViya(
|
||||||
"sasCode.sas",
|
'sasCode.sas',
|
||||||
fileLines,
|
fileLines,
|
||||||
"SAS Studio compute context",
|
'SAS Studio compute context',
|
||||||
undefined,
|
undefined,
|
||||||
true
|
true
|
||||||
);
|
)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const expectedLogContent = `1 data;\\n2 do x=1 to 100;\\n3 output;\\n4 end;\\n5 run;\\n\\n`;
|
const expectedLogContent = `1 data;\\n2 do x=1 to 100;\\n3 output;\\n4 end;\\n5 run;\\n\\n`
|
||||||
|
|
||||||
return validateLog(expectedLogContent, res.log);
|
return validateLog(expectedLogContent, res.log)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Execute Script Viya - failed job",
|
title: 'Execute Script Viya - failed job',
|
||||||
description: "Should execute sas file and return log",
|
description: 'Should execute sas file and return log',
|
||||||
test: () => {
|
test: () => {
|
||||||
const fileLines = [`%abort;`];
|
const fileLines = [`%abort;`]
|
||||||
|
|
||||||
return adapter
|
return adapter
|
||||||
.executeScriptSASViya(
|
.executeScriptSASViya(
|
||||||
"sasCode.sas",
|
'sasCode.sas',
|
||||||
fileLines,
|
fileLines,
|
||||||
"SAS Studio compute context",
|
'SAS Studio compute context',
|
||||||
undefined,
|
undefined,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.catch((err: any) => err);
|
.catch((err: any) => err)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const expectedLogContent = `1 %abort;\\nERROR: The %ABORT statement is not valid in open code.\\n`;
|
const expectedLogContent = `1 %abort;\\nERROR: The %ABORT statement is not valid in open code.\\n`
|
||||||
|
|
||||||
return validateLog(expectedLogContent, res.log);
|
return validateLog(expectedLogContent, res.log)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
})
|
||||||
|
|
||||||
const validateLog = (text: string, log: string): boolean => {
|
const validateLog = (text: string, log: string): boolean => {
|
||||||
const isValid = JSON.stringify(log).includes(text);
|
const isValid = JSON.stringify(log).includes(text)
|
||||||
|
|
||||||
return isValid;
|
return isValid
|
||||||
};
|
}
|
||||||
|
|
||||||
const validate = (expectedProperties: string[], data: any): boolean => {
|
const validate = (expectedProperties: string[], data: any): boolean => {
|
||||||
const actualProperties = Object.keys(data);
|
const actualProperties = Object.keys(data)
|
||||||
|
|
||||||
const isValid = expectedProperties.every((property) =>
|
const isValid = expectedProperties.every((property) =>
|
||||||
actualProperties.includes(property)
|
actualProperties.includes(property)
|
||||||
);
|
)
|
||||||
return isValid;
|
return isValid
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -1,112 +1,112 @@
|
|||||||
import SASjs from "@sasjs/adapter";
|
import SASjs from '@sasjs/adapter'
|
||||||
import { TestSuite } from "@sasjs/test-framework";
|
import { TestSuite } from '@sasjs/test-framework'
|
||||||
|
|
||||||
const stringData: any = { table1: [{ col1: "first col value" }] };
|
const stringData: any = { table1: [{ col1: 'first col value' }] }
|
||||||
const numericData: any = { table1: [{ col1: 3.14159265 }] };
|
const numericData: any = { table1: [{ col1: 3.14159265 }] }
|
||||||
const multiColumnData: any = {
|
const multiColumnData: any = {
|
||||||
table1: [{ col1: 42, col2: 1.618, col3: "x", col4: "x" }]
|
table1: [{ col1: 42, col2: 1.618, col3: 'x', col4: 'x' }]
|
||||||
};
|
}
|
||||||
const multipleRowsWithNulls: any = {
|
const multipleRowsWithNulls: any = {
|
||||||
table1: [
|
table1: [
|
||||||
{ col1: 42, col2: null, col3: "x", col4: "" },
|
{ col1: 42, col2: null, col3: 'x', col4: '' },
|
||||||
{ col1: 42, col2: null, col3: "x", col4: "" },
|
{ col1: 42, col2: null, col3: 'x', col4: '' },
|
||||||
{ col1: 42, col2: null, col3: "x", col4: "" },
|
{ col1: 42, col2: null, col3: 'x', col4: '' },
|
||||||
{ col1: 42, col2: 1.62, col3: "x", col4: "x" },
|
{ col1: 42, col2: 1.62, col3: 'x', col4: 'x' },
|
||||||
{ col1: 42, col2: 1.62, col3: "x", col4: "x" }
|
{ col1: 42, col2: 1.62, col3: 'x', col4: 'x' }
|
||||||
]
|
]
|
||||||
};
|
}
|
||||||
|
|
||||||
const multipleColumnsWithNulls: any = {
|
const multipleColumnsWithNulls: any = {
|
||||||
table1: [
|
table1: [
|
||||||
{ col1: 42, col2: null, col3: "x", col4: null },
|
{ col1: 42, col2: null, col3: 'x', col4: null },
|
||||||
{ col1: 42, col2: null, col3: "x", col4: null },
|
{ col1: 42, col2: null, col3: 'x', col4: null },
|
||||||
{ col1: 42, col2: null, col3: "x", col4: null },
|
{ col1: 42, col2: null, col3: 'x', col4: null },
|
||||||
{ col1: 42, col2: null, col3: "x", col4: "" },
|
{ col1: 42, col2: null, col3: 'x', col4: '' },
|
||||||
{ col1: 42, col2: null, col3: "x", col4: "" }
|
{ col1: 42, col2: null, col3: 'x', col4: '' }
|
||||||
]
|
]
|
||||||
};
|
}
|
||||||
|
|
||||||
const getLongStringData = (length = 32764) => {
|
const getLongStringData = (length = 32764) => {
|
||||||
let x = "X";
|
let x = 'X'
|
||||||
for (let i = 1; i <= length; i++) {
|
for (let i = 1; i <= length; i++) {
|
||||||
x = x + "X";
|
x = x + 'X'
|
||||||
}
|
}
|
||||||
const data: any = { table1: [{ col1: x }] };
|
const data: any = { table1: [{ col1: x }] }
|
||||||
return data;
|
return data
|
||||||
};
|
}
|
||||||
|
|
||||||
const getLargeObjectData = () => {
|
const getLargeObjectData = () => {
|
||||||
const data = { table1: [{ big: "data" }] };
|
const data = { table1: [{ big: 'data' }] }
|
||||||
|
|
||||||
for (let i = 1; i < 10000; i++) {
|
for (let i = 1; i < 10000; i++) {
|
||||||
data.table1.push(data.table1[0]);
|
data.table1.push(data.table1[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data
|
||||||
};
|
}
|
||||||
|
|
||||||
export const sendArrTests = (adapter: SASjs): TestSuite => ({
|
export const sendArrTests = (adapter: SASjs): TestSuite => ({
|
||||||
name: "sendArr",
|
name: 'sendArr',
|
||||||
tests: [
|
tests: [
|
||||||
{
|
{
|
||||||
title: "Absolute paths",
|
title: 'Absolute paths',
|
||||||
description: "Should work with absolute paths to SAS jobs",
|
description: 'Should work with absolute paths to SAS jobs',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("/Public/app/common/sendArr", stringData);
|
return adapter.request('/Public/app/common/sendArr', stringData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return res.table1[0][0] === stringData.table1[0].col1;
|
return res.table1[0][0] === stringData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Single string value",
|
title: 'Single string value',
|
||||||
description: "Should send an array with a single string value",
|
description: 'Should send an array with a single string value',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", stringData);
|
return adapter.request('common/sendArr', stringData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return res.table1[0][0] === stringData.table1[0].col1;
|
return res.table1[0][0] === stringData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Long string value",
|
title: 'Long string value',
|
||||||
description:
|
description:
|
||||||
"Should send an array with a long string value under 32765 characters",
|
'Should send an array with a long string value under 32765 characters',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", getLongStringData());
|
return adapter.request('common/sendArr', getLongStringData())
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const longStringData = getLongStringData();
|
const longStringData = getLongStringData()
|
||||||
return res.table1[0][0] === longStringData.table1[0].col1;
|
return res.table1[0][0] === longStringData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Overly long string value",
|
title: 'Overly long string value',
|
||||||
description:
|
description:
|
||||||
"Should error out with long string values over 32765 characters",
|
'Should error out with long string values over 32765 characters',
|
||||||
test: () => {
|
test: () => {
|
||||||
const data = getLongStringData(32767);
|
const data = getLongStringData(32767)
|
||||||
return adapter.request("common/sendArr", data).catch((e) => e);
|
return adapter.request('common/sendArr', data).catch((e) => e)
|
||||||
},
|
},
|
||||||
assertion: (error: any) => {
|
assertion: (error: any) => {
|
||||||
return !!error && !!error.error && !!error.error.message;
|
return !!error && !!error.error && !!error.error.message
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Single numeric value",
|
title: 'Single numeric value',
|
||||||
description: "Should send an array with a single numeric value",
|
description: 'Should send an array with a single numeric value',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", numericData);
|
return adapter.request('common/sendArr', numericData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return res.table1[0][0] === numericData.table1[0].col1;
|
return res.table1[0][0] === numericData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Multiple columns",
|
title: 'Multiple columns',
|
||||||
description: "Should handle data with multiple columns",
|
description: 'Should handle data with multiple columns',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", multiColumnData);
|
return adapter.request('common/sendArr', multiColumnData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return (
|
return (
|
||||||
@@ -114,144 +114,141 @@ export const sendArrTests = (adapter: SASjs): TestSuite => ({
|
|||||||
res.table1[0][1] === multiColumnData.table1[0].col2 &&
|
res.table1[0][1] === multiColumnData.table1[0].col2 &&
|
||||||
res.table1[0][2] === multiColumnData.table1[0].col3 &&
|
res.table1[0][2] === multiColumnData.table1[0].col3 &&
|
||||||
res.table1[0][3] === multiColumnData.table1[0].col4
|
res.table1[0][3] === multiColumnData.table1[0].col4
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Multiple rows with nulls",
|
title: 'Multiple rows with nulls',
|
||||||
description: "Should handle data with multiple rows with null values",
|
description: 'Should handle data with multiple rows with null values',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", multipleRowsWithNulls);
|
return adapter.request('common/sendArr', multipleRowsWithNulls)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
let result = true;
|
let result = true
|
||||||
multipleRowsWithNulls.table1.forEach((_: any, index: number) => {
|
multipleRowsWithNulls.table1.forEach((_: any, index: number) => {
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index][0] === multipleRowsWithNulls.table1[index].col1;
|
res.table1[index][0] === multipleRowsWithNulls.table1[index].col1
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index][1] === multipleRowsWithNulls.table1[index].col2;
|
res.table1[index][1] === multipleRowsWithNulls.table1[index].col2
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index][2] === multipleRowsWithNulls.table1[index].col3;
|
res.table1[index][2] === multipleRowsWithNulls.table1[index].col3
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index][3] ===
|
res.table1[index][3] ===
|
||||||
(multipleRowsWithNulls.table1[index].col4 || " ");
|
(multipleRowsWithNulls.table1[index].col4 || ' ')
|
||||||
});
|
})
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Multiple columns with nulls",
|
title: 'Multiple columns with nulls',
|
||||||
description: "Should handle data with multiple columns with null values",
|
description: 'Should handle data with multiple columns with null values',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", multipleColumnsWithNulls);
|
return adapter.request('common/sendArr', multipleColumnsWithNulls)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
let result = true;
|
let result = true
|
||||||
multipleColumnsWithNulls.table1.forEach((_: any, index: number) => {
|
multipleColumnsWithNulls.table1.forEach((_: any, index: number) => {
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index][0] ===
|
res.table1[index][0] === multipleColumnsWithNulls.table1[index].col1
|
||||||
multipleColumnsWithNulls.table1[index].col1;
|
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index][1] ===
|
res.table1[index][1] === multipleColumnsWithNulls.table1[index].col2
|
||||||
multipleColumnsWithNulls.table1[index].col2;
|
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index][2] ===
|
res.table1[index][2] === multipleColumnsWithNulls.table1[index].col3
|
||||||
multipleColumnsWithNulls.table1[index].col3;
|
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index][3] ===
|
res.table1[index][3] ===
|
||||||
(multipleColumnsWithNulls.table1[index].col4 || " ");
|
(multipleColumnsWithNulls.table1[index].col4 || ' ')
|
||||||
});
|
})
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
})
|
||||||
|
|
||||||
export const sendObjTests = (adapter: SASjs): TestSuite => ({
|
export const sendObjTests = (adapter: SASjs): TestSuite => ({
|
||||||
name: "sendObj",
|
name: 'sendObj',
|
||||||
tests: [
|
tests: [
|
||||||
{
|
{
|
||||||
title: "Invalid column name",
|
title: 'Invalid column name',
|
||||||
description: "Should throw an error",
|
description: 'Should throw an error',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
const invalidData: any = {
|
const invalidData: any = {
|
||||||
"1 invalid table": [{ col1: 42 }]
|
'1 invalid table': [{ col1: 42 }]
|
||||||
};
|
}
|
||||||
return adapter.request("common/sendObj", invalidData).catch((e) => e);
|
return adapter.request('common/sendObj', invalidData).catch((e) => e)
|
||||||
},
|
},
|
||||||
assertion: (error: any) =>
|
assertion: (error: any) =>
|
||||||
!!error && !!error.error && !!error.error.message
|
!!error && !!error.error && !!error.error.message
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Single string value",
|
title: 'Single string value',
|
||||||
description: "Should send an object with a single string value",
|
description: 'Should send an object with a single string value',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", stringData);
|
return adapter.request('common/sendObj', stringData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return res.table1[0].COL1 === stringData.table1[0].col1;
|
return res.table1[0].COL1 === stringData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Long string value",
|
title: 'Long string value',
|
||||||
description:
|
description:
|
||||||
"Should send an object with a long string value under 32765 characters",
|
'Should send an object with a long string value under 32765 characters',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", getLongStringData());
|
return adapter.request('common/sendObj', getLongStringData())
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const longStringData = getLongStringData();
|
const longStringData = getLongStringData()
|
||||||
return res.table1[0].COL1 === longStringData.table1[0].col1;
|
return res.table1[0].COL1 === longStringData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Overly long string value",
|
title: 'Overly long string value',
|
||||||
description:
|
description:
|
||||||
"Should error out with long string values over 32765 characters",
|
'Should error out with long string values over 32765 characters',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter
|
return adapter
|
||||||
.request("common/sendObj", getLongStringData(32767))
|
.request('common/sendObj', getLongStringData(32767))
|
||||||
.catch((e) => e);
|
.catch((e) => e)
|
||||||
},
|
},
|
||||||
assertion: (error: any) => {
|
assertion: (error: any) => {
|
||||||
return !!error && !!error.error && !!error.error.message;
|
return !!error && !!error.error && !!error.error.message
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Single numeric value",
|
title: 'Single numeric value',
|
||||||
description: "Should send an object with a single numeric value",
|
description: 'Should send an object with a single numeric value',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", numericData);
|
return adapter.request('common/sendObj', numericData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return res.table1[0].COL1 === numericData.table1[0].col1;
|
return res.table1[0].COL1 === numericData.table1[0].col1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
title: "Large data volume",
|
title: 'Large data volume',
|
||||||
description: "Should send an object with a large amount of data",
|
description: 'Should send an object with a large amount of data',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", getLargeObjectData());
|
return adapter.request('common/sendObj', getLargeObjectData())
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const data = getLargeObjectData();
|
const data = getLargeObjectData()
|
||||||
return res.table1[9000].BIG === data.table1[9000].big;
|
return res.table1[9000].BIG === data.table1[9000].big
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Multiple columns",
|
title: 'Multiple columns',
|
||||||
description: "Should handle data with multiple columns",
|
description: 'Should handle data with multiple columns',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", multiColumnData);
|
return adapter.request('common/sendObj', multiColumnData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return (
|
return (
|
||||||
@@ -259,63 +256,63 @@ export const sendObjTests = (adapter: SASjs): TestSuite => ({
|
|||||||
res.table1[0].COL2 === multiColumnData.table1[0].col2 &&
|
res.table1[0].COL2 === multiColumnData.table1[0].col2 &&
|
||||||
res.table1[0].COL3 === multiColumnData.table1[0].col3 &&
|
res.table1[0].COL3 === multiColumnData.table1[0].col3 &&
|
||||||
res.table1[0].COL4 === multiColumnData.table1[0].col4
|
res.table1[0].COL4 === multiColumnData.table1[0].col4
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Multiple rows with nulls",
|
title: 'Multiple rows with nulls',
|
||||||
description: "Should handle data with multiple rows with null values",
|
description: 'Should handle data with multiple rows with null values',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", multipleRowsWithNulls);
|
return adapter.request('common/sendObj', multipleRowsWithNulls)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
let result = true;
|
let result = true
|
||||||
multipleRowsWithNulls.table1.forEach((_: any, index: number) => {
|
multipleRowsWithNulls.table1.forEach((_: any, index: number) => {
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index].COL1 === multipleRowsWithNulls.table1[index].col1;
|
res.table1[index].COL1 === multipleRowsWithNulls.table1[index].col1
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index].COL2 === multipleRowsWithNulls.table1[index].col2;
|
res.table1[index].COL2 === multipleRowsWithNulls.table1[index].col2
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index].COL3 === multipleRowsWithNulls.table1[index].col3;
|
res.table1[index].COL3 === multipleRowsWithNulls.table1[index].col3
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index].COL4 ===
|
res.table1[index].COL4 ===
|
||||||
(multipleRowsWithNulls.table1[index].col4 || " ");
|
(multipleRowsWithNulls.table1[index].col4 || ' ')
|
||||||
});
|
})
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Multiple columns with nulls",
|
title: 'Multiple columns with nulls',
|
||||||
description: "Should handle data with multiple columns with null values",
|
description: 'Should handle data with multiple columns with null values',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", multipleColumnsWithNulls);
|
return adapter.request('common/sendObj', multipleColumnsWithNulls)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
let result = true;
|
let result = true
|
||||||
multipleColumnsWithNulls.table1.forEach((_: any, index: number) => {
|
multipleColumnsWithNulls.table1.forEach((_: any, index: number) => {
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index].COL1 ===
|
res.table1[index].COL1 ===
|
||||||
multipleColumnsWithNulls.table1[index].col1;
|
multipleColumnsWithNulls.table1[index].col1
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index].COL2 ===
|
res.table1[index].COL2 ===
|
||||||
multipleColumnsWithNulls.table1[index].col2;
|
multipleColumnsWithNulls.table1[index].col2
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index].COL3 ===
|
res.table1[index].COL3 ===
|
||||||
multipleColumnsWithNulls.table1[index].col3;
|
multipleColumnsWithNulls.table1[index].col3
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[index].COL4 ===
|
res.table1[index].COL4 ===
|
||||||
(multipleColumnsWithNulls.table1[index].col4 || " ");
|
(multipleColumnsWithNulls.table1[index].col4 || ' ')
|
||||||
});
|
})
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,49 +1,49 @@
|
|||||||
import SASjs from "@sasjs/adapter";
|
import SASjs from '@sasjs/adapter'
|
||||||
import { TestSuite } from "@sasjs/test-framework";
|
import { TestSuite } from '@sasjs/test-framework'
|
||||||
|
|
||||||
const data: any = { table1: [{ col1: "first col value" }] };
|
const data: any = { table1: [{ col1: 'first col value' }] }
|
||||||
|
|
||||||
export const sasjsRequestTests = (adapter: SASjs): TestSuite => ({
|
export const sasjsRequestTests = (adapter: SASjs): TestSuite => ({
|
||||||
name: "SASjs Requests",
|
name: 'SASjs Requests',
|
||||||
tests: [
|
tests: [
|
||||||
{
|
{
|
||||||
title: "WORK tables",
|
title: 'WORK tables',
|
||||||
description: "Should get WORK tables after request",
|
description: 'Should get WORK tables after request',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
return adapter.request("common/sendArr", data);
|
return adapter.request('common/sendArr', data)
|
||||||
},
|
},
|
||||||
assertion: () => {
|
assertion: () => {
|
||||||
const requests = adapter.getSasRequests();
|
const requests = adapter.getSasRequests()
|
||||||
if (adapter.getSasjsConfig().debug) {
|
if (adapter.getSasjsConfig().debug) {
|
||||||
return requests[0].SASWORK !== null;
|
return requests[0].SASWORK !== null
|
||||||
} else {
|
} else {
|
||||||
return requests[0].SASWORK === null;
|
return requests[0].SASWORK === null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Make error and capture log",
|
title: 'Make error and capture log',
|
||||||
description:
|
description:
|
||||||
"Should make an error and capture log, in the same time it is testing if debug override is working",
|
'Should make an error and capture log, in the same time it is testing if debug override is working',
|
||||||
test: async () => {
|
test: async () => {
|
||||||
return adapter
|
return adapter
|
||||||
.request("common/makeErr", data, { debug: true })
|
.request('common/makeErr', data, { debug: true })
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
const sasRequests = adapter.getSasRequests();
|
const sasRequests = adapter.getSasRequests()
|
||||||
const makeErrRequest: any =
|
const makeErrRequest: any =
|
||||||
sasRequests.find((req) => req.serviceLink.includes("makeErr")) ||
|
sasRequests.find((req) => req.serviceLink.includes('makeErr')) ||
|
||||||
null;
|
null
|
||||||
|
|
||||||
if (!makeErrRequest) return false;
|
if (!makeErrRequest) return false
|
||||||
|
|
||||||
return !!(
|
return !!(
|
||||||
makeErrRequest.logFile && makeErrRequest.logFile.length > 0
|
makeErrRequest.logFile && makeErrRequest.logFile.length > 0
|
||||||
);
|
)
|
||||||
});
|
})
|
||||||
},
|
},
|
||||||
assertion: (response) => {
|
assertion: (response) => {
|
||||||
return response;
|
return response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,91 +1,92 @@
|
|||||||
import SASjs from "@sasjs/adapter";
|
import SASjs from '@sasjs/adapter'
|
||||||
import { TestSuite } from "@sasjs/test-framework";
|
import { TestSuite } from '@sasjs/test-framework'
|
||||||
|
|
||||||
const specialCharData: any = {
|
const specialCharData: any = {
|
||||||
table1: [
|
table1: [
|
||||||
{
|
{
|
||||||
tab: "\t",
|
tab: '\t',
|
||||||
lf: "\n",
|
lf: '\n',
|
||||||
cr: "\r",
|
cr: '\r',
|
||||||
semicolon: ";semi",
|
semicolon: ';semi',
|
||||||
percent: "%",
|
percent: '%',
|
||||||
singleQuote: "'",
|
singleQuote: "'",
|
||||||
doubleQuote: '"',
|
doubleQuote: '"',
|
||||||
crlf: "\r\n",
|
crlf: '\r\n',
|
||||||
euro: "€euro",
|
euro: '€euro',
|
||||||
banghash: "!#banghash"
|
banghash: '!#banghash',
|
||||||
|
dot: '.'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
}
|
||||||
|
|
||||||
const moreSpecialCharData: any = {
|
const moreSpecialCharData: any = {
|
||||||
table1: [
|
table1: [
|
||||||
{
|
{
|
||||||
speech0: '"speech',
|
speech0: '"speech',
|
||||||
pct: "%percent",
|
pct: '%percent',
|
||||||
speech: '"speech',
|
speech: '"speech',
|
||||||
slash: "\\slash",
|
slash: '\\slash',
|
||||||
slashWithSpecial: "\\\tslash",
|
slashWithSpecial: '\\\tslash',
|
||||||
macvar: "&sysuserid",
|
macvar: '&sysuserid',
|
||||||
chinese: "传/傳chinese",
|
chinese: '传/傳chinese',
|
||||||
sigma: "Σsigma",
|
sigma: 'Σsigma',
|
||||||
at: "@at",
|
at: '@at',
|
||||||
serbian: "Српски",
|
serbian: 'Српски',
|
||||||
dollar: "$"
|
dollar: '$'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
}
|
||||||
|
|
||||||
const getWideData = () => {
|
const getWideData = () => {
|
||||||
const cols: any = {};
|
const cols: any = {}
|
||||||
for (let i = 1; i <= 10000; i++) {
|
for (let i = 1; i <= 10000; i++) {
|
||||||
cols["col" + i] = "test" + i;
|
cols['col' + i] = 'test' + i
|
||||||
}
|
}
|
||||||
|
|
||||||
const data: any = {
|
const data: any = {
|
||||||
table1: [cols]
|
table1: [cols]
|
||||||
};
|
}
|
||||||
|
|
||||||
return data;
|
return data
|
||||||
};
|
}
|
||||||
|
|
||||||
const getTables = () => {
|
const getTables = () => {
|
||||||
const tables: any = {};
|
const tables: any = {}
|
||||||
|
|
||||||
for (let i = 1; i <= 100; i++) {
|
for (let i = 1; i <= 100; i++) {
|
||||||
tables["table" + i] = [{ col1: "x", col2: "x", col3: "x", col4: "x" }];
|
tables['table' + i] = [{ col1: 'x', col2: 'x', col3: 'x', col4: 'x' }]
|
||||||
}
|
}
|
||||||
return tables;
|
return tables
|
||||||
};
|
}
|
||||||
|
|
||||||
const getLargeDataset = () => {
|
const getLargeDataset = () => {
|
||||||
const rows: any = [];
|
const rows: any = []
|
||||||
const colData: string =
|
const colData: string =
|
||||||
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
|
||||||
for (let i = 1; i <= 10000; i++) {
|
for (let i = 1; i <= 10000; i++) {
|
||||||
rows.push({ col1: colData, col2: colData, col3: colData, col4: colData });
|
rows.push({ col1: colData, col2: colData, col3: colData, col4: colData })
|
||||||
}
|
}
|
||||||
|
|
||||||
const data: any = {
|
const data: any = {
|
||||||
table1: rows
|
table1: rows
|
||||||
};
|
}
|
||||||
|
|
||||||
return data;
|
return data
|
||||||
};
|
}
|
||||||
|
|
||||||
const errorAndCsrfData: any = {
|
const errorAndCsrfData: any = {
|
||||||
error: [{ col1: "q", col2: "w", col3: "e", col4: "r" }],
|
error: [{ col1: 'q', col2: 'w', col3: 'e', col4: 'r' }],
|
||||||
_csrf: [{ col1: "q", col2: "w", col3: "e", col4: "r" }]
|
_csrf: [{ col1: 'q', col2: 'w', col3: 'e', col4: 'r' }]
|
||||||
};
|
}
|
||||||
|
|
||||||
export const specialCaseTests = (adapter: SASjs): TestSuite => ({
|
export const specialCaseTests = (adapter: SASjs): TestSuite => ({
|
||||||
name: "Special Cases",
|
name: 'Special Cases',
|
||||||
tests: [
|
tests: [
|
||||||
{
|
{
|
||||||
title: "Common special characters",
|
title: 'Common special characters',
|
||||||
description: "Should handle common special characters",
|
description: 'Should handle common special characters',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", specialCharData);
|
return adapter.request('common/sendArr', specialCharData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return (
|
return (
|
||||||
@@ -96,17 +97,18 @@ export const specialCaseTests = (adapter: SASjs): TestSuite => ({
|
|||||||
res.table1[0][4] === specialCharData.table1[0].percent &&
|
res.table1[0][4] === specialCharData.table1[0].percent &&
|
||||||
res.table1[0][5] === specialCharData.table1[0].singleQuote &&
|
res.table1[0][5] === specialCharData.table1[0].singleQuote &&
|
||||||
res.table1[0][6] === specialCharData.table1[0].doubleQuote &&
|
res.table1[0][6] === specialCharData.table1[0].doubleQuote &&
|
||||||
res.table1[0][7] === "\n" &&
|
res.table1[0][7] === '\n' &&
|
||||||
res.table1[0][8] === specialCharData.table1[0].euro &&
|
res.table1[0][8] === specialCharData.table1[0].euro &&
|
||||||
res.table1[0][9] === specialCharData.table1[0].banghash
|
res.table1[0][9] === specialCharData.table1[0].banghash &&
|
||||||
);
|
res.table1[0][10] === specialCharData.table1[0].dot
|
||||||
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Other special characters",
|
title: 'Other special characters',
|
||||||
description: "Should handle other special characters",
|
description: 'Should handle other special characters',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", moreSpecialCharData);
|
return adapter.request('common/sendArr', moreSpecialCharData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return (
|
return (
|
||||||
@@ -121,50 +123,50 @@ export const specialCaseTests = (adapter: SASjs): TestSuite => ({
|
|||||||
res.table1[0][8] === moreSpecialCharData.table1[0].at &&
|
res.table1[0][8] === moreSpecialCharData.table1[0].at &&
|
||||||
res.table1[0][9] === moreSpecialCharData.table1[0].serbian &&
|
res.table1[0][9] === moreSpecialCharData.table1[0].serbian &&
|
||||||
res.table1[0][10] === moreSpecialCharData.table1[0].dollar
|
res.table1[0][10] === moreSpecialCharData.table1[0].dollar
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Wide table with sendArr",
|
title: 'Wide table with sendArr',
|
||||||
description: "Should handle data with 10000 columns",
|
description: 'Should handle data with 10000 columns',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", getWideData());
|
return adapter.request('common/sendArr', getWideData())
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const data = getWideData();
|
const data = getWideData()
|
||||||
let result = true;
|
let result = true
|
||||||
for (let i = 0; i <= 10; i++) {
|
for (let i = 0; i <= 10; i++) {
|
||||||
result =
|
result =
|
||||||
result && res.table1[0][i] === data.table1[0]["col" + (i + 1)];
|
result && res.table1[0][i] === data.table1[0]['col' + (i + 1)]
|
||||||
}
|
}
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Wide table with sendObj",
|
title: 'Wide table with sendObj',
|
||||||
description: "Should handle data with 10000 columns",
|
description: 'Should handle data with 10000 columns',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", getWideData());
|
return adapter.request('common/sendObj', getWideData())
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const data = getWideData();
|
const data = getWideData()
|
||||||
let result = true;
|
let result = true
|
||||||
for (let i = 0; i <= 10; i++) {
|
for (let i = 0; i <= 10; i++) {
|
||||||
result =
|
result =
|
||||||
result &&
|
result &&
|
||||||
res.table1[0]["COL" + (i + 1)] === data.table1[0]["col" + (i + 1)];
|
res.table1[0]['COL' + (i + 1)] === data.table1[0]['col' + (i + 1)]
|
||||||
}
|
}
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Multiple tables",
|
title: 'Multiple tables',
|
||||||
description: "Should handle data with 100 tables",
|
description: 'Should handle data with 100 tables',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", getTables());
|
return adapter.request('common/sendArr', getTables())
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const data = getTables();
|
const data = getTables()
|
||||||
return (
|
return (
|
||||||
res.table1[0][0] === data.table1[0].col1 &&
|
res.table1[0][0] === data.table1[0].col1 &&
|
||||||
res.table1[0][1] === data.table1[0].col2 &&
|
res.table1[0][1] === data.table1[0].col2 &&
|
||||||
@@ -174,45 +176,45 @@ export const specialCaseTests = (adapter: SASjs): TestSuite => ({
|
|||||||
res.table50[0][1] === data.table50[0].col2 &&
|
res.table50[0][1] === data.table50[0].col2 &&
|
||||||
res.table50[0][2] === data.table50[0].col3 &&
|
res.table50[0][2] === data.table50[0].col3 &&
|
||||||
res.table50[0][3] === data.table50[0].col4
|
res.table50[0][3] === data.table50[0].col4
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Large dataset with sendObj",
|
title: 'Large dataset with sendObj',
|
||||||
description: "Should handle 5mb of data",
|
description: 'Should handle 5mb of data',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", getLargeDataset());
|
return adapter.request('common/sendObj', getLargeDataset())
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const data = getLargeDataset();
|
const data = getLargeDataset()
|
||||||
let result = true;
|
let result = true
|
||||||
for (let i = 0; i <= 10; i++) {
|
for (let i = 0; i <= 10; i++) {
|
||||||
result = result && res.table1[i][0] === data.table1[i][0];
|
result = result && res.table1[i][0] === data.table1[i][0]
|
||||||
}
|
}
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Large dataset with sendArr",
|
title: 'Large dataset with sendArr',
|
||||||
description: "Should handle 5mb of data",
|
description: 'Should handle 5mb of data',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", getLargeDataset());
|
return adapter.request('common/sendArr', getLargeDataset())
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
const data = getLargeDataset();
|
const data = getLargeDataset()
|
||||||
let result = true;
|
let result = true
|
||||||
for (let i = 0; i <= 10; i++) {
|
for (let i = 0; i <= 10; i++) {
|
||||||
result =
|
result =
|
||||||
result && res.table1[i][0] === Object.values(data.table1[i])[0];
|
result && res.table1[i][0] === Object.values(data.table1[i])[0]
|
||||||
}
|
}
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Error and _csrf tables with sendArr",
|
title: 'Error and _csrf tables with sendArr',
|
||||||
description: "Should handle error and _csrf tables",
|
description: 'Should handle error and _csrf tables',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendArr", errorAndCsrfData);
|
return adapter.request('common/sendArr', errorAndCsrfData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return (
|
return (
|
||||||
@@ -224,14 +226,14 @@ export const specialCaseTests = (adapter: SASjs): TestSuite => ({
|
|||||||
res._csrf[0][1] === errorAndCsrfData._csrf[0].col2 &&
|
res._csrf[0][1] === errorAndCsrfData._csrf[0].col2 &&
|
||||||
res._csrf[0][2] === errorAndCsrfData._csrf[0].col3 &&
|
res._csrf[0][2] === errorAndCsrfData._csrf[0].col3 &&
|
||||||
res._csrf[0][3] === errorAndCsrfData._csrf[0].col4
|
res._csrf[0][3] === errorAndCsrfData._csrf[0].col4
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Error and _csrf tables with sendObj",
|
title: 'Error and _csrf tables with sendObj',
|
||||||
description: "Should handle error and _csrf tables",
|
description: 'Should handle error and _csrf tables',
|
||||||
test: () => {
|
test: () => {
|
||||||
return adapter.request("common/sendObj", errorAndCsrfData);
|
return adapter.request('common/sendObj', errorAndCsrfData)
|
||||||
},
|
},
|
||||||
assertion: (res: any) => {
|
assertion: (res: any) => {
|
||||||
return (
|
return (
|
||||||
@@ -243,8 +245,8 @@ export const specialCaseTests = (adapter: SASjs): TestSuite => ({
|
|||||||
res._csrf[0].COL2 === errorAndCsrfData._csrf[0].col2 &&
|
res._csrf[0].COL2 === errorAndCsrfData._csrf[0].col2 &&
|
||||||
res._csrf[0].COL3 === errorAndCsrfData._csrf[0].col3 &&
|
res._csrf[0].COL3 === errorAndCsrfData._csrf[0].col3 &&
|
||||||
res._csrf[0].COL4 === errorAndCsrfData._csrf[0].col4
|
res._csrf[0].COL4 === errorAndCsrfData._csrf[0].col4
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
export const assert = (
|
export const assert = (
|
||||||
expression: boolean | (() => boolean),
|
expression: boolean | (() => boolean),
|
||||||
message = "Assertion failed"
|
message = 'Assertion failed'
|
||||||
) => {
|
) => {
|
||||||
let result;
|
let result
|
||||||
try {
|
try {
|
||||||
if (typeof expression === "boolean") {
|
if (typeof expression === 'boolean') {
|
||||||
result = expression;
|
result = expression
|
||||||
} else {
|
} else {
|
||||||
result = expression();
|
result = expression()
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(message);
|
console.error(message)
|
||||||
throw new Error(message);
|
throw new Error(message)
|
||||||
}
|
}
|
||||||
if (!!result) {
|
if (!!result) {
|
||||||
return;
|
return
|
||||||
} else {
|
} else {
|
||||||
console.error(message);
|
console.error(message)
|
||||||
throw new Error(message);
|
throw new Error(message)
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export const convertToCSV = (data: any) => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return `${field}:${firstFoundType === 'chars' ? '$' : ''}${
|
return `${field}:${firstFoundType === 'chars' ? '$char' : ''}${
|
||||||
longestValueForField
|
longestValueForField
|
||||||
? longestValueForField
|
? longestValueForField
|
||||||
: firstFoundType === 'chars'
|
: firstFoundType === 'chars'
|
||||||
|
|||||||
Reference in New Issue
Block a user