add mule and @ts-ignore where needed
This commit is contained in:
Generated
+131
-2
@@ -25,6 +25,7 @@
|
|||||||
"express-rate-limit": "^8.1.0",
|
"express-rate-limit": "^8.1.0",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"mongoose": "^8.8.2",
|
"mongoose": "^8.8.2",
|
||||||
|
"multer": "^2.0.2",
|
||||||
"openweather-api-node": "^3.1.5",
|
"openweather-api-node": "^3.1.5",
|
||||||
"pm2": "^6.0.10",
|
"pm2": "^6.0.10",
|
||||||
"rimraf": "^5.0.5",
|
"rimraf": "^5.0.5",
|
||||||
@@ -34,6 +35,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cookie-parser": "^1.4.9",
|
"@types/cookie-parser": "^1.4.9",
|
||||||
"@types/cors": "^2.8.17",
|
"@types/cors": "^2.8.17",
|
||||||
|
"@types/multer": "^2.0.0",
|
||||||
"@types/supertest": "^6.0.3",
|
"@types/supertest": "^6.0.3",
|
||||||
"@vitest/coverage-v8": "^3.2.4",
|
"@vitest/coverage-v8": "^3.2.4",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
@@ -2891,6 +2893,16 @@
|
|||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/multer": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/express": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.19.17",
|
"version": "20.19.17",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -3213,6 +3225,12 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/append-field": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/aproba": {
|
"node_modules/aproba": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
@@ -3384,6 +3402,17 @@
|
|||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/busboy": {
|
||||||
|
"version": "1.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
|
||||||
|
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
|
||||||
|
"dependencies": {
|
||||||
|
"streamsearch": "^1.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.16.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/bytes": {
|
"node_modules/bytes": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -3547,6 +3576,21 @@
|
|||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/concat-stream": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
|
||||||
|
"engines": [
|
||||||
|
"node >= 6.0"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"buffer-from": "^1.0.0",
|
||||||
|
"inherits": "^2.0.3",
|
||||||
|
"readable-stream": "^3.0.2",
|
||||||
|
"typedarray": "^0.0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/console-control-strings": {
|
"node_modules/console-control-strings": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
@@ -4857,7 +4901,6 @@
|
|||||||
},
|
},
|
||||||
"node_modules/minimist": {
|
"node_modules/minimist": {
|
||||||
"version": "1.2.8",
|
"version": "1.2.8",
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@@ -4998,6 +5041,79 @@
|
|||||||
"version": "2.1.3",
|
"version": "2.1.3",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/multer": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"append-field": "^1.0.0",
|
||||||
|
"busboy": "^1.6.0",
|
||||||
|
"concat-stream": "^2.0.0",
|
||||||
|
"mkdirp": "^0.5.6",
|
||||||
|
"object-assign": "^4.1.1",
|
||||||
|
"type-is": "^1.6.18",
|
||||||
|
"xtend": "^4.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.16.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/multer/node_modules/media-typer": {
|
||||||
|
"version": "0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||||
|
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/multer/node_modules/mime-db": {
|
||||||
|
"version": "1.52.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||||
|
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/multer/node_modules/mime-types": {
|
||||||
|
"version": "2.1.35",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||||
|
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"mime-db": "1.52.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/multer/node_modules/mkdirp": {
|
||||||
|
"version": "0.5.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
|
||||||
|
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"minimist": "^1.2.6"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"mkdirp": "bin/cmd.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/multer/node_modules/type-is": {
|
||||||
|
"version": "1.6.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||||
|
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"media-typer": "0.3.0",
|
||||||
|
"mime-types": "~2.1.24"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/mute-stream": {
|
"node_modules/mute-stream": {
|
||||||
"version": "0.0.8",
|
"version": "0.0.8",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
@@ -5989,6 +6105,14 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/streamsearch": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/string_decoder": {
|
"node_modules/string_decoder": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -6498,6 +6622,12 @@
|
|||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/typedarray": {
|
||||||
|
"version": "0.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
||||||
|
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/typescript": {
|
"node_modules/typescript": {
|
||||||
"version": "5.9.2",
|
"version": "5.9.2",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
@@ -6951,7 +7081,6 @@
|
|||||||
},
|
},
|
||||||
"node_modules/xtend": {
|
"node_modules/xtend": {
|
||||||
"version": "4.0.2",
|
"version": "4.0.2",
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.4"
|
"node": ">=0.4"
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
"express-rate-limit": "^8.1.0",
|
"express-rate-limit": "^8.1.0",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"mongoose": "^8.8.2",
|
"mongoose": "^8.8.2",
|
||||||
|
"multer": "^2.0.2",
|
||||||
"openweather-api-node": "^3.1.5",
|
"openweather-api-node": "^3.1.5",
|
||||||
"pm2": "^6.0.10",
|
"pm2": "^6.0.10",
|
||||||
"rimraf": "^5.0.5",
|
"rimraf": "^5.0.5",
|
||||||
@@ -41,6 +42,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cookie-parser": "^1.4.9",
|
"@types/cookie-parser": "^1.4.9",
|
||||||
"@types/cors": "^2.8.17",
|
"@types/cors": "^2.8.17",
|
||||||
|
"@types/multer": "^2.0.0",
|
||||||
"@types/supertest": "^6.0.3",
|
"@types/supertest": "^6.0.3",
|
||||||
"@vitest/coverage-v8": "^3.2.4",
|
"@vitest/coverage-v8": "^3.2.4",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
|
|||||||
Vendored
-15
@@ -4,21 +4,6 @@ declare global {
|
|||||||
declare namespace Express {
|
declare namespace Express {
|
||||||
export interface Request {
|
export interface Request {
|
||||||
payload: DecodedToken;
|
payload: DecodedToken;
|
||||||
file?: Multer.File;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Multer {
|
|
||||||
export interface File {
|
|
||||||
fieldname: string;
|
|
||||||
originalname: string;
|
|
||||||
encoding: string;
|
|
||||||
mimetype: string;
|
|
||||||
size: number;
|
|
||||||
destination: string;
|
|
||||||
filename: string;
|
|
||||||
path: string;
|
|
||||||
buffer: Buffer;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import express from "express";
|
|||||||
import {RestAuth} from "../../src/rest/auth";
|
import {RestAuth} from "../../src/rest/auth";
|
||||||
import {JwtAuthenticator} from "../../src/utils/jwtAuthenticator";
|
import {JwtAuthenticator} from "../../src/utils/jwtAuthenticator";
|
||||||
import {PasswordUtils} from "../../src/utils/passwordUtils";
|
import {PasswordUtils} from "../../src/utils/passwordUtils";
|
||||||
|
// @ts-ignore
|
||||||
import {createMockJwtAuthenticator, createMockUserService, createPublicTestApp} from "../helpers/testSetup";
|
import {createMockJwtAuthenticator, createMockUserService, createPublicTestApp} from "../helpers/testSetup";
|
||||||
import crypto from "crypto";
|
import crypto from "crypto";
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { describe, it, expect } from "vitest";
|
|||||||
import request from "supertest";
|
import request from "supertest";
|
||||||
|
|
||||||
import { JwtTokenPropertiesExtractor } from "../../src/rest/jwtTokenPropertiesExtractor";
|
import { JwtTokenPropertiesExtractor } from "../../src/rest/jwtTokenPropertiesExtractor";
|
||||||
|
// @ts-ignore
|
||||||
import { createTestApp } from "../helpers/testSetup";
|
import { createTestApp } from "../helpers/testSetup";
|
||||||
|
|
||||||
describe("JwtTokenPropertiesExtractor", () => {
|
describe("JwtTokenPropertiesExtractor", () => {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { describe, it, expect, vi, beforeEach, afterEach, type Mocked } from "vi
|
|||||||
import { Request, Response, NextFunction } from "express";
|
import { Request, Response, NextFunction } from "express";
|
||||||
|
|
||||||
import { authenticateJwt } from "../../../src/rest/middleware/authenticateJwt";
|
import { authenticateJwt } from "../../../src/rest/middleware/authenticateJwt";
|
||||||
|
// @ts-ignore
|
||||||
import { createMockJwtAuthenticator } from "../../helpers/testSetup";
|
import { createMockJwtAuthenticator } from "../../helpers/testSetup";
|
||||||
|
|
||||||
vi.mock("../../../src/utils/jwtAuthenticator");
|
vi.mock("../../../src/utils/jwtAuthenticator");
|
||||||
@@ -43,6 +44,7 @@ describe("authenticateJwt middleware", () => {
|
|||||||
_authenticateJwt(req, res, next);
|
_authenticateJwt(req, res, next);
|
||||||
|
|
||||||
expect(mockJwtInstance.verifyToken).toHaveBeenCalledWith("valid-jwt-token");
|
expect(mockJwtInstance.verifyToken).toHaveBeenCalledWith("valid-jwt-token");
|
||||||
|
// @ts-ignore
|
||||||
expect(req.payload).toEqual(mockPayload);
|
expect(req.payload).toEqual(mockPayload);
|
||||||
expect(next).toHaveBeenCalledOnce();
|
expect(next).toHaveBeenCalledOnce();
|
||||||
expect(res.status).not.toHaveBeenCalled();
|
expect(res.status).not.toHaveBeenCalled();
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { describe, it, expect, vi, beforeEach, afterEach, type Mocked } from "vitest";
|
import { describe, it, expect, vi, beforeEach, afterEach, type Mocked } from "vitest";
|
||||||
import { Request, Response, NextFunction } from "express";
|
import { Request, Response, NextFunction } from "express";
|
||||||
import { isAdmin } from "../../../src/rest/middleware/isAdmin";
|
import { isAdmin } from "../../../src/rest/middleware/isAdmin";
|
||||||
|
// @ts-ignore
|
||||||
import { createMockUserService } from "../../helpers/testSetup";
|
import { createMockUserService } from "../../helpers/testSetup";
|
||||||
import { notFound } from "../../../src/rest/utils/responses";
|
import { notFound } from "../../../src/rest/utils/responses";
|
||||||
|
|
||||||
@@ -28,6 +29,7 @@ describe("isAdmin middleware", () => {
|
|||||||
mockedUserService = createMockUserService();
|
mockedUserService = createMockUserService();
|
||||||
|
|
||||||
req = {
|
req = {
|
||||||
|
// @ts-ignore
|
||||||
payload: { uuid, username: "username", id: ""}
|
payload: { uuid, username: "username", id: ""}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import {describe, it, expect, vi, beforeEach, afterEach} from "vitest";
|
|||||||
import request from "supertest";
|
import request from "supertest";
|
||||||
|
|
||||||
import {RestUser} from "../../src/rest/restUser";
|
import {RestUser} from "../../src/rest/restUser";
|
||||||
|
// @ts-ignore
|
||||||
import {createMockUserService, setupTestEnvironment, type TestEnvironment} from "../helpers/testSetup";
|
import {createMockUserService, setupTestEnvironment, type TestEnvironment} from "../helpers/testSetup";
|
||||||
|
|
||||||
vi.mock("../../src/services/db/UserService", () => ({
|
vi.mock("../../src/services/db/UserService", () => ({
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import request from "supertest";
|
|||||||
import express from "express";
|
import express from "express";
|
||||||
import { RestWebSocket } from "../../src/rest/restWebSocket";
|
import { RestWebSocket } from "../../src/rest/restWebSocket";
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
import { createTestApp, createMockWebSocketServer } from "../helpers/testSetup";
|
import { createTestApp, createMockWebSocketServer } from "../helpers/testSetup";
|
||||||
|
|
||||||
vi.mock("../../src/websocket", () => ({
|
vi.mock("../../src/websocket", () => ({
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import request from "supertest";
|
|||||||
import express from "express";
|
import express from "express";
|
||||||
|
|
||||||
import { SpotifyTokenGenerator } from "../../src/rest/spotifyTokenGenerator";
|
import { SpotifyTokenGenerator } from "../../src/rest/spotifyTokenGenerator";
|
||||||
|
// @ts-ignore
|
||||||
import { createTestApp, createMockSpotifyTokenService } from "../helpers/testSetup";
|
import { createTestApp, createMockSpotifyTokenService } from "../helpers/testSetup";
|
||||||
|
|
||||||
vi.mock("../../src/db/services/spotifyTokenService");
|
vi.mock("../../src/db/services/spotifyTokenService");
|
||||||
|
|||||||
@@ -4,11 +4,13 @@ import { Server } from "../src/server";
|
|||||||
import { Router, type Request, type Response, type NextFunction } from "express"; // Import Express types
|
import { Router, type Request, type Response, type NextFunction } from "express"; // Import Express types
|
||||||
import type { Express } from "express";
|
import type { Express } from "express";
|
||||||
import { authLimiter } from "../src/rest/middleware/rateLimit";
|
import { authLimiter } from "../src/rest/middleware/rateLimit";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
createMockJwtAuthenticator,
|
createMockJwtAuthenticator,
|
||||||
createMockSpotifyPollingService,
|
createMockSpotifyPollingService,
|
||||||
createMockSpotifyTokenService,
|
createMockSpotifyTokenService,
|
||||||
createMockUserService
|
createMockUserService
|
||||||
|
// @ts-ignore
|
||||||
} from "./helpers/testSetup";
|
} from "./helpers/testSetup";
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { SpotifyTokenService } from "../../src/services/spotifyTokenService";
|
|||||||
import { appEventBus, SPOTIFY_STATE_UPDATED_EVENT } from "../../src/utils/eventBus";
|
import { appEventBus, SPOTIFY_STATE_UPDATED_EVENT } from "../../src/utils/eventBus";
|
||||||
import { SpotifyPollingService } from "../../src/services/spotifyPollingService";
|
import { SpotifyPollingService } from "../../src/services/spotifyPollingService";
|
||||||
import { IUser } from "../../src/db/models/user";
|
import { IUser } from "../../src/db/models/user";
|
||||||
|
// @ts-ignore
|
||||||
import { createMockSpotifyApiService, createMockSpotifyTokenService, createMockUserService } from "../helpers/testSetup";
|
import { createMockSpotifyApiService, createMockSpotifyTokenService, createMockUserService } from "../helpers/testSetup";
|
||||||
|
|
||||||
vi.mock("../../src/services/db/UserService");
|
vi.mock("../../src/services/db/UserService");
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {GetStateEvent} from "../../../../src/utils/websocket/websocketCustomEven
|
|||||||
import {GetSettingsEvent} from "../../../../src/utils/websocket/websocketCustomEvents/getSettingsEvent";
|
import {GetSettingsEvent} from "../../../../src/utils/websocket/websocketCustomEvents/getSettingsEvent";
|
||||||
import {GetSpotifyUpdatesEvent} from "../../../../src/utils/websocket/websocketCustomEvents/getSpotifyUpdatesEvent";
|
import {GetSpotifyUpdatesEvent} from "../../../../src/utils/websocket/websocketCustomEvents/getSpotifyUpdatesEvent";
|
||||||
import {SpotifyPollingService} from "../../../../src/services/spotifyPollingService";
|
import {SpotifyPollingService} from "../../../../src/services/spotifyPollingService";
|
||||||
|
// @ts-ignore
|
||||||
import {createMockSpotifyPollingService,} from "../../../helpers/testSetup";
|
import {createMockSpotifyPollingService,} from "../../../helpers/testSetup";
|
||||||
import {StopSpotifyUpdatesEvent} from "../../../../src/utils/websocket/websocketCustomEvents/stopSpotifyUpdatesEvent";
|
import {StopSpotifyUpdatesEvent} from "../../../../src/utils/websocket/websocketCustomEvents/stopSpotifyUpdatesEvent";
|
||||||
import {GetWeatherUpdatesEvent
|
import {GetWeatherUpdatesEvent
|
||||||
|
|||||||
+27
-26
@@ -1,15 +1,16 @@
|
|||||||
import { describe, it, expect, vi, beforeEach, type Mocked } from "vitest";
|
import {describe, it, expect, vi, beforeEach, type Mocked} from "vitest";
|
||||||
import { Server } from "http";
|
import {Server} from "http";
|
||||||
import { WebSocket, Server as WebSocketServer } from "ws";
|
import {WebSocket, Server as WebSocketServer} from "ws";
|
||||||
import { ExtendedWebSocketServer } from "../src/websocket";
|
import {ExtendedWebSocketServer} from "../src/websocket";
|
||||||
import { WebsocketServerEventHandler } from "../src/utils/websocket/websocketServerEventHandler";
|
import {WebsocketServerEventHandler} from "../src/utils/websocket/websocketServerEventHandler";
|
||||||
import { WebsocketEventHandler } from "../src/utils/websocket/websocketEventHandler";
|
import {WebsocketEventHandler} from "../src/utils/websocket/websocketEventHandler";
|
||||||
import { getEventListeners } from "../src/utils/websocket/websocketCustomEvents/websocketEventUtils";
|
import {getEventListeners} from "../src/utils/websocket/websocketCustomEvents/websocketEventUtils";
|
||||||
import { createMockUserService} from "./helpers/testSetup";
|
// @ts-ignore
|
||||||
|
import {createMockJwtAuthenticator, createMockUserService} from "./helpers/testSetup";
|
||||||
import {UserService} from "../src/services/db/UserService";
|
import {UserService} from "../src/services/db/UserService";
|
||||||
import {SpotifyPollingService} from "../src/services/spotifyPollingService";
|
import {SpotifyPollingService} from "../src/services/spotifyPollingService";
|
||||||
import { USER_UPDATED_EVENT, SPOTIFY_STATE_UPDATED_EVENT } from "../src/utils/eventBus";
|
import {USER_UPDATED_EVENT, SPOTIFY_STATE_UPDATED_EVENT} from "../src/utils/eventBus";
|
||||||
import { WebsocketEventType } from "../src/utils/websocket/websocketCustomEvents/websocketEventType";
|
import {WebsocketEventType} from "../src/utils/websocket/websocketCustomEvents/websocketEventType";
|
||||||
import {WeatherPollingService} from "../src/services/weatherPollingService";
|
import {WeatherPollingService} from "../src/services/weatherPollingService";
|
||||||
|
|
||||||
let mockWssInstance: Mocked<WebSocketServer>;
|
let mockWssInstance: Mocked<WebSocketServer>;
|
||||||
@@ -31,7 +32,7 @@ vi.mock("../src/utils/eventBus", () => ({
|
|||||||
|
|
||||||
vi.mock("ws", () => ({
|
vi.mock("ws", () => ({
|
||||||
Server: vi.fn().mockImplementation(() => mockWssInstance),
|
Server: vi.fn().mockImplementation(() => mockWssInstance),
|
||||||
WebSocket: { OPEN: 1, CLOSED: 3 },
|
WebSocket: {OPEN: 1, CLOSED: 3},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
vi.mock("../src/utils/verifyClient");
|
vi.mock("../src/utils/verifyClient");
|
||||||
@@ -70,7 +71,7 @@ describe("ExtendedWebSocketServer", () => {
|
|||||||
|
|
||||||
mockUserService = createMockUserService();
|
mockUserService = createMockUserService();
|
||||||
|
|
||||||
extendedWss = new ExtendedWebSocketServer(mockHttpServer, mockUserService, mockSpotifyPollingService, mockWeatherPollingService);
|
extendedWss = new ExtendedWebSocketServer(mockHttpServer, mockUserService, mockSpotifyPollingService, mockWeatherPollingService, createMockJwtAuthenticator() as any);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Constructor and Setup", () => {
|
describe("Constructor and Setup", () => {
|
||||||
@@ -96,22 +97,22 @@ describe("ExtendedWebSocketServer", () => {
|
|||||||
|
|
||||||
describe("broadcast", () => {
|
describe("broadcast", () => {
|
||||||
it("should send a message to all connected clients that are OPEN", () => {
|
it("should send a message to all connected clients that are OPEN", () => {
|
||||||
const client1 = { readyState: WebSocket.OPEN, send: vi.fn() };
|
const client1 = {readyState: WebSocket.OPEN, send: vi.fn()};
|
||||||
const client2 = { readyState: WebSocket.CLOSED, send: vi.fn() };
|
const client2 = {readyState: WebSocket.CLOSED, send: vi.fn()};
|
||||||
mockWssInstance.clients.add(client1 as any).add(client2 as any);
|
mockWssInstance.clients.add(client1 as any).add(client2 as any);
|
||||||
extendedWss.broadcast("hello");
|
extendedWss.broadcast("hello");
|
||||||
expect(client1.send).toHaveBeenCalledWith("hello", { binary: false });
|
expect(client1.send).toHaveBeenCalledWith("hello", {binary: false});
|
||||||
expect(client2.send).not.toHaveBeenCalled();
|
expect(client2.send).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("sendMessageToUser", () => {
|
describe("sendMessageToUser", () => {
|
||||||
it("should send a message to a specific user by their UUID", () => {
|
it("should send a message to a specific user by their UUID", () => {
|
||||||
const client1 = { readyState: WebSocket.OPEN, payload: { uuid: "uuid-1" }, send: vi.fn() };
|
const client1 = {readyState: WebSocket.OPEN, payload: {uuid: "uuid-1"}, send: vi.fn()};
|
||||||
const client2 = { readyState: WebSocket.OPEN, payload: { uuid: "uuid-2" }, send: vi.fn() };
|
const client2 = {readyState: WebSocket.OPEN, payload: {uuid: "uuid-2"}, send: vi.fn()};
|
||||||
mockWssInstance.clients.add(client1 as any).add(client2 as any);
|
mockWssInstance.clients.add(client1 as any).add(client2 as any);
|
||||||
extendedWss.sendMessageToUser("uuid-1", "private");
|
extendedWss.sendMessageToUser("uuid-1", "private");
|
||||||
expect(client1.send).toHaveBeenCalledWith("private", { binary: false });
|
expect(client1.send).toHaveBeenCalledWith("private", {binary: false});
|
||||||
expect(client2.send).not.toHaveBeenCalled();
|
expect(client2.send).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -124,7 +125,7 @@ describe("ExtendedWebSocketServer", () => {
|
|||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
connectionHandler = vi.mocked(mockServerEventHandler.enableConnectionEvent).mock.calls[0][0];
|
connectionHandler = vi.mocked(mockServerEventHandler.enableConnectionEvent).mock.calls[0][0];
|
||||||
mockWsClient = {
|
mockWsClient = {
|
||||||
emit: vi.fn(), on: vi.fn(), user: { lastState: { global: { mode: "idle" } } },
|
emit: vi.fn(), on: vi.fn(), user: {lastState: {global: {mode: "idle"}}},
|
||||||
};
|
};
|
||||||
mockClientEventHandler = {
|
mockClientEventHandler = {
|
||||||
enableErrorEvent: vi.fn(),
|
enableErrorEvent: vi.fn(),
|
||||||
@@ -135,7 +136,7 @@ describe("ExtendedWebSocketServer", () => {
|
|||||||
} as unknown as Mocked<WebsocketEventHandler>;
|
} as unknown as Mocked<WebsocketEventHandler>;
|
||||||
|
|
||||||
vi.mocked(WebsocketEventHandler).mockImplementation(() => mockClientEventHandler);
|
vi.mocked(WebsocketEventHandler).mockImplementation(() => mockClientEventHandler);
|
||||||
vi.mocked(getEventListeners).mockReturnValue([{ event: "custom", handler: vi.fn() } as any]);
|
vi.mocked(getEventListeners).mockReturnValue([{event: "custom", handler: vi.fn()} as any]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should create and configure a WebsocketEventHandler for new clients", () => {
|
it("should create and configure a WebsocketEventHandler for new clients", () => {
|
||||||
@@ -161,7 +162,7 @@ describe("ExtendedWebSocketServer", () => {
|
|||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mockClient = {
|
mockClient = {
|
||||||
readyState: WebSocket.OPEN,
|
readyState: WebSocket.OPEN,
|
||||||
payload: { uuid: "user-123" },
|
payload: {uuid: "user-123"},
|
||||||
send: vi.fn(),
|
send: vi.fn(),
|
||||||
emit: vi.fn(),
|
emit: vi.fn(),
|
||||||
};
|
};
|
||||||
@@ -172,7 +173,7 @@ describe("ExtendedWebSocketServer", () => {
|
|||||||
const userUpdateListener = eventBusListeners.get(USER_UPDATED_EVENT);
|
const userUpdateListener = eventBusListeners.get(USER_UPDATED_EVENT);
|
||||||
expect(userUpdateListener).toBeDefined();
|
expect(userUpdateListener).toBeDefined();
|
||||||
|
|
||||||
const updatedUserPayload = { uuid: "user-123", name: "Neuer Name" };
|
const updatedUserPayload = {uuid: "user-123", name: "Neuer Name"};
|
||||||
|
|
||||||
userUpdateListener!(updatedUserPayload);
|
userUpdateListener!(updatedUserPayload);
|
||||||
|
|
||||||
@@ -187,8 +188,8 @@ describe("ExtendedWebSocketServer", () => {
|
|||||||
const spotifyStateListener = eventBusListeners.get(SPOTIFY_STATE_UPDATED_EVENT);
|
const spotifyStateListener = eventBusListeners.get(SPOTIFY_STATE_UPDATED_EVENT);
|
||||||
expect(spotifyStateListener).toBeDefined();
|
expect(spotifyStateListener).toBeDefined();
|
||||||
|
|
||||||
const spotifyUpdatePayload = { state: { item: { name: "Neuer Song" } } };
|
const spotifyUpdatePayload = {state: {item: {name: "Neuer Song"}}};
|
||||||
const eventPayload = { uuid: "user-123", ...spotifyUpdatePayload };
|
const eventPayload = {uuid: "user-123", ...spotifyUpdatePayload};
|
||||||
|
|
||||||
spotifyStateListener!(eventPayload);
|
spotifyStateListener!(eventPayload);
|
||||||
|
|
||||||
@@ -197,14 +198,14 @@ describe("ExtendedWebSocketServer", () => {
|
|||||||
type: "SPOTIFY_UPDATE",
|
type: "SPOTIFY_UPDATE",
|
||||||
payload: spotifyUpdatePayload.state,
|
payload: spotifyUpdatePayload.state,
|
||||||
});
|
});
|
||||||
expect(mockClient.send).toHaveBeenCalledWith(expectedMessage, { binary: false });
|
expect(mockClient.send).toHaveBeenCalledWith(expectedMessage, {binary: false});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not send a message if the target client is not connected", () => {
|
it("should not send a message if the target client is not connected", () => {
|
||||||
const userUpdateListener = eventBusListeners.get(USER_UPDATED_EVENT);
|
const userUpdateListener = eventBusListeners.get(USER_UPDATED_EVENT);
|
||||||
const spotifyStateListener = eventBusListeners.get(SPOTIFY_STATE_UPDATED_EVENT);
|
const spotifyStateListener = eventBusListeners.get(SPOTIFY_STATE_UPDATED_EVENT);
|
||||||
|
|
||||||
const eventPayload = { uuid: "user-unknown", name: "some data" };
|
const eventPayload = {uuid: "user-unknown", name: "some data"};
|
||||||
|
|
||||||
userUpdateListener!(eventPayload);
|
userUpdateListener!(eventPayload);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user