From 707cd8b12bc17797ce39305946933cfc78466a4b Mon Sep 17 00:00:00 2001 From: Izel Nakri Date: Fri, 31 Jan 2020 02:34:53 +0100 Subject: [PATCH] MemServer server tests --- package-lock.json | 6 ++-- package.json | 5 ++++ src/cli.ts | 30 +++++++++---------- src/model.ts | 18 ++++++----- src/server.ts | 12 ++++++-- src/setup-dom.ts | 15 ++++++++++ .../server/{config.ts => configuration.ts} | 14 ++++----- tsconfig.json | 13 ++++---- 8 files changed, 71 insertions(+), 42 deletions(-) rename src/test/server/{config.ts => configuration.ts} (96%) diff --git a/package-lock.json b/package-lock.json index e78c45f..be17c4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1827,9 +1827,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.0.tgz", - "integrity": "sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.3.tgz", + "integrity": "sha512-ZPnWX9PW992w6DUsz3JIXHaSb5v7qmKCVzC3km6SxcDGxk7zmLfYaCJTbktIa5NeywJkkZDhGldKqDIvC5DRrA==", "dev": true }, "@types/normalize-package-data": { diff --git a/package.json b/package.json index e02574a..341e589 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@ava/typescript": "^1.0.0", "@types/fs-extra": "^8.0.1", "@types/jquery": "^3.3.31", + "@types/node": "^13.5.3", "ava": "3.1.0", "cors": "^2.8.5", "express": "^4.17.1", @@ -45,9 +46,13 @@ "typescript": "^3.7.5" }, "ava": { + "files": [ + "src/test/**/*" + ], "extensions": [ "ts" ], + "cache": false, "require": [ "ts-node/register" ], diff --git a/src/cli.ts b/src/cli.ts index 0cc3a8f..8589fb5 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -205,22 +205,20 @@ async function createFixtureAndModelFoldersIfNeeded(memServerDirectory) { } async function openConsole() { - if (process.cwd().includes("memserver")) { - throw new Error( - chalk.red( - "[MemServer CLI] You are in the memserver directory, go to the root of your project to start memserver console." - ) - ); - } - - const MemServer = (await import("./index")).default; - const repl = (await import("repl")).default; - - console.log( - chalk.cyan("[MemServer CLI]"), - "Starting MemServer node.js console - Remember to MemServer.start() ;)" - ); - repl.start("> "); + // if (process.cwd().includes("memserver")) { + // throw new Error( + // chalk.red( + // "[MemServer CLI] You are in the memserver directory, go to the root of your project to start memserver console." + // ) + // ); + // } + // const MemServer = (await import("./index")).default; + // const repl = (await import("repl")).default; + // console.log( + // chalk.cyan("[MemServer CLI]"), + // "Starting MemServer node.js console - Remember to MemServer.start() ;)" + // ); + // repl.start("> "); } async function getMemServerDirectory() { diff --git a/src/model.ts b/src/model.ts index 436369c..154cde0 100644 --- a/src/model.ts +++ b/src/model.ts @@ -1,18 +1,22 @@ import util from "util"; import chalk from "ansi-colors"; import Inflector from "i"; -import emberCliStringUtils from "ember-cli-string-utils"; +import { classify, underscore } from "ember-cli-string-utils"; import { primaryKeyTypeSafetyCheck, generateUUID } from "./utils"; -const { classify, underscore } = emberCliStringUtils; const { singularize, pluralize } = Inflector(); -interface InternalMemServerModel { +type RequireOnlyOne = Pick> & + { + [K in Keys]-?: Required> & Partial, undefined>>; + }[Keys]; + +interface PrimaryKeys { id?: number; uuid?: string; } -type returnValue = InternalMemServerModel | Array | undefined; +type InternalMemServerModel = RequireOnlyOne; // NOTE: probably needs .reset() method; export default abstract class MemServerModel { @@ -110,8 +114,8 @@ export default abstract class MemServerModel { return this.DB.find((model) => comparison(model, options, keys, 0)); } - static findAll(options = {}): Array { - const models: Array = Array.from(this.DB); + static findAll(options = {}): Array { + const models: Array = Array.from(this.DB); const keys = Object.keys(options); if (keys.length === 0) { @@ -120,7 +124,7 @@ export default abstract class MemServerModel { return models.filter((model) => comparison(model, options, keys, 0)); } - static insert(options: InternalMemServerModel | undefined): object { + static insert(options: InternalMemServerModel | undefined): InternalMemServerModel { const models = this.DB; if (models.length === 0) { diff --git a/src/server.ts b/src/server.ts index 99fa72e..1990dc3 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,3 +1,11 @@ +declare global { + interface Window { + Pretender: any; + RouteRecognizer: any; + FakeXMLHttpRequest: any; + } +} + import chalk from "ansi-colors"; import { primaryKeyTypeSafetyCheck } from "./utils"; import FakeXMLHttpRequest from "fake-xml-http-request"; @@ -15,7 +23,7 @@ window.RouteRecognizer = RouteRecognizer; // MemServer.{"Server", "shutdown"} export default class MemServer { - constructor(options = {}) { + constructor(options = { logging: true, initializer: () => {}, routes: () => {} }) { const initializer = options.initializer || function() {}; // fixtures could be loaded here const routes = options.routes || function() {}; const logging = options.hasOwnProperty("logging") ? options.logging : true; @@ -53,7 +61,7 @@ function startPretender(routes, options) { } this.unhandledRequest = function(verb, path, request) { - console.log(MemServer, chalk.red("[UNHANDLED REQUEST]", verb, path)); + console.log(MemServer, chalk.red("[UNHANDLED REQUEST]"), verb, path); console.log(chalk.red("UNHANDLED REQUEST WAS:\n"), request); console.log(request); }; diff --git a/src/setup-dom.ts b/src/setup-dom.ts index f664838..8d1ab3e 100644 --- a/src/setup-dom.ts +++ b/src/setup-dom.ts @@ -1,3 +1,18 @@ +declare global { + interface Window { + $?: any; + } + + namespace NodeJS { + interface Global { + window?: any; + document?: any; + self: any; + $?: any; + } + } +} + export default async function() { const { JSDOM } = (await import("jsdom")).default; diff --git a/src/test/server/config.ts b/src/test/server/configuration.ts similarity index 96% rename from src/test/server/config.ts rename to src/test/server/configuration.ts index a12ae59..6d1e5c0 100644 --- a/src/test/server/config.ts +++ b/src/test/server/configuration.ts @@ -25,6 +25,7 @@ test.before(async () => { return 'Some default name'; } } + } ` ), @@ -125,18 +126,15 @@ test.serial( import Photo from '${CWD}/memserver/models/photo'; import Response from '../dist/response'; - // console.log('Photo is', Photo); - export default function() { this.get('/photos', () => { - // const photos = Photo.findAll(); + const photos = Photo.findAll(); - // if (!photos || photos.length === 0) { - // return Response(404, { error: 'Not found' }); - // } + if (!photos || photos.length === 0) { + return Response(404, { error: 'Not found' }); + } - // return { photos: Photo.serializer(photos) }; - return { photos: [] }; + return { photos: Photo.serializer(photos) }; }); } ` diff --git a/tsconfig.json b/tsconfig.json index ad63355..3bdae45 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,19 @@ { "compilerOptions": { /* Basic Options */ - "incremental": true, /* Enable incremental compilation */ + "incremental": false, /* Enable incremental compilation */ "target": "ES2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ // "lib": [], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + //"declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + //"sourceMap": true, /* Generates corresponding '.map' file. */ //"outFile": "./index.js", /* Concatenate and emit output to single file. */ "outDir": "./dist", /* Redirect output structure to the directory. */ - //"rootDir": "./src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ // "removeComments": true, /* Do not emit comments to output. */ @@ -65,6 +65,7 @@ }, "exclude": [ "memserver-boilerplate", - "memserver" + "memserver", + "dist" ] }