1
0
Fork 0
mirror of synced 2024-06-27 18:40:42 +12:00

Updating tests to use latest version of jest, which broke a lot of things, but was necessary to get proper ts-jest support.

This commit is contained in:
mike12345567 2021-06-25 13:46:02 +01:00
parent 6cae9cbdb8
commit 19da122425
41 changed files with 1736 additions and 1870 deletions

View file

@ -1,4 +1,4 @@
const elastic = {} const elastic: any = {}
elastic.Client = function () { elastic.Client = function () {
this.index = jest.fn().mockResolvedValue({ body: [] }) this.index = jest.fn().mockResolvedValue({ body: [] })

View file

@ -1,18 +0,0 @@
class Email {
constructor() {
this.apiKey = null
}
setApiKey(apiKey) {
this.apiKey = apiKey
}
async send(msg) {
if (msg.to === "invalid@test.com") {
throw "Invalid"
}
return msg
}
}
module.exports = new Email()

View file

@ -0,0 +1,22 @@
module SendgridMock {
class Email {
constructor() {
// @ts-ignore
this.apiKey = null
}
setApiKey(apiKey: any) {
// @ts-ignore
this.apiKey = apiKey
}
async send(msg: any) {
if (msg.to === "invalid@test.com") {
throw "Invalid"
}
return msg
}
}
module.exports = new Email()
}

View file

@ -1,5 +0,0 @@
function Airtable() {
this.base = jest.fn()
}
module.exports = Airtable

View file

@ -0,0 +1,8 @@
module AirtableMock {
function Airtable() {
// @ts-ignore
this.base = jest.fn()
}
module.exports = Airtable
}

View file

@ -1,21 +0,0 @@
const arangodb = {}
arangodb.Database = function () {
this.query = jest.fn(() => ({
all: jest.fn(),
}))
this.collection = jest.fn(() => "collection")
this.close = jest.fn()
}
arangodb.aql = (strings, ...args) => {
let str = strings.join("{}")
for (let arg of args) {
str = str.replace("{}", arg)
}
return str
}
module.exports = arangodb

View file

@ -0,0 +1,24 @@
module ArangoMock {
const arangodb: any = {}
arangodb.Database = function () {
this.query = jest.fn(() => ({
all: jest.fn(),
}))
this.collection = jest.fn(() => "collection")
this.close = jest.fn()
}
// @ts-ignore
arangodb.aql = (strings, ...args) => {
let str = strings.join("{}")
for (let arg of args) {
str = str.replace("{}", arg)
}
return str
}
module.exports = arangodb
}

View file

@ -1,38 +0,0 @@
const aws = {}
const response = body => () => ({ promise: () => body })
function DocumentClient() {
this.put = jest.fn(response({}))
this.query = jest.fn(
response({
Items: [],
})
)
this.scan = jest.fn(
response({
Items: [
{
Name: "test",
},
],
})
)
this.get = jest.fn(response({}))
this.update = jest.fn(response({}))
this.delete = jest.fn(response({}))
}
function S3() {
this.listObjects = jest.fn(
response({
Contents: {},
})
)
}
aws.DynamoDB = { DocumentClient }
aws.S3 = S3
aws.config = { update: jest.fn() }
module.exports = aws

View file

@ -0,0 +1,47 @@
module AwsMock {
const aws: any = {}
const response = (body: any) => () => ({promise: () => body})
function DocumentClient() {
// @ts-ignore
this.put = jest.fn(response({}))
// @ts-ignore
this.query = jest.fn(
response({
Items: [],
})
)
// @ts-ignore
this.scan = jest.fn(
response({
Items: [
{
Name: "test",
},
],
})
)
// @ts-ignore
this.get = jest.fn(response({}))
// @ts-ignore
this.update = jest.fn(response({}))
// @ts-ignore
this.delete = jest.fn(response({}))
}
function S3() {
// @ts-ignore
this.listObjects = jest.fn(
response({
Contents: {},
})
)
}
aws.DynamoDB = {DocumentClient}
aws.S3 = S3
aws.config = {update: jest.fn()}
module.exports = aws
}

View file

@ -1,19 +0,0 @@
const mongodb = {}
mongodb.MongoClient = function () {
this.connect = jest.fn()
this.close = jest.fn()
this.insertOne = jest.fn()
this.find = jest.fn(() => ({ toArray: () => [] }))
this.collection = jest.fn(() => ({
insertOne: this.insertOne,
find: this.find,
}))
this.db = () => ({
collection: this.collection,
})
}
module.exports = mongodb

View file

@ -0,0 +1,21 @@
module MongoMock {
const mongodb: any = {}
mongodb.MongoClient = function () {
this.connect = jest.fn()
this.close = jest.fn()
this.insertOne = jest.fn()
this.find = jest.fn(() => ({toArray: () => []}))
this.collection = jest.fn(() => ({
insertOne: this.insertOne,
find: this.find,
}))
this.db = () => ({
collection: this.collection,
})
}
module.exports = mongodb
}

View file

@ -1,22 +0,0 @@
const mssql = {}
mssql.query = jest.fn(() => ({
recordset: [
{
a: "string",
b: 1,
},
],
}))
// mssql.connect = jest.fn(() => ({ recordset: [] }))
mssql.ConnectionPool = jest.fn(() => ({
connect: jest.fn(() => ({
request: jest.fn(() => ({
query: jest.fn(() => ({})),
})),
})),
}))
module.exports = mssql

View file

@ -0,0 +1,24 @@
module MsSqlMock {
const mssql: any = {}
mssql.query = jest.fn(() => ({
recordset: [
{
a: "string",
b: 1,
},
],
}))
// mssql.connect = jest.fn(() => ({ recordset: [] }))
mssql.ConnectionPool = jest.fn(() => ({
connect: jest.fn(() => ({
request: jest.fn(() => ({
query: jest.fn(() => ({})),
})),
})),
}))
module.exports = mssql
}

View file

@ -1,12 +0,0 @@
const mysql = {}
const client = {
connect: jest.fn(),
query: jest.fn((query, bindings, fn) => {
fn(null, [])
}),
}
mysql.createConnection = jest.fn(() => client)
module.exports = mysql

View file

@ -0,0 +1,14 @@
module MySQLMock {
const mysql: any = {}
const client = {
connect: jest.fn(),
query: jest.fn((query, bindings, fn) => {
fn(null, [])
}),
}
mysql.createConnection = jest.fn(() => client)
module.exports = mysql
}

View file

@ -1,58 +0,0 @@
const fetch = jest.requireActual("node-fetch")
module.exports = async (url, opts) => {
function json(body, status = 200) {
return {
status,
headers: {
get: () => {
return ["application/json"]
},
},
json: async () => {
return body
},
}
}
if (url.includes("/api/admin")) {
return json({
email: "test@test.com",
_id: "us_test@test.com",
status: "active",
})
}
// mocked data based on url
else if (url.includes("api/apps")) {
return json({
app1: {
url: "/app1",
},
})
} else if (url.includes("test.com")) {
return json({
body: opts.body,
url,
method: opts.method,
})
} else if (url.includes("invalid.com")) {
return json(
{
invalid: true,
},
404
)
} else if (url.includes("_search")) {
return json({
rows: [
{
doc: {
_id: "test",
},
},
],
bookmark: "test",
})
}
return fetch(url, opts)
}

View file

@ -0,0 +1,60 @@
module FetchMock {
const fetch = jest.requireActual("node-fetch")
module.exports = async (url: any, opts: any) => {
function json(body: any, status = 200) {
return {
status,
headers: {
get: () => {
return ["application/json"]
},
},
json: async () => {
return body
},
}
}
if (url.includes("/api/admin")) {
return json({
email: "test@test.com",
_id: "us_test@test.com",
status: "active",
})
}
// mocked data based on url
else if (url.includes("api/apps")) {
return json({
app1: {
url: "/app1",
},
})
} else if (url.includes("test.com")) {
return json({
body: opts.body,
url,
method: opts.method,
})
} else if (url.includes("invalid.com")) {
return json(
{
invalid: true,
},
404
)
} else if (url.includes("_search")) {
return json({
rows: [
{
doc: {
_id: "test",
},
},
],
bookmark: "test",
})
}
return fetch(url, opts)
}
}

View file

@ -1,29 +0,0 @@
const pg = {}
const query = jest.fn(() => ({
rows: [
{
a: "string",
b: 1,
},
],
}))
// constructor
function Client() {}
Client.prototype.query = query
Client.prototype.connect = jest.fn()
Client.prototype.release = jest.fn()
function Pool() {}
Pool.prototype.query = query
Pool.prototype.connect = jest.fn(() => {
return new Client()
})
pg.Client = Client
pg.Pool = Pool
pg.queryMock = query
module.exports = pg

View file

@ -0,0 +1,35 @@
module PgMock {
const pg: any = {}
const query = jest.fn(() => ({
rows: [
{
a: "string",
b: 1,
},
],
}))
// constructor
function Client() {
}
Client.prototype.query = query
Client.prototype.connect = jest.fn()
Client.prototype.release = jest.fn()
function Pool() {
}
Pool.prototype.query = query
Pool.prototype.connect = jest.fn(() => {
// @ts-ignore
return new Client()
})
pg.Client = Client
pg.Pool = Pool
pg.queryMock = query
module.exports = pg
}

View file

@ -10,8 +10,7 @@
}, },
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
"test": "jest --testPathIgnorePatterns=routes && yarn run test:integration", "test": "jest --coverage --maxWorkers=2",
"test:integration": "jest --coverage --detectOpenHandles",
"test:watch": "jest --watch", "test:watch": "jest --watch",
"build:docker": "docker build . -t app-service", "build:docker": "docker build . -t app-service",
"run:docker": "node dist/src/index.js", "run:docker": "node dist/src/index.js",
@ -25,6 +24,7 @@
"initialise": "node scripts/initialise.js" "initialise": "node scripts/initialise.js"
}, },
"jest": { "jest": {
"preset": "ts-jest",
"testEnvironment": "node", "testEnvironment": "node",
"setupFiles": [ "setupFiles": [
"./scripts/jestSetup.js" "./scripts/jestSetup.js"
@ -116,6 +116,7 @@
"@budibase/standard-components": "^0.9.63", "@budibase/standard-components": "^0.9.63",
"@jest/test-sequencer": "^24.8.0", "@jest/test-sequencer": "^24.8.0",
"@types/bull": "^3.15.1", "@types/bull": "^3.15.1",
"@types/jest": "^26.0.23",
"@types/koa": "^2.13.3", "@types/koa": "^2.13.3",
"@types/koa-router": "^7.4.2", "@types/koa-router": "^7.4.2",
"@types/node": "^15.12.4", "@types/node": "^15.12.4",
@ -124,11 +125,12 @@
"docker-compose": "^0.23.6", "docker-compose": "^0.23.6",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"express": "^4.17.1", "express": "^4.17.1",
"jest": "^24.8.0", "jest": "^27.0.5",
"nodemon": "^2.0.4", "nodemon": "^2.0.4",
"pouchdb-adapter-memory": "^7.2.1", "pouchdb-adapter-memory": "^7.2.1",
"prettier": "^2.3.1", "prettier": "^2.3.1",
"supertest": "^4.0.2", "supertest": "^4.0.2",
"ts-jest": "^27.0.3",
"ts-node": "^10.0.0", "ts-node": "^10.0.0",
"typescript": "^4.3.4" "typescript": "^4.3.4"
}, },

View file

@ -1,7 +1,3 @@
const { clearAllApps, checkBuilderEndpoint } = require("./utilities/TestFunctions")
const setup = require("./utilities")
const { AppStatus } = require("../../../db/utils")
jest.mock("../../../utilities/redis", () => ({ jest.mock("../../../utilities/redis", () => ({
init: jest.fn(), init: jest.fn(),
getAllLocks: () => { getAllLocks: () => {
@ -15,6 +11,10 @@ jest.mock("../../../utilities/redis", () => ({
checkDebounce: jest.fn(), checkDebounce: jest.fn(),
})) }))
const { clearAllApps, checkBuilderEndpoint } = require("./utilities/TestFunctions")
const setup = require("./utilities")
const { AppStatus } = require("../../../db/utils")
describe("/applications", () => { describe("/applications", () => {
let request = setup.getRequest() let request = setup.getRequest()
let config = setup.getConfig() let config = setup.getConfig()

View file

@ -1,8 +1,8 @@
jest.mock("../../../utilities/fileSystem/utilities")
const { checkBuilderEndpoint } = require("./utilities/TestFunctions") const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
const setup = require("./utilities") const setup = require("./utilities")
jest.mock("../../../utilities/fileSystem/utilities")
describe("/backups", () => { describe("/backups", () => {
let request = setup.getRequest() let request = setup.getRequest()
let config = setup.getConfig() let config = setup.getConfig()

View file

@ -1,8 +1,8 @@
jest.mock("pg")
let setup = require("./utilities") let setup = require("./utilities")
let { basicDatasource } = setup.structures let { basicDatasource } = setup.structures
let { checkBuilderEndpoint } = require("./utilities/TestFunctions") let { checkBuilderEndpoint } = require("./utilities/TestFunctions")
jest.mock("pg")
const pg = require("pg") const pg = require("pg")
describe("/datasources", () => { describe("/datasources", () => {

View file

@ -1,18 +1,4 @@
require("../../environment")
const automation = require("../index")
const usageQuota = require("../../utilities/usageQuota")
const thread = require("../thread")
const triggers = require("../triggers")
const { basicAutomation, basicTable } = require("../../tests/utilities/structures")
const { wait } = require("../../utilities")
const { makePartial } = require("../../tests/utilities")
const { cleanInputValues } = require("../automationUtils")
const setup = require("./utilities")
let workerJob
jest.mock("../../utilities/usageQuota") jest.mock("../../utilities/usageQuota")
usageQuota.getAPIKey.mockReturnValue({ apiKey: "test" })
jest.mock("../thread") jest.mock("../thread")
jest.spyOn(global.console, "error") jest.spyOn(global.console, "error")
jest.mock("worker-farm", () => { jest.mock("worker-farm", () => {
@ -30,6 +16,21 @@ jest.mock("worker-farm", () => {
} }
}) })
require("../../environment")
const automation = require("../index")
const usageQuota = require("../../utilities/usageQuota")
const thread = require("../thread")
const triggers = require("../triggers")
const { basicAutomation, basicTable } = require("../../tests/utilities/structures")
const { wait } = require("../../utilities")
const { makePartial } = require("../../tests/utilities")
const { cleanInputValues } = require("../automationUtils")
const setup = require("./utilities")
let workerJob
usageQuota.getAPIKey.mockReturnValue({ apiKey: "test" })
describe("Run through some parts of the automations system", () => { describe("Run through some parts of the automations system", () => {
let config = setup.getConfig() let config = setup.getConfig()

View file

@ -1,9 +1,8 @@
const usageQuota = require("../../utilities/usageQuota")
const env = require("../../environment")
const setup = require("./utilities")
jest.mock("../../utilities/usageQuota") jest.mock("../../utilities/usageQuota")
const usageQuota = require("../../utilities/usageQuota")
const setup = require("./utilities")
describe("test the create row action", () => { describe("test the create row action", () => {
let table, row let table, row
let config = setup.getConfig() let config = setup.getConfig()

View file

@ -1,9 +1,8 @@
const usageQuota = require("../../utilities/usageQuota")
const env = require("../../environment")
const setup = require("./utilities")
jest.mock("../../utilities/usageQuota") jest.mock("../../utilities/usageQuota")
const usageQuota = require("../../utilities/usageQuota")
const setup = require("./utilities")
describe("test the delete row action", () => { describe("test the delete row action", () => {
let table, row, inputs let table, row, inputs
let config = setup.getConfig() let config = setup.getConfig()

View file

@ -97,6 +97,13 @@ export interface QueryJson {
} }
} }
export interface SqlQuery {
sql: string
bindings?: {
[key: string]: any
}
}
export interface QueryOptions { export interface QueryOptions {
disableReturning?: boolean disableReturning?: boolean
} }

View file

@ -139,11 +139,11 @@ function buildDelete(knex: Knex, json: QueryJson, opts: QueryOptions) {
} }
class SqlQueryBuilder { class SqlQueryBuilder {
private readonly client: any private readonly sqlClient: string
private readonly limit: number private readonly limit: number
// pass through client to get flavour of SQL // pass through client to get flavour of SQL
constructor(client: any, limit: number = BASE_LIMIT) { constructor(client: string, limit: number = BASE_LIMIT) {
this.client = client this.sqlClient = client
this.limit = limit this.limit = limit
} }
@ -162,7 +162,7 @@ class SqlQueryBuilder {
* @return {{ sql: string, bindings: object }} the query ready to be passed to the driver. * @return {{ sql: string, bindings: object }} the query ready to be passed to the driver.
*/ */
_query(json: QueryJson, opts: QueryOptions = {}) { _query(json: QueryJson, opts: QueryOptions = {}) {
const client = knex({ client: this.client }) const client = knex({ client: this.sqlClient })
let query let query
switch (this._operation(json)) { switch (this._operation(json)) {
case Operation.CREATE: case Operation.CREATE:

View file

@ -3,7 +3,9 @@ import {
DatasourceFieldTypes, DatasourceFieldTypes,
QueryTypes, QueryTypes,
QueryJson, QueryJson,
SqlQuery,
} from "./base/definitions" } from "./base/definitions"
import { getSqlQuery } from "./utils"
module MSSQLModule { module MSSQLModule {
const sqlServer = require("mssql") const sqlServer = require("mssql")
@ -67,10 +69,7 @@ module MSSQLModule {
}, },
} }
async function internalQuery( async function internalQuery(client: any, query: SqlQuery) {
client: any,
query: { sql: string; bindings?: object }
) {
try { try {
return await client.query(query.sql, query.bindings || {}) return await client.query(query.sql, query.bindings || {})
} catch (err) { } catch (err) {
@ -106,27 +105,27 @@ module MSSQLModule {
} }
} }
async read(query: string) { async read(query: SqlQuery | string) {
await this.connect() await this.connect()
const response = await internalQuery(this.client, { sql: query }) const response = await internalQuery(this.client, getSqlQuery(query))
return response.recordset return response.recordset
} }
async create(query: string) { async create(query: SqlQuery | string) {
await this.connect() await this.connect()
const response = await internalQuery(this.client, { sql: query }) const response = await internalQuery(this.client, getSqlQuery(query))
return response.recordset || [{ created: true }] return response.recordset || [{ created: true }]
} }
async update(query: string) { async update(query: SqlQuery | string) {
await this.connect() await this.connect()
const response = await internalQuery(this.client, { sql: query }) const response = await internalQuery(this.client, getSqlQuery(query))
return response.recordset || [{ updated: true }] return response.recordset || [{ updated: true }]
} }
async delete(query: string) { async delete(query: SqlQuery | string) {
await this.connect() await this.connect()
const response = await internalQuery(this.client, { sql: query }) const response = await internalQuery(this.client, getSqlQuery(query))
return response.recordset || [{ deleted: true }] return response.recordset || [{ deleted: true }]
} }

View file

@ -4,7 +4,9 @@ import {
QueryTypes, QueryTypes,
Operation, Operation,
QueryJson, QueryJson,
SqlQuery,
} from "./base/definitions" } from "./base/definitions"
import { getSqlQuery } from "./utils"
module MySQLModule { module MySQLModule {
const mysql = require("mysql") const mysql = require("mysql")
@ -98,7 +100,7 @@ module MySQLModule {
function internalQuery( function internalQuery(
client: any, client: any,
query: { sql: string; bindings?: object }, query: SqlQuery,
connect: boolean = true connect: boolean = true
): Promise<any[]> { ): Promise<any[]> {
// Node MySQL is callback based, so we must wrap our call in a promise // Node MySQL is callback based, so we must wrap our call in a promise
@ -190,22 +192,22 @@ module MySQLModule {
this.tables = tables this.tables = tables
} }
async create(query: string) { async create(query: SqlQuery | string) {
const results = await internalQuery(this.client, { sql: query }) const results = await internalQuery(this.client, getSqlQuery(query))
return results.length ? results : [{ created: true }] return results.length ? results : [{ created: true }]
} }
read(query: string) { read(query: SqlQuery | string) {
return internalQuery(this.client, { sql: query }) return internalQuery(this.client, getSqlQuery(query))
} }
async update(query: string) { async update(query: SqlQuery | string) {
const results = await internalQuery(this.client, { sql: query }) const results = await internalQuery(this.client, getSqlQuery(query))
return results.length ? results : [{ updated: true }] return results.length ? results : [{ updated: true }]
} }
async delete(query: string) { async delete(query: SqlQuery | string) {
const results = await internalQuery(this.client, { sql: query }) const results = await internalQuery(this.client, getSqlQuery(query))
return results.length ? results : [{ deleted: true }] return results.length ? results : [{ deleted: true }]
} }

View file

@ -3,8 +3,10 @@ import {
DatasourceFieldTypes, DatasourceFieldTypes,
QueryTypes, QueryTypes,
QueryJson, QueryJson,
SqlQuery,
} from "./base/definitions" } from "./base/definitions"
import { Table } from "../constants/definitions" import { Table } from "../constants/definitions"
import { getSqlQuery } from "./utils"
module PostgresModule { module PostgresModule {
const { Pool } = require("pg") const { Pool } = require("pg")
@ -88,10 +90,7 @@ module PostgresModule {
json: FieldTypes.JSON, json: FieldTypes.JSON,
} }
async function internalQuery( async function internalQuery(client: any, query: SqlQuery) {
client: any,
query: { sql: string; bindings?: object }
) {
try { try {
return await client.query(query.sql, query.bindings || {}) return await client.query(query.sql, query.bindings || {})
} catch (err) { } catch (err) {
@ -179,23 +178,23 @@ module PostgresModule {
this.tables = tables this.tables = tables
} }
async create(sql: string) { async create(query: SqlQuery | string) {
const response = await internalQuery(this.client, { sql }) const response = await internalQuery(this.client, getSqlQuery(query))
return response.rows.length ? response.rows : [{ created: true }] return response.rows.length ? response.rows : [{ created: true }]
} }
async read(sql: string) { async read(query: SqlQuery | string) {
const response = await internalQuery(this.client, { sql }) const response = await internalQuery(this.client, getSqlQuery(query))
return response.rows return response.rows
} }
async update(sql: string) { async update(query: SqlQuery | string) {
const response = await internalQuery(this.client, { sql }) const response = await internalQuery(this.client, getSqlQuery(query))
return response.rows.length ? response.rows : [{ updated: true }] return response.rows.length ? response.rows : [{ updated: true }]
} }
async delete(sql: string) { async delete(query: SqlQuery | string) {
const response = await internalQuery(this.client, { sql }) const response = await internalQuery(this.client, getSqlQuery(query))
return response.rows.length ? response.rows : [{ deleted: true }] return response.rows.length ? response.rows : [{ deleted: true }]
} }

View file

@ -1,5 +1,3 @@
const PouchDB = require("pouchdb")
const CouchDBIntegration = require("../couchdb")
jest.mock("pouchdb", () => function CouchDBMock() { jest.mock("pouchdb", () => function CouchDBMock() {
this.post = jest.fn() this.post = jest.fn()
this.allDocs = jest.fn(() => ({ rows: [] })) this.allDocs = jest.fn(() => ({ rows: [] }))
@ -8,6 +6,7 @@ jest.mock("pouchdb", () => function CouchDBMock() {
this.plugin = jest.fn() this.plugin = jest.fn()
}) })
const CouchDBIntegration = require("../couchdb")
class TestConfiguration { class TestConfiguration {
constructor(config = {}) { constructor(config = {}) {

View file

@ -20,7 +20,7 @@ describe("MS SQL Server Integration", () => {
const response = await config.integration.create({ const response = await config.integration.create({
sql sql
}) })
expect(config.integration.client.query).toHaveBeenCalledWith(sql, undefined) expect(config.integration.client.query).toHaveBeenCalledWith(sql, {})
}) })
it("calls the read method with the correct params", async () => { it("calls the read method with the correct params", async () => {
@ -28,7 +28,7 @@ describe("MS SQL Server Integration", () => {
const response = await config.integration.read({ const response = await config.integration.read({
sql sql
}) })
expect(config.integration.client.query).toHaveBeenCalledWith(sql, undefined) expect(config.integration.client.query).toHaveBeenCalledWith(sql, {})
}) })
describe("no rows returned", () => { describe("no rows returned", () => {

View file

@ -19,7 +19,7 @@ describe("MySQL Integration", () => {
await config.integration.create({ await config.integration.create({
sql sql
}) })
expect(config.integration.client.query).toHaveBeenCalledWith(sql, undefined, expect.any(Function)) expect(config.integration.client.query).toHaveBeenCalledWith(sql, {}, expect.any(Function))
}) })
it("calls the read method with the correct params", async () => { it("calls the read method with the correct params", async () => {
@ -27,7 +27,7 @@ describe("MySQL Integration", () => {
await config.integration.read({ await config.integration.read({
sql sql
}) })
expect(config.integration.client.query).toHaveBeenCalledWith(sql, undefined, expect.any(Function)) expect(config.integration.client.query).toHaveBeenCalledWith(sql, {}, expect.any(Function))
}) })
it("calls the update method with the correct params", async () => { it("calls the update method with the correct params", async () => {
@ -35,7 +35,7 @@ describe("MySQL Integration", () => {
await config.integration.update({ await config.integration.update({
sql sql
}) })
expect(config.integration.client.query).toHaveBeenCalledWith(sql, undefined, expect.any(Function)) expect(config.integration.client.query).toHaveBeenCalledWith(sql, {}, expect.any(Function))
}) })
it("calls the delete method with the correct params", async () => { it("calls the delete method with the correct params", async () => {
@ -43,7 +43,7 @@ describe("MySQL Integration", () => {
await config.integration.delete({ await config.integration.delete({
sql sql
}) })
expect(config.integration.client.query).toHaveBeenCalledWith(sql, undefined, expect.any(Function)) expect(config.integration.client.query).toHaveBeenCalledWith(sql, {}, expect.any(Function))
}) })
describe("no rows returned", () => { describe("no rows returned", () => {

View file

@ -20,7 +20,7 @@ describe("Postgres Integration", () => {
const response = await config.integration.create({ const response = await config.integration.create({
sql sql
}) })
expect(pg.queryMock).toHaveBeenCalledWith(sql, undefined) expect(pg.queryMock).toHaveBeenCalledWith(sql, {})
}) })
it("calls the read method with the correct params", async () => { it("calls the read method with the correct params", async () => {
@ -28,7 +28,7 @@ describe("Postgres Integration", () => {
const response = await config.integration.read({ const response = await config.integration.read({
sql sql
}) })
expect(pg.queryMock).toHaveBeenCalledWith(sql, undefined) expect(pg.queryMock).toHaveBeenCalledWith(sql, {})
}) })
it("calls the update method with the correct params", async () => { it("calls the update method with the correct params", async () => {
@ -36,7 +36,7 @@ describe("Postgres Integration", () => {
const response = await config.integration.update({ const response = await config.integration.update({
sql sql
}) })
expect(pg.queryMock).toHaveBeenCalledWith(sql, undefined) expect(pg.queryMock).toHaveBeenCalledWith(sql, {})
}) })
it("calls the delete method with the correct params", async () => { it("calls the delete method with the correct params", async () => {
@ -44,7 +44,7 @@ describe("Postgres Integration", () => {
await config.integration.delete({ await config.integration.delete({
sql sql
}) })
expect(pg.queryMock).toHaveBeenCalledWith(sql, undefined) expect(pg.queryMock).toHaveBeenCalledWith(sql, {})
}) })
describe("no rows returned", () => { describe("no rows returned", () => {

View file

@ -1,6 +1,6 @@
jest.mock("node-fetch", () => jest.fn(() => ({ json: jest.fn(), text: jest.fn() })))
const fetch = require("node-fetch") const fetch = require("node-fetch")
const RestIntegration = require("../rest") const RestIntegration = require("../rest")
jest.mock("node-fetch", () => jest.fn(() => ({ json: jest.fn(), text: jest.fn() })))
class TestConfiguration { class TestConfiguration {
constructor(config = {}) { constructor(config = {}) {

View file

@ -1,17 +1,18 @@
import { SqlQuery } from "./base/definitions"
const { DocumentTypes, SEPARATOR } = require("../db/utils") const { DocumentTypes, SEPARATOR } = require("../db/utils")
const { FieldTypes } = require("../constants") const { FieldTypes } = require("../constants")
const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}` const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`
exports.isExternalTable = tableId => { export function isExternalTable(tableId: string) {
return tableId.includes(DocumentTypes.DATASOURCE) return tableId.includes(DocumentTypes.DATASOURCE)
} }
exports.buildExternalTableId = (datasourceId, tableName) => { export function buildExternalTableId(datasourceId: string, tableName: string) {
return `${datasourceId}${DOUBLE_SEPARATOR}${tableName}` return `${datasourceId}${DOUBLE_SEPARATOR}${tableName}`
} }
exports.breakExternalTableId = tableId => { export function breakExternalTableId(tableId: string) {
const parts = tableId.split(DOUBLE_SEPARATOR) const parts = tableId.split(DOUBLE_SEPARATOR)
let tableName = parts.pop() let tableName = parts.pop()
// if they need joined // if they need joined
@ -19,7 +20,7 @@ exports.breakExternalTableId = tableId => {
return { datasourceId, tableName } return { datasourceId, tableName }
} }
exports.generateRowIdField = (keyProps = []) => { export function generateRowIdField(keyProps: any[] = []) {
if (!Array.isArray(keyProps)) { if (!Array.isArray(keyProps)) {
keyProps = [keyProps] keyProps = [keyProps]
} }
@ -28,14 +29,14 @@ exports.generateRowIdField = (keyProps = []) => {
} }
// should always return an array // should always return an array
exports.breakRowIdField = _id => { export function breakRowIdField(_id: string) {
if (!_id) { if (!_id) {
return null return null
} }
return JSON.parse(decodeURIComponent(_id)) return JSON.parse(decodeURIComponent(_id))
} }
exports.convertType = (type, map) => { export function convertType(type: string, map: { [key: string]: any }) {
for (let [external, internal] of Object.entries(map)) { for (let [external, internal] of Object.entries(map)) {
if (type.toLowerCase().includes(external)) { if (type.toLowerCase().includes(external)) {
return internal return internal
@ -43,3 +44,11 @@ exports.convertType = (type, map) => {
} }
return FieldTypes.STRING return FieldTypes.STRING
} }
export function getSqlQuery(query: SqlQuery | string): SqlQuery {
if (typeof query === "string") {
return { sql: query }
} else {
return query
}
}

View file

@ -1,6 +1,3 @@
const authorizedMiddleware = require("../authorized")
const env = require("../../environment")
const { PermissionTypes, PermissionLevels } = require("@budibase/auth/permissions")
jest.mock("../../environment", () => ({ jest.mock("../../environment", () => ({
prod: false, prod: false,
isTest: () => true, isTest: () => true,
@ -10,6 +7,9 @@ jest.mock("../../environment", () => ({
} }
}) })
) )
const authorizedMiddleware = require("../authorized")
const env = require("../../environment")
const { PermissionTypes, PermissionLevels } = require("@budibase/auth/permissions")
class TestConfiguration { class TestConfiguration {
constructor(role) { constructor(role) {
@ -77,17 +77,6 @@ describe("Authorization middleware", () => {
config = new TestConfiguration() config = new TestConfiguration()
}) })
describe("external web hook call", () => {
beforeEach(() => {
config = new TestConfiguration()
config.setEnvironment(true)
config.setRequestHeaders({
"x-api-key": "abc123",
"x-instanceid": "instance123",
})
})
})
describe("non-webhook call", () => { describe("non-webhook call", () => {
let config let config

View file

@ -1,8 +1,3 @@
const usageQuotaMiddleware = require("../usageQuota")
const usageQuota = require("../../utilities/usageQuota")
const CouchDB = require("../../db")
const env = require("../../environment")
jest.mock("../../db") jest.mock("../../db")
jest.mock("../../utilities/usageQuota") jest.mock("../../utilities/usageQuota")
jest.mock("../../environment", () => ({ jest.mock("../../environment", () => ({
@ -12,6 +7,11 @@ jest.mock("../../environment", () => ({
_set: () => {}, _set: () => {},
})) }))
const usageQuotaMiddleware = require("../usageQuota")
const usageQuota = require("../../utilities/usageQuota")
const CouchDB = require("../../db")
const env = require("../../environment")
class TestConfiguration { class TestConfiguration {
constructor() { constructor() {
this.throw = jest.fn() this.throw = jest.fn()

View file

@ -90,6 +90,9 @@ class TestConfiguration {
} }
end() { end() {
if (!this) {
return
}
if (this.server) { if (this.server) {
this.server.close() this.server.close()
} }

File diff suppressed because it is too large Load diff