From 18567cfc1645ba909397eb00d113e10a3596e267 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Tue, 10 Sep 2024 14:29:14 +0200 Subject: [PATCH 01/16] Add JobAction.validate method. This partially reverts commit b218952495b36d836c155e0ec0e7af9e3baf0832. - Tightened bounds on DtoType for JobAction - Validate DTOs --- src/jobs/actions/emailaction.ts | 5 ++-- src/jobs/actions/logaction.ts | 8 ++++-- src/jobs/actions/rabbitmqaction.ts | 4 +-- src/jobs/actions/urlaction.ts | 17 +++-------- src/jobs/config/jobconfig.spec.ts | 1 - src/jobs/config/jobconfig.ts | 24 ++++++++++++---- .../interceptors/job-create.interceptor.ts | 28 ++++++------------- src/jobs/jobs.controller.ts | 26 +++++++++++++++-- 8 files changed, 65 insertions(+), 48 deletions(-) diff --git a/src/jobs/actions/emailaction.ts b/src/jobs/actions/emailaction.ts index 6ac6fa8f7..dd17a0478 100644 --- a/src/jobs/actions/emailaction.ts +++ b/src/jobs/actions/emailaction.ts @@ -7,9 +7,8 @@ import { readFileSync } from "fs"; import { compile, TemplateDelegate } from "handlebars"; import { createTransport, Transporter } from "nodemailer"; import { Logger, NotFoundException } from "@nestjs/common"; -import { JobAction } from "../config/jobconfig"; +import { JobAction, JobDto } from "../config/jobconfig"; import { JobClass } from "../schemas/job.schema"; -import configuration from "src/config/configuration"; // Handlebar options for JobClass templates const jobTemplateOptions = { @@ -40,7 +39,7 @@ type Auth = { /** * Send an email following a job */ -export class EmailJobAction implements JobAction { +export class EmailJobAction implements JobAction { public static readonly actionType = "email"; private mailService: Transporter; diff --git a/src/jobs/actions/logaction.ts b/src/jobs/actions/logaction.ts index 2a7d870da..f3199e9d6 100644 --- a/src/jobs/actions/logaction.ts +++ b/src/jobs/actions/logaction.ts @@ -4,16 +4,20 @@ * */ import { Logger } from "@nestjs/common"; -import { JobAction } from "../config/jobconfig"; +import { JobAction, JobDto } from "../config/jobconfig"; import { JobClass } from "../schemas/job.schema"; -export class LogJobAction implements JobAction { +export class LogJobAction implements JobAction { public static readonly actionType = "log"; getActionType(): string { return LogJobAction.actionType; } + async validate(dto: T) { + Logger.log("Validating job dto: " + JSON.stringify(dto), "LogJobAction"); + } + async performJob(job: JobClass) { Logger.log("Performing job: " + JSON.stringify(job), "LogJobAction"); } diff --git a/src/jobs/actions/rabbitmqaction.ts b/src/jobs/actions/rabbitmqaction.ts index b7c0cbe81..1e61fa5b9 100644 --- a/src/jobs/actions/rabbitmqaction.ts +++ b/src/jobs/actions/rabbitmqaction.ts @@ -1,12 +1,12 @@ import { Logger, NotFoundException } from "@nestjs/common"; import amqp, { Connection } from "amqplib/callback_api"; -import { JobAction } from "../config/jobconfig"; +import { JobAction, JobDto } from "../config/jobconfig"; import { JobClass } from "../schemas/job.schema"; /** * Publish a message in a RabbitMQ queue */ -export class RabbitMQJobAction implements JobAction { +export class RabbitMQJobAction implements JobAction { public static readonly actionType = "rabbitmq"; private connection; private binding; diff --git a/src/jobs/actions/urlaction.ts b/src/jobs/actions/urlaction.ts index 3216fa4bf..5c4db27c4 100644 --- a/src/jobs/actions/urlaction.ts +++ b/src/jobs/actions/urlaction.ts @@ -1,5 +1,5 @@ import { Logger, NotFoundException, HttpException } from "@nestjs/common"; -import { JobAction } from "../config/jobconfig"; +import { JobAction, JobDto } from "../config/jobconfig"; import { JobClass } from "../schemas/job.schema"; import * as Handlebars from "handlebars"; @@ -37,7 +37,7 @@ function isStringRecord(obj: any): obj is Record { /** * Respond to Job events by making an HTTP call. */ -export class URLAction implements JobAction { +export class URLAction implements JobAction { public static readonly actionType = "url"; private urlTemplate: Handlebars.TemplateDelegate; @@ -54,7 +54,7 @@ export class URLAction implements JobAction { async performJob(job: JobClass) { const url = encodeURI(this.urlTemplate(job, jobTemplateOptions)); - Logger.log(`Requesting ${url}`, "UrlJobAction"); + Logger.log(`Requesting ${url}`, "URLAction"); const response = await fetch(url, { method: this.method, @@ -71,11 +71,7 @@ export class URLAction implements JobAction { : undefined, }); - Logger.log( - `Request for ${url} returned ${response.status}`, - "UrlJobAction", - ); - + Logger.log(`Request for ${url} returned ${response.status}`, "URLAction"); if (!response.ok) { throw new HttpException( { @@ -102,11 +98,6 @@ export class URLAction implements JobAction { */ // eslint-disable-next-line @typescript-eslint/no-explicit-any constructor(data: Record) { - Logger.log( - "Initializing UrlJobAction. Params: " + JSON.stringify(data), - "UrlJobAction", - ); - if (!data["url"]) { throw new NotFoundException("Param 'url' is undefined in url action"); } diff --git a/src/jobs/config/jobconfig.spec.ts b/src/jobs/config/jobconfig.spec.ts index 630bdab1d..6e8cd3a74 100644 --- a/src/jobs/config/jobconfig.spec.ts +++ b/src/jobs/config/jobconfig.spec.ts @@ -22,6 +22,5 @@ describe("Job configuration", () => { const action = create.actions[0]; expect(action instanceof LogJobAction); expect(action.getActionType()).toBe("log"); - // action.validate({ config: null }); }); }); diff --git a/src/jobs/config/jobconfig.ts b/src/jobs/config/jobconfig.ts index 72ee19cc1..6129c1480 100644 --- a/src/jobs/config/jobconfig.ts +++ b/src/jobs/config/jobconfig.ts @@ -23,6 +23,8 @@ import { CreateJobAuth, JobsAuth } from "../types/jobs-auth.enum"; import Ajv from "ajv"; import { JobConfigSchema } from "./jobConfig.schema"; +export type JobDto = CreateJobDto | StatusUpdateJobDto; + /** * Encapsulates all responses to a particular job type (eg "archive") */ @@ -84,7 +86,7 @@ export class JobConfig { /** * Encapsulates all information for a particular job operation (eg "create", "statusUpdate") */ -export class JobOperation { +export class JobOperation { auth: JobsAuth | undefined; actions: JobAction[]; @@ -93,7 +95,7 @@ export class JobOperation { this.auth = auth; } - static parse( + static parse( actionList: Record>, data: Record, ): JobOperation { @@ -133,7 +135,7 @@ export class JobOperation { * @param data JSON configuration data * @returns */ -function parseAction( +function parseAction( actionList: Record>, data: Record, ): JobAction { @@ -154,7 +156,19 @@ function parseAction( /** * Superclass for all responses to Job changes */ -export interface JobAction { +export interface JobAction { + /** + * Validate that the request body for this job operation. + * + * Note that the configuration of this action is validated in the constructor. + * Actions that don't need custom DTO methods can omit this method. + * + * @param dto data transfer object received from the client + * @throw HttpException if the DTO is invalid + * @returns + */ + validate?: (dto: DtoType) => Promise; + /** * Respond to the action */ @@ -170,7 +184,7 @@ export interface JobAction { /** * Describes the constructor and static members for JobAction implementations */ -export interface JobActionClass { +export interface JobActionClass { /** * Action type, eg "url". Matched during parsing of the action */ diff --git a/src/jobs/interceptors/job-create.interceptor.ts b/src/jobs/interceptors/job-create.interceptor.ts index cb85aaa1d..798e04c17 100644 --- a/src/jobs/interceptors/job-create.interceptor.ts +++ b/src/jobs/interceptors/job-create.interceptor.ts @@ -58,25 +58,15 @@ export class JobCreateInterceptor implements NestInterceptor { } const jc = matchingConfig[0]; - // await Promise.all( - // jc.create.actions.map((action) => { - // return action.validate(createJobDto).catch((err) => { - // Logger.error(err); - // if (err instanceof HttpException) { - // throw err; - // } - // throw new HttpException( - // { - // status: HttpStatus.BAD_REQUEST, - // message: `Invalid job input. Action ${action.getActionType()} unable to validate ${ - // createJobDto.type - // } job due to ${err}`, - // }, - // HttpStatus.BAD_REQUEST, - // ); - // }); - // }), - // ); + await Promise.all( + jc.create.actions.map((action) => { + if (action.validate) { + return action.validate(createJobDto); + } else { + return Promise.resolve(); + } + }), + ); return jc; } diff --git a/src/jobs/jobs.controller.ts b/src/jobs/jobs.controller.ts index d63f3b018..852fab604 100644 --- a/src/jobs/jobs.controller.ts +++ b/src/jobs/jobs.controller.ts @@ -553,8 +553,7 @@ export class JobsController { throw new HttpException( { status: HttpStatus.BAD_REQUEST, - message: `Invalid job input. Job '${jobInstance.type}' unable to perfom - action '${action.getActionType()}' due to ${err}`, + message: `Invalid job input. Job '${jobInstance.type}' unable to perform action '${action.getActionType()}' due to ${err}`, }, HttpStatus.BAD_REQUEST, ); @@ -563,6 +562,17 @@ export class JobsController { async performJobCreateAction(jobInstance: JobClass): Promise { const jobConfig = this.getJobTypeConfiguration(jobInstance.type); + + await Promise.all( + jobConfig.create.actions.map((action) => { + if (action.validate) { + return action.validate(jobInstance); + } else { + return Promise.resolve(); + } + }), + ); + for (const action of jobConfig.create.actions) { await this.performJobAction(jobInstance, action); } @@ -583,6 +593,16 @@ export class JobsController { ); } + await Promise.all( + jobConfig.statusUpdate.actions.map((action) => { + if (action.validate) { + return action.validate(jobInstance); + } else { + return Promise.resolve(); + } + }), + ); + for (const action of jobConfig.statusUpdate.actions) { await this.performJobAction(jobInstance, action); } @@ -663,7 +683,7 @@ export class JobsController { @ApiResponse({ status: HttpStatus.OK, type: JobClass, - description: "Updated job status", + description: "Updated job", }) async update( @Req() request: Request, From cfa70ff2374e438c078263a47c279f8e9c96e37f Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Tue, 10 Sep 2024 14:32:07 +0200 Subject: [PATCH 02/16] Remove job-create interceptor DTO validation is in the controller, so the interceptor isn't needed. --- .../interceptors/job-create.interceptor.ts | 73 ------------------- src/jobs/jobs.controller.ts | 5 +- 2 files changed, 1 insertion(+), 77 deletions(-) delete mode 100644 src/jobs/interceptors/job-create.interceptor.ts diff --git a/src/jobs/interceptors/job-create.interceptor.ts b/src/jobs/interceptors/job-create.interceptor.ts deleted file mode 100644 index 798e04c17..000000000 --- a/src/jobs/interceptors/job-create.interceptor.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - CallHandler, - ExecutionContext, - HttpException, - HttpStatus, - Injectable, - Logger, - NestInterceptor, -} from "@nestjs/common"; -import { Observable } from "rxjs"; -import configuration from "src/config/configuration"; -import { CreateJobDto } from "../dto/create-job.dto"; -import { JobConfig } from "../config/jobconfig"; - -@Injectable() -export class JobCreateInterceptor implements NestInterceptor { - async intercept( - context: ExecutionContext, - next: CallHandler, - ): Promise> { - const req = context.switchToHttp().getRequest(); - const jobConfiguration = await this.validateJob(req.body); - - req.body = { - ...req.body, - configuration: jobConfiguration, - }; - - return next.handle(); - } - - /** - * Validate if the job has a matching configuration and is performable - */ - async validateJob(createJobDto: CreateJobDto): Promise { - // it should return a single job configuration - const jobConfigs = configuration().jobConfiguration; - const matchingConfig = jobConfigs.filter( - (j) => j.jobType == createJobDto.type, - ); - - if (matchingConfig.length != 1) { - if (matchingConfig.length > 1) { - Logger.error( - "More than one job configurations matching type " + createJobDto.type, - ); - } else { - Logger.error("No job configuration matching type " + createJobDto.type); - } - // return error that job type does not exists - throw new HttpException( - { - status: HttpStatus.BAD_REQUEST, - message: "Invalid job type: " + createJobDto.type, - }, - HttpStatus.BAD_REQUEST, - ); - } - const jc = matchingConfig[0]; - - await Promise.all( - jc.create.actions.map((action) => { - if (action.validate) { - return action.validate(createJobDto); - } else { - return Promise.resolve(); - } - }), - ); - - return jc; - } -} diff --git a/src/jobs/jobs.controller.ts b/src/jobs/jobs.controller.ts index 852fab604..7d15e030d 100644 --- a/src/jobs/jobs.controller.ts +++ b/src/jobs/jobs.controller.ts @@ -12,12 +12,11 @@ import { HttpException, Req, ForbiddenException, - UseInterceptors, } from "@nestjs/common"; import { Request } from "express"; import { FilterQuery } from "mongoose"; import { JobsService } from "./jobs.service"; -import { CreateJobDto, CreateJobDtoWithConfig } from "./dto/create-job.dto"; +import { CreateJobDto } from "./dto/create-job.dto"; import { StatusUpdateJobDto } from "./dto/status-update-job.dto"; import { PoliciesGuard } from "src/casl/guards/policies.guard"; import { CheckPolicies } from "src/casl/decorators/check-policies.decorator"; @@ -46,7 +45,6 @@ import { filterDescriptionSimplified, filterExampleSimplified, } from "src/common/utils"; -import { JobCreateInterceptor } from "./interceptors/job-create.interceptor"; import { JobAction } from "./config/jobconfig"; @ApiBearerAuth() @@ -616,7 +614,6 @@ export class JobsController { @CheckPolicies("jobs", (ability: AppAbility) => ability.can(Action.JobCreate, JobClass), ) - // @UseInterceptors(JobCreateInterceptor) @Post() @ApiOperation({ summary: "It creates a new job.", From c711dbd20a197e541004215c28e4eceaaa521a6d Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Tue, 10 Sep 2024 23:13:06 +0200 Subject: [PATCH 03/16] Add jsonpath-plus dependency --- package-lock.json | 60 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 ++ 2 files changed, 62 insertions(+) diff --git a/package-lock.json b/package-lock.json index 4c44ba92f..4642769d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "dotenv": "^16.0.3", "express-session": "^1.17.3", "handlebars": "^4.7.7", + "jsonpath-plus": "^9.0.0", "lodash": "^4.17.21", "luxon": "^3.2.1", "mathjs": "^13.0.0", @@ -61,6 +62,7 @@ "@types/express": "^4.17.13", "@types/express-session": "^1.17.4", "@types/jest": "^27.0.2", + "@types/jsonpath-plus": "^5.0.5", "@types/lodash": "^4.14.180", "@types/luxon": "^3.1.0", "@types/mocha": "^10.0.0", @@ -1882,6 +1884,30 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsep-plugin/assignment": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.2.1.tgz", + "integrity": "sha512-gaHqbubTi29aZpVbBlECRpmdia+L5/lh2BwtIJTmtxdbecEyyX/ejAOg7eQDGNvGOUmPY7Z2Yxdy9ioyH/VJeA==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.3.tgz", + "integrity": "sha512-XfZgry4DwEZvSFtS/6Y+R48D7qJYJK6R9/yJFyUFHCIUMEEHuJ4X95TDgJp5QkmzfLYvapMPzskV5HpIDrREug==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, "node_modules/@ljharb/through": { "version": "2.3.13", "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", @@ -2933,6 +2959,13 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/jsonpath-plus": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/jsonpath-plus/-/jsonpath-plus-5.0.5.tgz", + "integrity": "sha512-aaqqDf5LcGOtAfEntO5qKZS6ixT0MpNhUXNwbVPdLf7ET9hKsufJq+buZr7eXSnWoLRyGzVj2Yz2hbjVSK3wsA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/jsonwebtoken": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", @@ -8875,6 +8908,15 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "node_modules/jsep": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.9.tgz", + "integrity": "sha512-i1rBX5N7VPl0eYb6+mHNp52sEuaS2Wi8CDYx1X5sn9naevL78+265XJqy1qENEk7mRKwS06NHpUqiBwR7qeodw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -8939,6 +8981,24 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpath-plus": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-9.0.0.tgz", + "integrity": "sha512-bqE77VIDStrOTV/czspZhTn+o27Xx9ZJRGVkdVShEtPoqsIx5yALv3lWVU6y+PqYvWPJNWE7ORCQheQkEe0DDA==", + "license": "MIT", + "dependencies": { + "@jsep-plugin/assignment": "^1.2.1", + "@jsep-plugin/regex": "^1.0.3", + "jsep": "^1.3.8" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", diff --git a/package.json b/package.json index 5aaf524c2..f9742b40f 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "dotenv": "^16.0.3", "express-session": "^1.17.3", "handlebars": "^4.7.7", + "jsonpath-plus": "^9.0.0", "lodash": "^4.17.21", "luxon": "^3.2.1", "mathjs": "^13.0.0", @@ -87,6 +88,7 @@ "@types/express": "^4.17.13", "@types/express-session": "^1.17.4", "@types/jest": "^27.0.2", + "@types/jsonpath-plus": "^5.0.5", "@types/lodash": "^4.14.180", "@types/luxon": "^3.1.0", "@types/mocha": "^10.0.0", From c8d08e084a94432f7adb8d85df32e85fe5b5be94 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Tue, 10 Sep 2024 23:49:33 +0200 Subject: [PATCH 04/16] Add ValidateAction Also tests and example --- src/config/configuration.ts | 3 ++ src/jobs/actions/validateaction.spec.ts | 57 ++++++++++++++++++++ src/jobs/actions/validateaction.ts | 70 +++++++++++++++++++++++++ src/jobs/config/jobConfig.example.json | 8 ++- 4 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/jobs/actions/validateaction.spec.ts create mode 100644 src/jobs/actions/validateaction.ts diff --git a/src/config/configuration.ts b/src/config/configuration.ts index 3fd5452c9..286b2dc20 100644 --- a/src/config/configuration.ts +++ b/src/config/configuration.ts @@ -11,6 +11,7 @@ import * as fs from "fs"; import { merge } from "lodash"; import localconfiguration from "./localconfiguration"; import { boolean } from "mathjs"; +import { ValidateAction } from "src/jobs/actions/validateaction"; const configuration = () => { const accessGroupsStaticValues = @@ -241,10 +242,12 @@ export function registerDefaultActions() { registerCreateAction(EmailJobAction); registerCreateAction(URLAction); registerCreateAction(RabbitMQJobAction); + registerCreateAction(ValidateAction); // Status Update registerStatusUpdateAction(LogJobAction); registerStatusUpdateAction(EmailJobAction); registerStatusUpdateAction(RabbitMQJobAction); + registerStatusUpdateAction(ValidateAction); } export type OidcConfig = ReturnType["oidc"]; diff --git a/src/jobs/actions/validateaction.spec.ts b/src/jobs/actions/validateaction.spec.ts new file mode 100644 index 000000000..a27ee8cc7 --- /dev/null +++ b/src/jobs/actions/validateaction.spec.ts @@ -0,0 +1,57 @@ +import { ValidateAction } from "./validateaction"; +import { CreateJobDto } from "../dto/create-job.dto"; +import { HttpException } from "@nestjs/common"; + +describe("ValiateAction", () => { + const config = { + actionType: "validate", + required: ["jobParams.nonNull", "jobParams.datasetIds[0]"], + }; + const action = new ValidateAction(config); + it("should be configured successfully", async () => { + expect(action).toBeDefined(); + }); + it("should pass if required params are present", async () => { + const dto: CreateJobDto = { + type: "test", + jobParams: { + nonNull: "value1", + datasetIds: ["value2"], + }, + ownerUser: "owner", + ownerGroup: "group", + contactEmail: "email@example.com", + }; + + await expect(action.validate(dto)).resolves.toBeUndefined(); + }); + + it("should fail if nonNull is missing", async () => { + const dto: CreateJobDto = { + type: "test", + jobParams: { + datasetIds: ["value2"], + }, + ownerUser: "owner", + ownerGroup: "group", + contactEmail: "email@example.com", + }; + + await expect(action.validate(dto)).rejects.toThrowError(HttpException); + }); + + it("should fail if no datasets are given", async () => { + const dto: CreateJobDto = { + type: "test", + jobParams: { + nonNull: "value1", + datasetIds: [], + }, + ownerUser: "owner", + ownerGroup: "group", + contactEmail: "email@example.com", + }; + + await expect(action.validate(dto)).rejects.toThrowError(HttpException); + }); +}); diff --git a/src/jobs/actions/validateaction.ts b/src/jobs/actions/validateaction.ts new file mode 100644 index 000000000..a3be84efb --- /dev/null +++ b/src/jobs/actions/validateaction.ts @@ -0,0 +1,70 @@ +/** + * Validates job DTOs at runtime + * + * This allows validation of untyped portions of the request body to be configured + * in the jobconfig file. + * + * Example config: + *
{
+ *   "actionType": "validate",
+ *   "required": ["jobParms.datasetIds"]
+ * }
+ * + * Each element of the "required" array is a JSONPath expression that must be present in + * the request body. + */ +import { + HttpException, + HttpStatus, + Logger, + NotFoundException, +} from "@nestjs/common"; +import { JobAction, JobDto } from "../config/jobconfig"; +import { JobClass } from "../schemas/job.schema"; +import { JSONPath } from "jsonpath-plus"; + +export class ValidateAction implements JobAction { + public static readonly actionType = "validate"; + private required: string[]; + + getActionType(): string { + return ValidateAction.actionType; + } + + async validate(dto: T) { + for (const path of this.required) { + try { + const result = JSONPath({ path: path, json: dto }); + if (result !== null && result?.length > 0) { + continue; + } + } catch (e) { + Logger.error(e); + } + + throw new HttpException( + { + status: HttpStatus.BAD_REQUEST, + message: `Invalid request. Requires '${path}'`, + }, + HttpStatus.BAD_REQUEST, + ); + } + } + + /** + * Does nothing (validate only) + * @param job Ignored + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async performJob(job: JobClass) {} + + constructor(data: Record) { + if (!("required" in data)) { + throw new NotFoundException( + `Missing connection parameter in 'validate' action: 'required'`, + ); + } + this.required = data["required"] as string[]; + } +} diff --git a/src/jobs/config/jobConfig.example.json b/src/jobs/config/jobConfig.example.json index fae19537e..9c9562598 100644 --- a/src/jobs/config/jobConfig.example.json +++ b/src/jobs/config/jobConfig.example.json @@ -58,7 +58,13 @@ { "jobType": "public", "create": { - "auth": "#all" + "auth": "#all", + "actions": [ + { + "actionType": "validate", + "required": ["jobParams.datasetIds[0]"] + } + ] }, "statusUpdate": { "auth": "#all" From 93fdbd16483f0441040258e9697f15a1141e7615 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Wed, 2 Oct 2024 14:00:44 +0200 Subject: [PATCH 05/16] Fix type error calling validate --- src/jobs/jobs.controller.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jobs/jobs.controller.ts b/src/jobs/jobs.controller.ts index 7d15e030d..661968c58 100644 --- a/src/jobs/jobs.controller.ts +++ b/src/jobs/jobs.controller.ts @@ -558,13 +558,13 @@ export class JobsController { }); } - async performJobCreateAction(jobInstance: JobClass): Promise { + async performJobCreateAction(jobInstance: JobClass, dto: CreateJobDto): Promise { const jobConfig = this.getJobTypeConfiguration(jobInstance.type); await Promise.all( jobConfig.create.actions.map((action) => { if (action.validate) { - return action.validate(jobInstance); + return action.validate(dto); } else { return Promise.resolve(); } @@ -656,7 +656,7 @@ export class JobsController { // Create actual job in database const createdJobInstance = await this.jobsService.create(jobInstance); // Perform the action that is specified in the create portion of the job configuration - await this.performJobCreateAction(createdJobInstance); + await this.performJobCreateAction(createdJobInstance, createJobDto); return createdJobInstance; } From 60372a0019c8fb9f5ead26b97b538d5bc4fe8c35 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Wed, 2 Oct 2024 16:05:42 +0200 Subject: [PATCH 06/16] Refactor job validate code - Revert the previous commit, which was incorrect and incomplete - Make valiateDTO and performActions generic so they can be shared between endpoints - Separate out checkConfigVersion, which is specific to statusUpdate - Move `getJobTypeConfiguration` calls up so this is only called once --- src/jobs/jobs.controller.ts | 121 +++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 49 deletions(-) diff --git a/src/jobs/jobs.controller.ts b/src/jobs/jobs.controller.ts index 661968c58..d612ccef3 100644 --- a/src/jobs/jobs.controller.ts +++ b/src/jobs/jobs.controller.ts @@ -45,7 +45,7 @@ import { filterDescriptionSimplified, filterExampleSimplified, } from "src/common/utils"; -import { JobAction } from "./config/jobconfig"; +import { JobAction, JobDto, JobConfig } from "./config/jobconfig"; @ApiBearerAuth() @ApiTags("jobs") @@ -538,48 +538,79 @@ export class JobsController { } /** - * Send off to external service + * Validate the DTO against all actions. + * + * Validation is performed in parallel. Invalid DTOs will result in an HTTPException. + * @param actions + * @param dto + * @returns */ - async performJobAction( - jobInstance: JobClass, - action: JobAction | JobAction, + async validateDTO( + actions: JobAction[], + dto: DtoType, ): Promise { - await action.performJob(jobInstance).catch((err: Error) => { - if (err instanceof HttpException) { - throw err; - } - throw new HttpException( - { - status: HttpStatus.BAD_REQUEST, - message: `Invalid job input. Job '${jobInstance.type}' unable to perform action '${action.getActionType()}' due to ${err}`, - }, - HttpStatus.BAD_REQUEST, - ); - }); - } - - async performJobCreateAction(jobInstance: JobClass, dto: CreateJobDto): Promise { - const jobConfig = this.getJobTypeConfiguration(jobInstance.type); - await Promise.all( - jobConfig.create.actions.map((action) => { + actions.map((action) => { if (action.validate) { - return action.validate(dto); + return action.validate(dto).catch((err: Error) => { + if (err instanceof HttpException) { + throw err; + } + throw new HttpException( + { + status: HttpStatus.BAD_REQUEST, + message: `Invalid job input. Invalid request body for '${action.getActionType()}' due to ${err}`, + }, + HttpStatus.BAD_REQUEST, + ); + }); } else { return Promise.resolve(); } }), ); + } - for (const action of jobConfig.create.actions) { - await this.performJobAction(jobInstance, action); + /** + * Perform all actions serially. + * + * Actions should throw a HTTPException for most errors. Other exceptions will be converted to HTTPExceptions, resulting + * in a 400 response. + * @param actions List of actions to perform + * @param jobInstance + * @returns + */ + async performActions( + actions: JobAction[], + jobInstance: JobClass, + ): Promise { + for (const action of actions) { + await action.performJob(jobInstance).catch((err: Error) => { + if (err instanceof HttpException) { + throw err; + } + throw new HttpException( + { + status: HttpStatus.BAD_REQUEST, + message: `Invalid job input. Job '${jobInstance.type}' unable to perform action '${action.getActionType()}' due to ${err}`, + }, + HttpStatus.BAD_REQUEST, + ); + }); } - return; } - async performJobStatusUpdateAction(jobInstance: JobClass): Promise { - const jobConfig = this.getJobTypeConfiguration(jobInstance.type); - + /** + * Check for mismatches between the config version used to create the job and the currently loaded version. + * + * Currently this is only logged. + * @param jobInstance + * @returns + */ + async checkConfigVersion( + jobConfig: JobConfig, + jobInstance: JobClass, + ): Promise { // TODO - what shall we do when configVersion does not match? if (jobConfig.configVersion !== jobInstance.configVersion) { Logger.log( @@ -590,21 +621,6 @@ export class JobsController { "JobStatusUpdate", ); } - - await Promise.all( - jobConfig.statusUpdate.actions.map((action) => { - if (action.validate) { - return action.validate(jobInstance); - } else { - return Promise.resolve(); - } - }), - ); - - for (const action of jobConfig.statusUpdate.actions) { - await this.performJobAction(jobInstance, action); - } - return; } /** @@ -653,10 +669,13 @@ export class JobsController { createJobDto, request.user as JWTUser, ); + // Allow actions to validate DTO + const jobConfig = this.getJobTypeConfiguration(createJobDto.type); + await this.validateDTO(jobConfig.create.actions, createJobDto); // Create actual job in database const createdJobInstance = await this.jobsService.create(jobInstance); // Perform the action that is specified in the create portion of the job configuration - await this.performJobCreateAction(createdJobInstance, createJobDto); + await this.performActions(jobConfig.create.actions, createdJobInstance); return createdJobInstance; } @@ -701,10 +720,10 @@ export class JobsController { } const currentJobInstance = await this.generateJobInstanceForPermissions(currentJob); - const jobConfiguration = this.getJobTypeConfiguration(currentJob.type); + const jobConfig = this.getJobTypeConfiguration(currentJob.type); const ability = this.caslAbilityFactory.jobsInstanceAccess( request.user as JWTUser, - jobConfiguration, + jobConfig, ); // check if the user can update this job const canUpdateStatus = @@ -715,6 +734,9 @@ export class JobsController { throw new ForbiddenException("Unauthorized to update this job."); } + // Allow actions to validate DTO + await this.validateDTO(jobConfig.statusUpdate.actions, statusUpdateJobDto); + // Update job in database const updatedJob = await this.jobsService.statusUpdate( id, @@ -722,7 +744,8 @@ export class JobsController { ); // Perform the action that is specified in the update portion of the job configuration if (updatedJob !== null) { - await this.performJobStatusUpdateAction(updatedJob); + await this.checkConfigVersion(jobConfig, updatedJob); + await this.performActions(jobConfig.statusUpdate.actions, updatedJob); } return updatedJob; } From ea0887988cf0600981acb64b0e50cea9cd7307ea Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Thu, 10 Oct 2024 21:38:13 +0200 Subject: [PATCH 07/16] Add mocha tests for ValidateAction. - Add new test for validate jobs to check for required parameters in both POST and PATCH operations - Remove some unused TestData which didn't match the current Job DTOs - Add 'validate' job to the test jobconfig.json --- README.md | 2 +- src/jobs/dto/create-job.dto.ts | 4 - test/Jobs.js | 701 +++++++++++++++++++-------------- test/TestData.js | 56 --- test/config/jobconfig.json | 23 +- 5 files changed, 420 insertions(+), 366 deletions(-) diff --git a/README.md b/README.md index 50e87e5d3..dfe4d7c77 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Thank you for your interest in contributing to our project! 1. **Running the unit tests:** `npm run test` 2. **Running the e2e(api) tests:** -- First of all run `npm run prepare:local` to prepare the local environment for starting +- First of all run `npm run prepare:local` to prepare the local docker environment for starting - After that run `npm run test:api` which will start the backend locally and run both `jest` and `mocha` e2e(api) tests. - [Optional] If you want to run only the mocha tests you will need to start the backend locally with `npm run start` and then use `npm run test:api:mocha` - [Optional] If you want to run only the jest tests you can use `npm run test:api:jest` diff --git a/src/jobs/dto/create-job.dto.ts b/src/jobs/dto/create-job.dto.ts index f1a2c074d..775e30951 100644 --- a/src/jobs/dto/create-job.dto.ts +++ b/src/jobs/dto/create-job.dto.ts @@ -1,10 +1,6 @@ import { ApiProperty, ApiTags } from "@nestjs/swagger"; import { IsEmail, IsObject, IsOptional, IsString } from "class-validator"; -import { JobConfig } from "../config/jobconfig"; -export type CreateJobDtoWithConfig = CreateJobDto & { - configuration: JobConfig; -}; @ApiTags("jobs") export class CreateJobDto { @ApiProperty({ diff --git a/test/Jobs.js b/test/Jobs.js index 1bbfd55d9..eec9e8363 100644 --- a/test/Jobs.js +++ b/test/Jobs.js @@ -1,7 +1,6 @@ /* eslint-disable @typescript-eslint/no-var-requires */ "use strict"; -const { and } = require("ajv/dist/compile/codegen"); var utils = require("./LoginUtils"); const { TestData } = require("./TestData"); @@ -40,7 +39,7 @@ let datasetPid1 = null, jobIdGroup4 = null, encodedJobIdGroup4 = null, jobIdGroup5 = null, - encodedJobIdGroup5 = null, + encodedJobIdGroup5 = null, jobIdGroup6 = null, encodedJobIdGroup6 = null, @@ -53,7 +52,7 @@ let datasetPid1 = null, jobIdUser4 = null, encodedJobIdUser4 = null, jobIdUser5 = null, - encodedJobIdUser5 = null, + encodedJobIdUser5 = null, jobIdUser6 = null, encodedJobIdUser6 = null, @@ -66,10 +65,10 @@ let datasetPid1 = null, jobIdUserSpec4 = null, encodedJobIdUserSpec4 = null, jobIdUserSpec5 = null, - encodedJobIdUserSpec5 = null, + encodedJobIdUserSpec5 = null, jobIdUserSpec6 = null, encodedJobIdUserSpec6 = null, - jobIdUserSpec7 = null, + jobIdUserSpec7 = null, encodedJobIdUserSpec7 = null, jobIdGroupSpec1 = null, @@ -81,13 +80,16 @@ let datasetPid1 = null, jobIdGroupSpec4 = null, encodedJobIdGroupSpec4 = null, jobIdGroupSpec5 = null, - encodedJobIdGroupSpec5 = null, + encodedJobIdGroupSpec5 = null, jobIdGroupSpec6 = null, encodedJobIdGroupSpec6 = null, - jobIdGroupSpec7 = null, + jobIdGroupSpec7 = null, encodedJobIdGroupSpec7 = null, jobIdGroupSpec8 = null, - encodedJobIdGroupSpec8 = null; + encodedJobIdGroupSpec8 = null, + + jobIdValidate1 = null, + encodedJobIdValidate1 = null; const dataset1 = { @@ -111,33 +113,29 @@ const dataset3 = { accessGroups: ["group1"], }; const jobAll = { - ...TestData.Job, type: "all_access", }; const jobDatasetPublic = { - ...TestData.Job, type: "public_access", } const jobAuthenticated = { - ...TestData.Job, type: "authenticated_access" }; const jobDatasetAccess = { - ...TestData.Job, type: "dataset_access" }; const jobDatasetOwner = { - ...TestData.Job, type: "owner_access" }; const jobUser51 = { - ...TestData.Job, type: "user_access" }; const jobGroup5 = { - ...TestData.Job, type: "group_access" }; +const jobValidate = { + type: "validate" +}; describe("1100: Jobs: Test New Job Model", () => { before(() => { @@ -237,7 +235,7 @@ describe("1100: Jobs: Test New Job Model", () => { datasetPid3 = res.body["pid"]; }); }); - + it("0040: Add a new job as a user from ADMIN_GROUPS for himself/herself in '#all' configuration with no datasets in job parameters, which should fail", async () => { const newDataset = { ...jobAll, @@ -723,7 +721,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("message").and.be.equal("Invalid new job. Unauthenticated user cannot initiate a job owned by another user."); }); }); - + it("0230: Add a new job as a user from ADMIN_GROUPS for himself/herself in '#datasetPublic' configuration with all published datasets", async () => { const newDataset = { ...jobDatasetPublic, @@ -876,7 +874,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); }); }); - + it("0290: Add a new job as a user from CREATE_JOB_GROUPS for himself/herself in '#datasetPublic' configuration with one unpublished dataset", async () => { const newDataset = { ...jobDatasetPublic, @@ -928,7 +926,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); }); }); - + it("0310: Add a new job as a normal user himself/herself in '#datasetPublic' configuration with one unpublished dataset, which should fail as forbidden", async () => { const newDataset = { ...jobDatasetPublic, @@ -989,7 +987,7 @@ describe("1100: Jobs: Test New Job Model", () => { .post("/api/v3/Jobs") .send(newDataset) .set("Accept", "application/json") - .expect(TestData.AccessForbiddenStatusCode) + .expect(TestData.AccessForbiddenStatusCode) .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("id"); @@ -1047,7 +1045,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("ownerUser").and.be.equal("user1"); res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); }); - }); + }); it("0360: Add a new job as a user from ADMIN_GROUPS for another group in '#authenticated' configuration", async () => { const newDataset = { ...jobAuthenticated, @@ -1169,7 +1167,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("message").and.be.equal("Unauthorized to create this job."); }); }); - + it("0410: Add a new job as a user from ADMIN_GROUPS for himself/herself in '#datasetAccess' configuration", async () => { const newDataset = { ...jobDatasetAccess, @@ -1837,7 +1835,7 @@ describe("1100: Jobs: Test New Job Model", () => { }); }); - + it("0620: Add a new job as a user from ADMIN_GROUPS for anonymous user in '#USER5.1' configuration", async () => { const newDataset = { ...jobUser51, @@ -2313,9 +2311,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0780: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2326,9 +2324,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0790: Adds a Status update to a job as a user from ADMIN_GROUPS for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2339,9 +2337,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0800: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2352,9 +2350,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0810: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2363,12 +2361,12 @@ describe("1100: Jobs: Test New Job Model", () => { }); it("0820: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#all' configuration", async () => { - + return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2379,9 +2377,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0830: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2392,9 +2390,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0840: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2405,9 +2403,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0850: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2418,9 +2416,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0860: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2431,9 +2429,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0870: Adds a Status update to a job as a normal user for his/her job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2444,9 +2442,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0880: Adds a Status update to a job as a normal user for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2457,9 +2455,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0890: Adds a Status update to a job as a normal user for his/her group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2470,9 +2468,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0900: Adds a Status update to a job as a normal user for another user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2483,9 +2481,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0910: Adds a Status update to a job as a normal user for anonymous user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2496,9 +2494,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0920: Adds a Status update to a job as unauthhenticated user for anonymous job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.SuccessfulPatchStatusCode) @@ -2508,9 +2506,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0930: Adds a Status update to a job as unauthhenticated user for anouther group's job in '#all' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2520,9 +2518,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0940: Adds a Status update to a job as unauthhenticated user for another user's job in '#all' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2532,9 +2530,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0950: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2545,9 +2543,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0960: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2558,9 +2556,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0970: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2571,9 +2569,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0980: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2584,9 +2582,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0990: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2597,9 +2595,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1000: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2610,9 +2608,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1010: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2623,9 +2621,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1020: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2636,9 +2634,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1030: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2649,9 +2647,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1040: Adds a Status update to a job as a normal user for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2662,9 +2660,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1050: Adds a Status update to a job as a normal user for another user's job in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2675,9 +2673,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1060: Adds a Status update to a job as a normal user for his/her group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2688,9 +2686,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1070: Adds a Status update to a job as a normal user for another user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2701,9 +2699,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1080: Adds a Status update to a job as a normal user for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2714,9 +2712,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1090: Adds a Status update to a job as unauthhenticated user for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2726,9 +2724,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1100: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2739,9 +2737,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1110: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2752,9 +2750,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1120: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2765,9 +2763,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1130: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2779,9 +2777,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1140: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2791,9 +2789,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1150: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2803,9 +2801,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1160: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2815,35 +2813,35 @@ describe("1100: Jobs: Test New Job Model", () => { it("1170: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) .expect(TestData.AccessForbiddenStatusCode) .expect("Content-Type", /json/); }); - + it("1180: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) .expect(TestData.AccessForbiddenStatusCode) .expect("Content-Type", /json/); }); - + it("1190: Adds a Status update to a job as a normal user for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2854,9 +2852,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1200: Adds a Status update to a job as a normal user for another user's job in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2867,9 +2865,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1210: Adds a Status update to a job as a normal user for his/her group in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2880,9 +2878,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1220: Adds a Status update to a job as a normal user for another user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2893,9 +2891,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1230: Adds a Status update to a job as a normal user for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2906,9 +2904,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1240: Adds a Status update to a job as unauthhenticated user for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2918,9 +2916,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1250: Adds a Status update to a job as a user from ADMIN_GROUPS for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2931,9 +2929,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1260: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2944,9 +2942,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1270: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2957,9 +2955,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1280: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2970,9 +2968,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1290: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2983,9 +2981,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1300: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2996,9 +2994,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1310: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3009,22 +3007,22 @@ describe("1100: Jobs: Test New Job Model", () => { it("1320: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) .expect(TestData.AccessForbiddenStatusCode) .expect("Content-Type", /json/); }); - + it("1330: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3035,9 +3033,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1340: Adds a Status update to a job as user5.1 for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3048,9 +3046,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1350: Adds a Status update to a job as user5.1 for another user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3061,9 +3059,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1360: Adds a Status update to a job as user5.1 for his/her group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3074,9 +3072,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1370: Adds a Status update to a job as user5.1 for another user's group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3087,9 +3085,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1380: Adds a Status update to a job as user5.1 for anonymous user's group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3100,9 +3098,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1390: Adds a Status update to a job as user5.2 for his/her job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec7}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3113,9 +3111,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1400: Adds a Status update to a job as user5.2 for user's 5.1 in same group job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3126,9 +3124,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1410: Adds a Status update to a job as user5.2 for another user in his/her group job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3139,48 +3137,48 @@ describe("1100: Jobs: Test New Job Model", () => { it("1420: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) .expect("Content-Type", /json/); }); - + it("1430: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) .expect("Content-Type", /json/); }); - + it("1440: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) .expect("Content-Type", /json/); }); - + it("1450: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3191,9 +3189,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1460: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3204,9 +3202,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1470: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3217,9 +3215,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1480: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3230,35 +3228,35 @@ describe("1100: Jobs: Test New Job Model", () => { it("1490: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) .expect(TestData.AccessForbiddenStatusCode) .expect("Content-Type", /json/); }); - + it("1500: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) .expect(TestData.AccessForbiddenStatusCode) .expect("Content-Type", /json/); }); - + it("1510: Adds a Status update to a job as user5.1 for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3269,9 +3267,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1520: Adds a Status update to a job as user5.1 for another user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3282,9 +3280,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1530: Adds a Status update to a job as user5.1 for his/her group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3295,9 +3293,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1540: Adds a Status update to a job as user5.1 for another user's group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3308,9 +3306,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1550: Adds a Status update to a job as user5.1 for anonymous user's group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3321,23 +3319,23 @@ describe("1100: Jobs: Test New Job Model", () => { it("1560: Adds a Status update to a job as user5.2 for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec7}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) .expect(TestData.SuccessfulPatchStatusCode) .expect("Content-Type", /json/); }); - + it("1570: Adds a Status update to a job as user5.2 for user's 5.1 in same group job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3348,9 +3346,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1580: Adds a Status update to a job as user5.2 for another user in his/her group job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3361,9 +3359,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1590: Adds a Status update to a job as user3 for his/her job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec8}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser3}` }) @@ -3374,9 +3372,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1600: Adds a Status update to a job as user3 for user's 5.1 job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser3}` }) @@ -3387,9 +3385,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1610: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#all' configuration with non-existing jobId, which should fail as bad request", async () => { return request(appUrl) .patch(`/api/v3/Jobs/badJobId`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusCode: "update status of a job", + statusMessage: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3414,7 +3412,7 @@ describe("1100: Jobs: Test New Job Model", () => { const query = { where:{ createdBy: "admin" }}; return request(appUrl) .get(`/api/v3/Jobs/`) - .send({}) + .send({}) .query("filter=" + encodeURIComponent(JSON.stringify(query))) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3568,7 +3566,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.be.an("array").to.have.lengthOf(2); }); }); - + it("1740: Access jobs as unauthenticated user, which should be forbidden", async () => { return request(appUrl) .get(`/api/v3/Jobs/`) @@ -3584,7 +3582,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.have.property("ownerUser").and.be.equal("admin"); }); @@ -3596,7 +3594,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.have.property("ownerUser").and.be.equal("user1"); }); @@ -3608,7 +3606,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); res.body.should.have.property("ownerGroup").and.be.equal("group1"); @@ -3621,7 +3619,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3633,7 +3631,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3645,7 +3643,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.have.property("ownerUser").and.be.equal("user1"); res.body.should.have.property("ownerGroup").and.be.equal("group1"); @@ -3658,7 +3656,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) .expect(TestData.SuccessfulPatchStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); res.body.should.have.property("ownerGroup").and.be.equal("group1"); @@ -3671,7 +3669,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3683,7 +3681,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3695,7 +3693,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3707,7 +3705,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3719,7 +3717,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) .expect(TestData.SuccessfulPatchStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.have.property("ownerUser").and.be.equal('user5.1'); res.body.should.have.property("ownerGroup").and.be.equal("group5"); @@ -3732,7 +3730,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3744,7 +3742,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3756,7 +3754,7 @@ describe("1100: Jobs: Test New Job Model", () => { .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3767,7 +3765,7 @@ describe("1100: Jobs: Test New Job Model", () => { .get(`/api/v3/Jobs/${encodedJobIdUser6}`) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) - .expect("Content-Type", /json/) + .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("ownerUser"); }); @@ -3829,6 +3827,101 @@ describe("1100: Jobs: Test New Job Model", () => { .then((res) => { res.body.should.be.an("array").to.have.lengthOf(59); }); - }); + }); + + it("1970: validation fails without required parameters", async () => { + const newDataset = { + ...jobValidate, + jobParams: { + optionalParam: false, + }, + }; + + return request(appUrl) + .post("/api/v3/Jobs") + .send(newDataset) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.BadRequestStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.not.have.property("type") + res.body.should.have.property("message").and.be.equal("Invalid request. Requires 'jobParams.requiredParam'"); + }); + }); + + + it("1980: validation succeeds with the required parameter", async () => { + const newDataset = { + type: "validate", + jobParams: { + requiredParam: false, + }, + }; + + return request(appUrl) + .post("/api/v3/Jobs") + .send(newDataset) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.EntryCreatedStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.have.property("type").and.equal("validate"); + res.body.should.have.property("createdBy").and.equal("admin"); + res.body.should.have.property("jobParams").that.deep.equals({requiredParam: false}); + + jobIdValidate1 = res.body["id"]; + encodedJobIdValidate1 = encodeURIComponent(jobIdValidate1); + }); + }); + + it("1990: updating fails without the required parameter", async () => { + const update = { + statusCode: "finished", + statusMessage: "done", + jobResultObject: { + optionalParam: true + } + }; + + return request(appUrl) + .patch(`/api/v3/Jobs/${encodedJobIdValidate1}`) + .send(update) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.BadRequestStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.not.have.property("type") + res.body.should.have.property("message").and.be.equal("Invalid request. Requires 'jobResultObject.requiredParam'"); + }); + + }); + + it("2000: updating succeeds with the required parameter", async () => { + const update = { + statusCode: "finished", + statusMessage: "done", + jobResultObject: { + requiredParam: true + } + }; + + return request(appUrl) + .patch(`/api/v3/Jobs/${encodedJobIdValidate1}`) + .send(update) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulPatchStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.have.property("type").and.equal("validate"); + res.body.should.have.property("createdBy").and.equal("admin"); + res.body.should.have.property("jobParams").that.deep.equals({requiredParam: false}); + res.body.should.have.property("jobResultObject").that.deep.equals({requiredParam: true}); + }); + }); + }); diff --git a/test/TestData.js b/test/TestData.js index 538f657bf..1f135e7f6 100644 --- a/test/TestData.js +++ b/test/TestData.js @@ -694,62 +694,6 @@ const TestData = { ], }, - ArchiveJob: { - emailJobInitiator: "scicatarchivemanger@psi.ch", - type: "archive", - jobStatusMessage: "jobForwarded", - datasetList: [ - { - pid: "dummy", - files: [], - }, - { - pid: "dummy", - files: [], - }, - ], - jobResultObject: { - status: "okay", - message: "All systems okay", - }, - }, - - RetrieveJob: { - emailJobInitiator: "scicatarchivemanger@psi.ch", - type: "retrieve", - jobStatusMessage: "jobForwarded", - datasetList: [ - { - pid: "dummy", - files: [], - }, - { - pid: "dummy", - files: [], - }, - ], - jobResultObject: { - status: "okay", - message: "All systems okay", - }, - }, - - PublicJob: { - emailJobInitiator: "firstname.lastname@gmail.com", - type: "public", - jobStatusMessage: "jobSubmitted", - datasetList: [ - { - pid: "dummy", - files: [], - }, - { - pid: "dummy", - files: [], - }, - ], - }, - PublishedData: { creator: ["ESS"], publisher: "ESS", diff --git a/test/config/jobconfig.json b/test/config/jobconfig.json index 146043018..811729b04 100644 --- a/test/config/jobconfig.json +++ b/test/config/jobconfig.json @@ -68,6 +68,27 @@ "statusUpdate": { "auth": "@group5" } + }, + { + "jobType": "validate", + "create": { + "auth": "admin", + "actions": [ + { + "actionType": "validate", + "required": ["jobParams.requiredParam"] + } + ] + }, + "statusUpdate": { + "auth": "admin", + "actions": [ + { + "actionType": "validate", + "required": ["jobResultObject.requiredParam"] + } + ] + } } ] -} \ No newline at end of file +} From d4e9893841e36e36fb773d2510406e46a2fcf8ef Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Fri, 11 Oct 2024 17:18:54 +0200 Subject: [PATCH 08/16] Add type checking to ValidateAction - rename top-level array to 'request'. This leaves open the possibility to validate other things beside the DTO - now configuration takes the format of `"JSONPath": JSON-Schema`. The schema part is validated with Avj. Note that JSON Schemas can be very concise for simple datatypes, so this doesn't require deep knowledge of how to write JSONSchema. - Update unit & mocha tests --- src/jobs/actions/validateaction.spec.ts | 106 ++++++++-- src/jobs/actions/validateaction.ts | 81 ++++++-- src/jobs/config/jobconfig.spec.ts | 2 +- test/Jobs.js | 258 ++++++++++++++++-------- test/config/jobconfig.json | 27 ++- 5 files changed, 348 insertions(+), 126 deletions(-) diff --git a/src/jobs/actions/validateaction.spec.ts b/src/jobs/actions/validateaction.spec.ts index a27ee8cc7..8eccde013 100644 --- a/src/jobs/actions/validateaction.spec.ts +++ b/src/jobs/actions/validateaction.spec.ts @@ -1,26 +1,37 @@ import { ValidateAction } from "./validateaction"; import { CreateJobDto } from "../dto/create-job.dto"; -import { HttpException } from "@nestjs/common"; + +const createJobBase = { + type: "validate", + ownerUser: "owner", + ownerGroup: "group", + contactEmail: "email@example.com", +} describe("ValiateAction", () => { const config = { actionType: "validate", - required: ["jobParams.nonNull", "jobParams.datasetIds[0]"], + request: { + "jobParams.stringVal": {type: "string"}, + "jobParams.requiredArray[*]": {type: "string"}, + "jobParams.numberVal": {type: "number"}, + "jobParams": {"required": ["nonNull"]}, + }, }; const action = new ValidateAction(config); it("should be configured successfully", async () => { expect(action).toBeDefined(); }); + it("should pass if required params are present", async () => { const dto: CreateJobDto = { - type: "test", + ...createJobBase, jobParams: { + stringVal: "ok", + numberVal: 1, nonNull: "value1", - datasetIds: ["value2"], + requiredArray: ["ok"], }, - ownerUser: "owner", - ownerGroup: "group", - contactEmail: "email@example.com", }; await expect(action.validate(dto)).resolves.toBeUndefined(); @@ -28,30 +39,85 @@ describe("ValiateAction", () => { it("should fail if nonNull is missing", async () => { const dto: CreateJobDto = { - type: "test", + ...createJobBase, + jobParams: { + stringVal: "ok", + numberVal: 1, + //nonNull: "value1", + requiredArray: ["ok"], + }, + }; + + await expect(action.validate(dto)).rejects.toThrow("Invalid request. Invalid value for 'jobParams'"); + }); + + it("should fail if string type is wrong", async () => { + const dto: CreateJobDto = { + ...createJobBase, + jobParams: { + stringVal: 0xDEADBEEF, // wrong type + numberVal: 1, + nonNull: "value1", + requiredArray: ["ok"], + }, + }; + + await expect(action.validate(dto)).rejects.toThrow("Invalid request. Invalid value for 'jobParams.stringVal"); + }); + + it("should fail if number type is wrong", async () => { + const dto: CreateJobDto = { + ...createJobBase, jobParams: { - datasetIds: ["value2"], + stringVal: "ok", + numberVal: "error", + nonNull: "value1", + requiredArray: ["ok"], }, - ownerUser: "owner", - ownerGroup: "group", - contactEmail: "email@example.com", }; - await expect(action.validate(dto)).rejects.toThrowError(HttpException); + await expect(action.validate(dto)).rejects.toThrow("Invalid request. Invalid value for 'jobParams.numberVal'"); + }); + + + it("should fail if requiredArray is ommitted", async () => { + const dto: CreateJobDto = { + ...createJobBase, + jobParams: { + stringVal: "ok", + numberVal: 1, + nonNull: "value1", + //requiredArray: ["ok"], + }, + }; + + await expect(action.validate(dto)).rejects.toThrow("Invalid request. Requires 'jobParams.requiredArray[*]'"); + }); + + it("should fail if requiredArray is empty", async () => { + const dto: CreateJobDto = { + ...createJobBase, + jobParams: { + stringVal: "ok", + numberVal: 1, + nonNull: "value1", + requiredArray: [], + }, + }; + await expect(action.validate(dto)).rejects.toThrow("Invalid request. Requires 'jobParams.requiredArray[*]'"); }); - it("should fail if no datasets are given", async () => { + it("should fail if requiredArray has the wrong type", async () => { const dto: CreateJobDto = { - type: "test", + ...createJobBase, jobParams: { + stringVal: "ok", + numberVal: "error", nonNull: "value1", - datasetIds: [], + requiredArray: [0xDEADBEEF], }, - ownerUser: "owner", - ownerGroup: "group", - contactEmail: "email@example.com", }; - await expect(action.validate(dto)).rejects.toThrowError(HttpException); + await expect(action.validate(dto)).rejects.toThrow("Invalid request. Invalid value for 'jobParams.requiredArray[*]'"); }); }); diff --git a/src/jobs/actions/validateaction.ts b/src/jobs/actions/validateaction.ts index a3be84efb..b11bafa0b 100644 --- a/src/jobs/actions/validateaction.ts +++ b/src/jobs/actions/validateaction.ts @@ -22,33 +22,68 @@ import { import { JobAction, JobDto } from "../config/jobconfig"; import { JobClass } from "../schemas/job.schema"; import { JSONPath } from "jsonpath-plus"; +import Ajv, { ValidateFunction } from "ajv"; +/** + * Validates the job DTO for the presence of required fields. Can also check types or + * validate against a JSON Schema. + * + * ValidateAction is configured with a single parameter, `request`, which is checked + * against the request body (aka the DTO). The config file will look like this: + * + *
{
+ *   "actionType": "validate",
+ *   "request": {
+ *     "path": typecheck,
+ *     ...
+ *   }
+ * }
+ * + * Usually `path` will be a dot-delimited field in the DTO, eg. "jobParams.name". + * Technically it is a JSONPath-Plus expression; see https://github.com/JSONPath-Plus/JSONPath. + * + * Here are some example typecheck expressions: + *
{
+ *   "actionType": "validate",
+ *   "request": {
+ *     "name": { "type": "string"}, // match simple types
+ *     "answers[*]": { "enum": ["yes","no"]}, // literal values (here applied to an array)
+ *     "metadata": {"$ref": "https://json.schemastore.org/schema-org-thing.json"}, // JSON Schema
+ *   }
+ * }
+ */ export class ValidateAction implements JobAction { public static readonly actionType = "validate"; - private required: string[]; + private request: Record>; getActionType(): string { return ValidateAction.actionType; } async validate(dto: T) { - for (const path of this.required) { - try { - const result = JSONPath({ path: path, json: dto }); - if (result !== null && result?.length > 0) { - continue; - } - } catch (e) { - Logger.error(e); + for (const [path, schema] of Object.entries(this.request)) { + const result: any[] = JSONPath({ path: path, json: dto }); + if (result !== null && result?.length > 0) { + result.forEach((entry) => { + if(!schema(entry)) { + throw new HttpException( + { + status: HttpStatus.BAD_REQUEST, + message: `Invalid request. Invalid value for '${path}'`, + }, + HttpStatus.BAD_REQUEST, + ); + } + }); + } else { + throw new HttpException( + { + status: HttpStatus.BAD_REQUEST, + message: `Invalid request. Requires '${path}'`, + }, + HttpStatus.BAD_REQUEST, + ); } - - throw new HttpException( - { - status: HttpStatus.BAD_REQUEST, - message: `Invalid request. Requires '${path}'`, - }, - HttpStatus.BAD_REQUEST, - ); } } @@ -60,11 +95,17 @@ export class ValidateAction implements JobAction { async performJob(job: JobClass) {} constructor(data: Record) { - if (!("required" in data)) { + if (!("request" in data)) { throw new NotFoundException( - `Missing connection parameter in 'validate' action: 'required'`, + `Missing connection parameter in 'validate' action: 'request'`, ); } - this.required = data["required"] as string[]; + const request = data["request"] as Record; + + const ajv = new Ajv(); + this.request = Object.fromEntries( + Object.entries(request).map(([path, schema]) => + [path, ajv.compile(schema)]) + ); } } diff --git a/src/jobs/config/jobconfig.spec.ts b/src/jobs/config/jobconfig.spec.ts index 6e8cd3a74..a2d398ab1 100644 --- a/src/jobs/config/jobconfig.spec.ts +++ b/src/jobs/config/jobconfig.spec.ts @@ -14,7 +14,7 @@ describe("Job configuration", () => { const path = "test/config/jobconfig.json"; const config = await loadJobConfig(path); expect(config).toBeDefined(); - expect(config.length).toBe(7); + expect(config.length).toBe(8); expect(config[0].jobType).toBe("all_access"); expect(config[0].create).toBeDefined(); const create = config[0].create; diff --git a/test/Jobs.js b/test/Jobs.js index eec9e8363..e071f1811 100644 --- a/test/Jobs.js +++ b/test/Jobs.js @@ -3829,99 +3829,191 @@ describe("1100: Jobs: Test New Job Model", () => { }); }); - it("1970: validation fails without required parameters", async () => { - const newDataset = { - ...jobValidate, - jobParams: { - optionalParam: false, - }, - }; + describe("1970: Validate Job Action", () => { - return request(appUrl) - .post("/api/v3/Jobs") - .send(newDataset) - .set("Accept", "application/json") - .set({ Authorization: `Bearer ${accessTokenAdmin}` }) - .expect(TestData.BadRequestStatusCode) - .expect("Content-Type", /json/) - .then((res) => { - res.body.should.not.have.property("type") - res.body.should.have.property("message").and.be.equal("Invalid request. Requires 'jobParams.requiredParam'"); - }); - }); + it("1970: create validate job fails without required parameters", async () => { + const newDataset = { + ...jobValidate, + jobParams: { + optionalParam: false, + }, + }; + return request(appUrl) + .post("/api/v3/Jobs") + .send(newDataset) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.BadRequestStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.not.have.property("type") + res.body.should.have.property("message").and.be.equal("Invalid request. Requires 'jobParams.requiredParam'"); + }); + }); - it("1980: validation succeeds with the required parameter", async () => { - const newDataset = { - type: "validate", - jobParams: { - requiredParam: false, - }, - }; + it("1980: create validate job fails with the wrong types", async () => { + const newDataset = { + type: "validate", + jobParams: { + requiredParam: 123, + arrayOfStrings: ["ok"] + }, + }; - return request(appUrl) - .post("/api/v3/Jobs") - .send(newDataset) - .set("Accept", "application/json") - .set({ Authorization: `Bearer ${accessTokenAdmin}` }) - .expect(TestData.EntryCreatedStatusCode) - .expect("Content-Type", /json/) - .then((res) => { - res.body.should.have.property("type").and.equal("validate"); - res.body.should.have.property("createdBy").and.equal("admin"); - res.body.should.have.property("jobParams").that.deep.equals({requiredParam: false}); + return request(appUrl) + .post("/api/v3/Jobs") + .send(newDataset) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.BadRequestStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.not.have.property("type") + res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for 'jobParams.requiredParam'"); + }); + }); + it("1981: create validate job fails with the wrong types", async () => { + const newDataset = { + type: "validate", + jobParams: { + requiredParam: "ok", + arrayOfStrings: "bad" + }, + }; - jobIdValidate1 = res.body["id"]; - encodedJobIdValidate1 = encodeURIComponent(jobIdValidate1); - }); - }); + return request(appUrl) + .post("/api/v3/Jobs") + .send(newDataset) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.BadRequestStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.not.have.property("type") + res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for 'jobParams.arrayOfStrings'"); + }); + }); + it("1982: create validate job fails with the wrong types", async () => { + const newDataset = { + type: "validate", + jobParams: { + requiredParam: "ok", + arrayOfStrings: [123] + }, + }; - it("1990: updating fails without the required parameter", async () => { - const update = { - statusCode: "finished", - statusMessage: "done", - jobResultObject: { - optionalParam: true - } - }; + return request(appUrl) + .post("/api/v3/Jobs") + .send(newDataset) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.BadRequestStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.not.have.property("type") + res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for 'jobParams.arrayOfStrings[*]'"); + }); + }); - return request(appUrl) - .patch(`/api/v3/Jobs/${encodedJobIdValidate1}`) - .send(update) - .set("Accept", "application/json") - .set({ Authorization: `Bearer ${accessTokenAdmin}` }) - .expect(TestData.BadRequestStatusCode) - .expect("Content-Type", /json/) - .then((res) => { - res.body.should.not.have.property("type") - res.body.should.have.property("message").and.be.equal("Invalid request. Requires 'jobResultObject.requiredParam'"); - }); + it("1985: create validate succeeds with the right types", async () => { + const newDataset = { + type: "validate", + jobParams: { + requiredParam: "ok", + arrayOfStrings: ["ok"] + }, + }; - }); + return request(appUrl) + .post("/api/v3/Jobs") + .send(newDataset) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + //.expect(TestData.EntryCreatedStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.have.property("type").and.equal("validate"); + res.body.should.have.property("createdBy").and.equal("admin"); + res.body.should.have.property("jobParams").that.deep.equals(newDataset.jobParams); - it("2000: updating succeeds with the required parameter", async () => { - const update = { - statusCode: "finished", - statusMessage: "done", - jobResultObject: { - requiredParam: true - } - }; + jobIdValidate1 = res.body["id"]; + encodedJobIdValidate1 = encodeURIComponent(jobIdValidate1); + }); + }); - return request(appUrl) - .patch(`/api/v3/Jobs/${encodedJobIdValidate1}`) - .send(update) - .set("Accept", "application/json") - .set({ Authorization: `Bearer ${accessTokenAdmin}` }) - .expect(TestData.SuccessfulPatchStatusCode) - .expect("Content-Type", /json/) - .then((res) => { - res.body.should.have.property("type").and.equal("validate"); - res.body.should.have.property("createdBy").and.equal("admin"); - res.body.should.have.property("jobParams").that.deep.equals({requiredParam: false}); - res.body.should.have.property("jobResultObject").that.deep.equals({requiredParam: true}); - }); - }); + it("1990: update validate fails without the required parameters", async () => { + const update = { + statusCode: "finished", + statusMessage: "done", + jobResultObject: { + requiredParam: "ok", + arrayOfStringsMissing: ["fail"] + } + }; + return request(appUrl) + .patch(`/api/v3/Jobs/${encodedJobIdValidate1}`) + .send(update) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.BadRequestStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.not.have.property("type") + res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for '$'"); + }); + + }); + + it("1991: update validate fails with incorrect types", async () => { + const update = { + statusCode: "finished", + statusMessage: "done", + jobResultObject: { + requiredParam: "ok", + arrayOfStringsMissing: [123] + } + }; + return request(appUrl) + .patch(`/api/v3/Jobs/${encodedJobIdValidate1}`) + .send(update) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.BadRequestStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.not.have.property("type") + res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for '$'"); + }); + + }); + + + it("2000: updating validate succeeds with the required parameters", async () => { + const update = { + statusCode: "finished", + statusMessage: "done", + jobResultObject: { + requiredParam: "ok", + arrayOfStrings: ["ok"] + } + }; + + return request(appUrl) + .patch(`/api/v3/Jobs/${encodedJobIdValidate1}`) + .send(update) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulPatchStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.have.property("type").and.equal("validate"); + res.body.should.have.property("createdBy").and.equal("admin"); + res.body.should.have.property("jobParams").that.deep.equals(update.jobResultObject); + res.body.should.have.property("jobResultObject").that.deep.equals(update.jobResultObject); + }); + }); + }); }); diff --git a/test/config/jobconfig.json b/test/config/jobconfig.json index 811729b04..1139a3c40 100644 --- a/test/config/jobconfig.json +++ b/test/config/jobconfig.json @@ -76,7 +76,15 @@ "actions": [ { "actionType": "validate", - "required": ["jobParams.requiredParam"] + "request": { + "jobParams.requiredParam": {"type":"string"}, + "jobParams.arrayOfStrings": { + "type":"array", + "items":{ + "type":"string" + } + } + } } ] }, @@ -85,7 +93,22 @@ "actions": [ { "actionType": "validate", - "required": ["jobResultObject.requiredParam"] + "request": { + "$": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "required": ["jobResultObject"], + "properties": { + "jobResultObject":{ + "type":"object", + "required": ["requiredParam", "arrayOfStrings"], + "properties": { + "requiredParam":{"type":"string"}, + "arrayOfStrings":{"type":"array","items":{"type":"string"}} + } + } + } + } + } } ] } From 7406107805c8e75d0b00ed63a73a41c25842534f Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Fri, 11 Oct 2024 21:28:41 +0200 Subject: [PATCH 09/16] Lint fixes - remove 'any' via typeguard - `npm run lint:fix` - remove duplicate (and outdated) docstring --- src/jobs/actions/validateaction.spec.ts | 39 ++++++++++++++--------- src/jobs/actions/validateaction.ts | 42 +++++++++---------------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/jobs/actions/validateaction.spec.ts b/src/jobs/actions/validateaction.spec.ts index 8eccde013..2897f595b 100644 --- a/src/jobs/actions/validateaction.spec.ts +++ b/src/jobs/actions/validateaction.spec.ts @@ -6,16 +6,16 @@ const createJobBase = { ownerUser: "owner", ownerGroup: "group", contactEmail: "email@example.com", -} +}; describe("ValiateAction", () => { const config = { actionType: "validate", request: { - "jobParams.stringVal": {type: "string"}, - "jobParams.requiredArray[*]": {type: "string"}, - "jobParams.numberVal": {type: "number"}, - "jobParams": {"required": ["nonNull"]}, + "jobParams.stringVal": { type: "string" }, + "jobParams.requiredArray[*]": { type: "string" }, + "jobParams.numberVal": { type: "number" }, + jobParams: { required: ["nonNull"] }, }, }; const action = new ValidateAction(config); @@ -48,21 +48,25 @@ describe("ValiateAction", () => { }, }; - await expect(action.validate(dto)).rejects.toThrow("Invalid request. Invalid value for 'jobParams'"); + await expect(action.validate(dto)).rejects.toThrow( + "Invalid request. Invalid value for 'jobParams'", + ); }); it("should fail if string type is wrong", async () => { const dto: CreateJobDto = { ...createJobBase, jobParams: { - stringVal: 0xDEADBEEF, // wrong type + stringVal: 0xdeadbeef, // wrong type numberVal: 1, nonNull: "value1", requiredArray: ["ok"], }, }; - await expect(action.validate(dto)).rejects.toThrow("Invalid request. Invalid value for 'jobParams.stringVal"); + await expect(action.validate(dto)).rejects.toThrow( + "Invalid request. Invalid value for 'jobParams.stringVal", + ); }); it("should fail if number type is wrong", async () => { @@ -76,10 +80,11 @@ describe("ValiateAction", () => { }, }; - await expect(action.validate(dto)).rejects.toThrow("Invalid request. Invalid value for 'jobParams.numberVal'"); + await expect(action.validate(dto)).rejects.toThrow( + "Invalid request. Invalid value for 'jobParams.numberVal'", + ); }); - it("should fail if requiredArray is ommitted", async () => { const dto: CreateJobDto = { ...createJobBase, @@ -91,7 +96,9 @@ describe("ValiateAction", () => { }, }; - await expect(action.validate(dto)).rejects.toThrow("Invalid request. Requires 'jobParams.requiredArray[*]'"); + await expect(action.validate(dto)).rejects.toThrow( + "Invalid request. Requires 'jobParams.requiredArray[*]'", + ); }); it("should fail if requiredArray is empty", async () => { @@ -104,7 +111,9 @@ describe("ValiateAction", () => { requiredArray: [], }, }; - await expect(action.validate(dto)).rejects.toThrow("Invalid request. Requires 'jobParams.requiredArray[*]'"); + await expect(action.validate(dto)).rejects.toThrow( + "Invalid request. Requires 'jobParams.requiredArray[*]'", + ); }); it("should fail if requiredArray has the wrong type", async () => { @@ -114,10 +123,12 @@ describe("ValiateAction", () => { stringVal: "ok", numberVal: "error", nonNull: "value1", - requiredArray: [0xDEADBEEF], + requiredArray: [0xdeadbeef], }, }; - await expect(action.validate(dto)).rejects.toThrow("Invalid request. Invalid value for 'jobParams.requiredArray[*]'"); + await expect(action.validate(dto)).rejects.toThrow( + "Invalid request. Invalid value for 'jobParams.requiredArray[*]'", + ); }); }); diff --git a/src/jobs/actions/validateaction.ts b/src/jobs/actions/validateaction.ts index b11bafa0b..2dde5821c 100644 --- a/src/jobs/actions/validateaction.ts +++ b/src/jobs/actions/validateaction.ts @@ -1,24 +1,4 @@ -/** - * Validates job DTOs at runtime - * - * This allows validation of untyped portions of the request body to be configured - * in the jobconfig file. - * - * Example config: - *
{
- *   "actionType": "validate",
- *   "required": ["jobParms.datasetIds"]
- * }
- * - * Each element of the "required" array is a JSONPath expression that must be present in - * the request body. - */ -import { - HttpException, - HttpStatus, - Logger, - NotFoundException, -} from "@nestjs/common"; +import { HttpException, HttpStatus, NotFoundException } from "@nestjs/common"; import { JobAction, JobDto } from "../config/jobconfig"; import { JobClass } from "../schemas/job.schema"; import { JSONPath } from "jsonpath-plus"; @@ -62,10 +42,10 @@ export class ValidateAction implements JobAction { async validate(dto: T) { for (const [path, schema] of Object.entries(this.request)) { - const result: any[] = JSONPath({ path: path, json: dto }); + const result: unknown[] = JSONPath({ path: path, json: dto }); if (result !== null && result?.length > 0) { result.forEach((entry) => { - if(!schema(entry)) { + if (!schema(entry)) { throw new HttpException( { status: HttpStatus.BAD_REQUEST, @@ -100,12 +80,20 @@ export class ValidateAction implements JobAction { `Missing connection parameter in 'validate' action: 'request'`, ); } - const request = data["request"] as Record; + const request = data["request"] as Record; - const ajv = new Ajv(); + const ajv = new Ajv({ + strictSchema: false, + strictTypes: false, + }); this.request = Object.fromEntries( - Object.entries(request).map(([path, schema]) => - [path, ajv.compile(schema)]) + Object.entries(request).map(([path, schema]) => { + if (typeof schema !== "object" || schema === null) { + throw new Error("Schema must be a valid object."); + } + + return [path, ajv.compile(schema)]; + }), ); } } From ac17956cbd518601933dd29db2a566b478475f64 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Fri, 11 Oct 2024 22:13:06 +0200 Subject: [PATCH 10/16] Merge branch 'release-jobs' into validateaction --- src/common/utils.ts | 28 +- src/jobs/config/jobConfig.updateExample.json | 2 +- src/jobs/interfaces/job-filters.interface.ts | 28 + src/jobs/jobs.controller.ts | 190 +++- src/jobs/jobs.service.ts | 7 +- src/jobs/schemas/job.schema.ts | 2 +- test/Jobs.js | 988 ++++++++++++------- test/config/jobconfig.json | 2 +- 8 files changed, 891 insertions(+), 356 deletions(-) create mode 100644 src/jobs/interfaces/job-filters.interface.ts diff --git a/src/common/utils.ts b/src/common/utils.ts index 0103b6506..44b4c7bbb 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -873,9 +873,6 @@ export const filterDescription = export const fullQueryExampleLimits = '{"limit": 1, "skip": 1, "order": "creationTime:desc"}'; -export const datasetsFullQueryExampleFields = - '{"mode":{},"ownerGroup":["group1"],"scientific":[{"lhs":"sample","relation":"EQUAL_TO_STRING","rhs":"my sample"},{"lhs":"temperature","relation":"GREATER_THAN","rhs":10,"unit":"celsius"}]}'; - export const fullQueryDescriptionLimits = '
\n \
 {\n \
@@ -885,6 +882,9 @@ export const fullQueryDescriptionLimits =
 }\n \
 
'; +export const datasetsFullQueryExampleFields = + '{"mode":{},"ownerGroup":["group1"],"scientific":[{"lhs":"sample","relation":"EQUAL_TO_STRING","rhs":"my sample"},{"lhs":"temperature","relation":"GREATER_THAN","rhs":10,"unit":"celsius"}]}'; + export const datasetsFullQueryDescriptionFields = '
\n  \
 {\n \
@@ -917,6 +917,28 @@ export const datasetsFullQueryDescriptionFields =
 }\n \
   
'; +export const jobsFullQueryExampleFields = + '{"ownerGroup":["group1"], "statusCode": "jobCreated"}'; + +export const jobsFullQueryDescriptionFields = + '
\n  \
+{\n \
+  "createdBy": string, \n \
+  "updatedBy": string, \n \
+  "createdAt": { \n \
+    "begin": string,\n \
+    "end": string,\n \
+  },\n \
+  "ownerGroup": string, \n \
+  "accessGroups": ["group1", ...], \n \
+  "type": string, \n \
+  "id": string, \n \
+  "statusCode": string, \n \
+  "statusMessage": string, \n \
+  ... \n \
+}\n \
+  
'; + export const proposalsFullQueryExampleFields = '{"text": "some text", "proposalId": "proposal_id"}'; diff --git a/src/jobs/config/jobConfig.updateExample.json b/src/jobs/config/jobConfig.updateExample.json index a537421ef..8ce757e5a 100644 --- a/src/jobs/config/jobConfig.updateExample.json +++ b/src/jobs/config/jobConfig.updateExample.json @@ -18,7 +18,7 @@ { "actionType": "validate", "jobParamsSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "datasetIds": { diff --git a/src/jobs/interfaces/job-filters.interface.ts b/src/jobs/interfaces/job-filters.interface.ts new file mode 100644 index 000000000..545d8f86e --- /dev/null +++ b/src/jobs/interfaces/job-filters.interface.ts @@ -0,0 +1,28 @@ +interface IDateRange { + begin: string; + end: string; +} + +interface IJobFieldObject { + $regex: string; + $options: string; +} + +interface IJobIdsFieldObject { + $in: string[]; +} + +export interface IJobFields { + mode?: Record; + text?: string; + createdAt?: IDateRange; + id?: IJobFieldObject; + _id?: IJobIdsFieldObject; + type?: IJobFieldObject; + statusCode?: IJobFieldObject; + jobParams?: IJobFieldObject; + jobResultObject?: IJobFieldObject; + ownerUser?: IJobFieldObject; + ownerGroup?: string[]; + accessGroups?: string[]; +} diff --git a/src/jobs/jobs.controller.ts b/src/jobs/jobs.controller.ts index d612ccef3..262607f58 100644 --- a/src/jobs/jobs.controller.ts +++ b/src/jobs/jobs.controller.ts @@ -32,7 +32,7 @@ import { ApiResponse, ApiTags, } from "@nestjs/swagger"; -import { IFilters } from "src/common/interfaces/common.interface"; +import { IFacets, IFilters } from "src/common/interfaces/common.interface"; import { DatasetsService } from "src/datasets/datasets.service"; import { JobsConfigSchema } from "./types/jobs-config-schema.enum"; import configuration from "src/config/configuration"; @@ -44,8 +44,13 @@ import { UsersService } from "src/users/users.service"; import { filterDescriptionSimplified, filterExampleSimplified, + fullQueryDescriptionLimits, + fullQueryExampleLimits, + jobsFullQueryExampleFields, + jobsFullQueryDescriptionFields, } from "src/common/utils"; import { JobAction, JobDto, JobConfig } from "./config/jobconfig"; +import { IJobFields } from "./interfaces/job-filters.interface"; @ApiBearerAuth() @ApiTags("jobs") @@ -650,19 +655,6 @@ export class JobsController { @Body() createJobDto: CreateJobDto, ): Promise { Logger.log("Creating job!"); - // throw an error if no jobParams are passed - if ( - !createJobDto.jobParams || - Object.keys(createJobDto.jobParams).length == 0 - ) { - throw new HttpException( - { - status: HttpStatus.BAD_REQUEST, - message: "Job parameters need to be defined.", - }, - HttpStatus.BAD_REQUEST, - ); - } // Validate that request matches the current configuration // Check job authorization const jobInstance = await this.instanceAuthorizationJobCreate( @@ -750,6 +742,171 @@ export class JobsController { return updatedJob; } + /** + * Get fullquery + */ + @UseGuards(PoliciesGuard) + @CheckPolicies("jobs", (ability: AppAbility) => + ability.can(Action.JobRead, JobClass), + ) + @Get("/fullquery") + @ApiOperation({ + summary: "It returns a list of jobs matching the query provided.", + description: "It returns a list of jobs matching the query provided.", + }) + @ApiQuery({ + name: "fields", + description: + "Filters to apply when retrieving jobs.\n" + + jobsFullQueryDescriptionFields, + required: false, + type: String, + example: jobsFullQueryExampleFields, + }) + @ApiQuery({ + name: "limits", + description: + "Define further query parameters like skip, limit, order.\n" + + fullQueryDescriptionLimits, + required: false, + type: String, + example: fullQueryExampleLimits, + }) + @ApiResponse({ + status: HttpStatus.OK, + type: [JobClass], + description: "Return jobs requested.", + }) + async fullQuery( + @Req() request: Request, + @Query() filters: { fields?: string; limits?: string }, + ): Promise { + try { + const parsedFilters: IFilters> = { + fields: JSON.parse(filters.fields ?? ("{}" as string)), + limits: JSON.parse(filters.limits ?? ("{}" as string)), + }; + const jobsFound = await this.jobsService.fullquery(parsedFilters); + const jobsAccessible: JobClass[] = []; + + // for each job run a casl JobReadOwner on a jobInstance + if (jobsFound != null) { + for (const i in jobsFound) { + const jobConfiguration = this.getJobTypeConfiguration( + jobsFound[i].type, + ); + const ability = this.caslAbilityFactory.jobsInstanceAccess( + request.user as JWTUser, + jobConfiguration, + ); + // check if the user can get this job + const jobInstance = await this.generateJobInstanceForPermissions( + jobsFound[i], + ); + const canRead = + ability.can(Action.JobReadAny, JobClass) || + ability.can(Action.JobReadAccess, jobInstance); + if (canRead) { + jobsAccessible.push(jobsFound[i]); + } + } + } + return jobsAccessible; + } catch (e) { + throw new HttpException( + { + status: HttpStatus.BAD_REQUEST, + message: (e as Error).message, + }, + HttpStatus.BAD_REQUEST, + ); + } + } + + /** + * Get fullfacet + */ + @UseGuards(PoliciesGuard) + @CheckPolicies("jobs", (ability: AppAbility) => + ability.can(Action.JobRead, JobClass), + ) + @Get("/fullfacet") + @ApiOperation({ + summary: "It returns a list of job facets matching the filter provided.", + description: + "It returns a list of job facets matching the filter provided.", + }) + @ApiQuery({ + name: "fields", + description: + "Define the filter conditions by specifying the name of values of fields requested.", + required: false, + type: String, + }) + @ApiQuery({ + name: "facets", + description: + "Define a list of field names, for which facet counts should be calculated.", + required: false, + type: String, + }) + @ApiResponse({ + status: HttpStatus.OK, + type: [JobClass], + description: "Return jobs requested.", + }) + async fullFacet( + @Req() request: Request, + @Query() filters: { fields?: string; facets?: string }, + ): Promise[]> { + try { + const fields: IJobFields = JSON.parse(filters.fields ?? ("{}" as string)); + const queryFilters: IFilters> = { + fields: fields, + limits: JSON.parse("{}" as string), + }; + const jobsFound = await this.jobsService.fullquery(queryFilters); + const jobIdsAccessible: string[] = []; + + // for each job run a casl JobReadOwner on a jobInstance + if (jobsFound != null) { + for (const i in jobsFound) { + const jobConfiguration = this.getJobTypeConfiguration( + jobsFound[i].type, + ); + const ability = this.caslAbilityFactory.jobsInstanceAccess( + request.user as JWTUser, + jobConfiguration, + ); + // check if the user can get this job + const jobInstance = await this.generateJobInstanceForPermissions( + jobsFound[i], + ); + const canRead = + ability.can(Action.JobReadAny, JobClass) || + ability.can(Action.JobReadAccess, jobInstance); + if (canRead) { + jobIdsAccessible.push(jobsFound[i]._id); + } + } + } + fields._id = { $in: jobIdsAccessible }; + const facetFilters: IFacets = { + fields: fields, + facets: JSON.parse(filters.facets ?? ("[]" as string)), + }; + return await this.jobsService.fullfacet(facetFilters); + } catch (e) { + throw new HttpException( + { + status: HttpStatus.BAD_REQUEST, + message: (e as Error).message, + }, + HttpStatus.BAD_REQUEST, + ); + } + } + /** * Get job by id */ @@ -856,10 +1013,10 @@ export class JobsController { const jobInstance = await this.generateJobInstanceForPermissions( jobsFound[i], ); - const canCreate = + const canRead = ability.can(Action.JobReadAny, JobClass) || ability.can(Action.JobReadAccess, jobInstance); - if (canCreate) { + if (canRead) { jobsAccessible.push(jobsFound[i]); } } @@ -906,7 +1063,6 @@ export class JobsController { HttpStatus.BAD_REQUEST, ); } - Logger.log(`Deleting job with id ${id}!`); return this.jobsService.remove({ _id: id }); } diff --git a/src/jobs/jobs.service.ts b/src/jobs/jobs.service.ts index 8e593df6e..bce201ad3 100644 --- a/src/jobs/jobs.service.ts +++ b/src/jobs/jobs.service.ts @@ -22,6 +22,7 @@ import { import { CreateJobDto } from "./dto/create-job.dto"; import { StatusUpdateJobDto } from "./dto/status-update-job.dto"; import { JobClass, JobDocument } from "./schemas/job.schema"; +import { IJobFields } from "./interfaces/job-filters.interface"; @Injectable({ scope: Scope.REQUEST }) export class JobsService { @@ -43,8 +44,8 @@ export class JobsService { const createdJob = new this.jobModel( addStatusFields( addCreatedByFields(createJobDto, username), - "Job has been created.", "jobCreated", + "Job has been created.", {}, ), ); @@ -76,14 +77,14 @@ export class JobsService { } async fullfacet( - filters: IFacets>, + filters: IFacets, ): Promise[]> { const fields = filters.fields ?? {}; const facets = filters.facets ?? []; const pipeline: PipelineStage[] = createFullfacetPipeline< JobDocument, - FilterQuery + IJobFields >(this.jobModel, "id", fields, facets); return await this.jobModel.aggregate(pipeline).exec(); diff --git a/src/jobs/schemas/job.schema.ts b/src/jobs/schemas/job.schema.ts index 70cefff07..465de79da 100644 --- a/src/jobs/schemas/job.schema.ts +++ b/src/jobs/schemas/job.schema.ts @@ -9,7 +9,7 @@ export type JobDocument = JobClass & Document; @Schema({ collection: "Job", minimize: false, - timestamps: { createdAt: "DateTime", updatedAt: false }, + timestamps: true, toJSON: { getters: true, }, diff --git a/test/Jobs.js b/test/Jobs.js index e071f1811..6df99c552 100644 --- a/test/Jobs.js +++ b/test/Jobs.js @@ -302,7 +302,7 @@ describe("1100: Jobs: Test New Job Model", () => { }); }); - it("0065: Add a new job as a user from ADMIN_GROUPS for himself/herself in '#datasetPublic' configuration with empty jobParams parameter, which should fail", async () => { + it("0065: Add a new job as a user from ADMIN_GROUPS for himself/herself in '#datasetPublic' configuration with empty jobParams parameter", async () => { const newDataset = { type: "all_access", ownerUser: "admin", @@ -316,11 +316,13 @@ describe("1100: Jobs: Test New Job Model", () => { .send(newDataset) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) - .expect(TestData.BadRequestStatusCode) + .expect(TestData.EntryCreatedStatusCode) .expect("Content-Type", /json/) .then((res) => { - res.body.should.not.have.property("id"); - res.body.should.have.property("message").and.be.equal("Job parameters need to be defined."); + res.body.should.have.property("type").and.be.string; + res.body.should.have.property("ownerGroup").and.be.equal("admin"); + res.body.should.have.property("ownerUser").and.be.equal("admin"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -346,7 +348,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobId1 = res.body["id"]; encodedJobId1 = encodeURIComponent(jobId1); }); @@ -374,7 +376,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobId2 = res.body["id"]; encodedJobId2 = encodeURIComponent(jobId2); }); @@ -401,7 +403,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobId3 = res.body["id"]; encodedJobId3 = encodeURIComponent(jobId3); }); @@ -427,7 +429,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerGroup"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobId6 = res.body["id"]; encodedJobId6 = encodeURIComponent(jobId6); }); @@ -455,7 +457,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -480,7 +482,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -575,7 +577,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobId4 = res.body["id"]; encodedJobId4 = encodeURIComponent(jobId4); }); @@ -602,7 +604,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobId5 = res.body["id"]; encodedJobId5 = encodeURIComponent(jobId5); }); @@ -696,7 +698,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerUser"); res.body.should.not.have.property("ownerGroup"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -744,7 +746,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -770,7 +772,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -796,7 +798,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -821,7 +823,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -845,7 +847,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerGroup"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -871,7 +873,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -897,7 +899,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -923,7 +925,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -970,7 +972,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerUser"); res.body.should.not.have.property("ownerGroup"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1017,7 +1019,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1043,7 +1045,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); it("0360: Add a new job as a user from ADMIN_GROUPS for another group in '#authenticated' configuration", async () => { @@ -1067,7 +1069,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1091,7 +1093,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerGroup"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1117,7 +1119,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1143,7 +1145,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1190,7 +1192,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroup1 = res.body["id"]; encodedJobIdGroup1 = encodeURIComponent(jobIdGroup1); }); @@ -1218,7 +1220,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroup2 = res.body["id"]; encodedJobIdGroup2 = encodeURIComponent(jobIdGroup2); }); @@ -1245,7 +1247,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroup3 = res.body["id"]; encodedJobIdGroup3 = encodeURIComponent(jobIdGroup3); }); @@ -1272,7 +1274,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroup5 = res.body["id"]; encodedJobIdGroup5 = encodeURIComponent(jobIdGroup5); }); @@ -1298,7 +1300,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerGroup"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroup6 = res.body["id"]; encodedJobIdGroup6 = encodeURIComponent(jobIdGroup6); }); @@ -1326,7 +1328,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1352,7 +1354,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1401,7 +1403,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroup4 = res.body["id"]; encodedJobIdGroup4 = encodeURIComponent(jobIdGroup4); }); @@ -1453,7 +1455,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUser1 = res.body["id"]; encodedJobIdUser1 = encodeURIComponent(jobIdUser1); }); @@ -1481,7 +1483,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1507,7 +1509,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUser2 = res.body["id"]; encodedJobIdUser2 = encodeURIComponent(jobIdUser2); }); @@ -1534,7 +1536,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUser3 = res.body["id"]; encodedJobIdUser3 = encodeURIComponent(jobIdUser3); }); @@ -1561,7 +1563,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUser5 = res.body["id"]; encodedJobIdUser5 = encodeURIComponent(jobIdUser5); }); @@ -1587,7 +1589,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerGroup"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUser6 = res.body["id"]; encodedJobIdUser6 = encodeURIComponent(jobIdUser6); }); @@ -1615,7 +1617,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1641,7 +1643,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1667,7 +1669,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUser4 = res.body["id"]; encodedJobIdUser4 = encodeURIComponent(jobIdUser4); }); @@ -1719,7 +1721,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUserSpec1 = res.body["id"]; encodedJobIdUserSpec1 = encodeURIComponent(jobIdUserSpec1); }); @@ -1747,7 +1749,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUserSpec2 = res.body["id"]; encodedJobIdUserSpec2 = encodeURIComponent(jobIdUserSpec2); }); @@ -1774,7 +1776,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUserSpec3 = res.body["id"]; encodedJobIdUserSpec3 = encodeURIComponent(jobIdUserSpec3); }); @@ -1801,7 +1803,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUserSpec5 = res.body["id"]; encodedJobIdUserSpec5 = encodeURIComponent(jobIdUserSpec5); }); @@ -1829,7 +1831,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.2"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUserSpec7 = res.body["id"]; encodedJobIdUserSpec7 = encodeURIComponent(jobIdUserSpec7); }); @@ -1856,7 +1858,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerGroup"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUserSpec6 = res.body["id"]; encodedJobIdUserSpec6 = encodeURIComponent(jobIdUserSpec6); }); @@ -1884,7 +1886,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -1934,7 +1936,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdUserSpec4 = res.body["id"]; encodedJobIdUserSpec4 = encodeURIComponent(jobIdUserSpec4); }); @@ -1961,7 +1963,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -2011,7 +2013,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("admin"); res.body.should.have.property("ownerUser").and.be.equal("admin"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroupSpec1 = res.body["id"]; encodedJobIdGroupSpec1 = encodeURIComponent(jobIdGroupSpec1); }); @@ -2039,7 +2041,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroupSpec2 = res.body["id"]; encodedJobIdGroupSpec2 = encodeURIComponent(jobIdGroupSpec2); }); @@ -2066,7 +2068,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroupSpec3 = res.body["id"]; encodedJobIdGroupSpec3 = encodeURIComponent(jobIdGroupSpec3); }); @@ -2093,7 +2095,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroupSpec5 = res.body["id"]; encodedJobIdGroupSpec5 = encodeURIComponent(jobIdGroupSpec5); }); @@ -2121,7 +2123,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group3"); res.body.should.have.property("ownerUser").and.be.equal("user3"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroupSpec8 = res.body["id"]; encodedJobIdGroupSpec8 = encodeURIComponent(jobIdGroupSpec8); }); @@ -2147,7 +2149,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.not.have.property("ownerGroup"); res.body.should.not.have.property("ownerUser"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroupSpec6 = res.body["id"]; encodedJobIdGroupSpec6 = encodeURIComponent(jobIdGroupSpec6); }); @@ -2175,7 +2177,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group1"); res.body.should.have.property("ownerUser").and.be.equal("user1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -2225,7 +2227,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroupSpec4 = res.body["id"]; encodedJobIdGroupSpec4 = encodeURIComponent(jobIdGroupSpec4); }); @@ -2252,7 +2254,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.1"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); }); }); @@ -2278,7 +2280,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("type").and.be.string; res.body.should.have.property("ownerGroup").and.be.equal("group5"); res.body.should.have.property("ownerUser").and.be.equal("user5.2"); - res.body.should.have.property("statusMessage").to.be.equal("jobCreated"); + res.body.should.have.property("statusCode").to.be.equal("jobCreated"); jobIdGroupSpec7 = res.body["id"]; encodedJobIdGroupSpec7 = encodeURIComponent(jobIdGroupSpec7); }); @@ -2311,9 +2313,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0780: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2324,9 +2326,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0790: Adds a Status update to a job as a user from ADMIN_GROUPS for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2337,9 +2339,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0800: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2350,9 +2352,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0810: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2361,12 +2363,11 @@ describe("1100: Jobs: Test New Job Model", () => { }); it("0820: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#all' configuration", async () => { - return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2377,9 +2378,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0830: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2390,9 +2391,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0840: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2403,9 +2404,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0850: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2416,9 +2417,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0860: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2429,9 +2430,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0870: Adds a Status update to a job as a normal user for his/her job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2442,9 +2443,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0880: Adds a Status update to a job as a normal user for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2455,9 +2456,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0890: Adds a Status update to a job as a normal user for his/her group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2468,9 +2469,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0900: Adds a Status update to a job as a normal user for another user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2481,9 +2482,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0910: Adds a Status update to a job as a normal user for anonymous user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2494,9 +2495,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0920: Adds a Status update to a job as unauthhenticated user for anonymous job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.SuccessfulPatchStatusCode) @@ -2506,9 +2507,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0930: Adds a Status update to a job as unauthhenticated user for anouther group's job in '#all' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2518,9 +2519,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0940: Adds a Status update to a job as unauthhenticated user for another user's job in '#all' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2530,9 +2531,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0950: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2543,9 +2544,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0960: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2556,9 +2557,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0970: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2569,9 +2570,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0980: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2582,9 +2583,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0990: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2595,9 +2596,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1000: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2608,9 +2609,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1010: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2621,9 +2622,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1020: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2634,9 +2635,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1030: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2647,9 +2648,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1040: Adds a Status update to a job as a normal user for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2660,9 +2661,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1050: Adds a Status update to a job as a normal user for another user's job in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2673,9 +2674,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1060: Adds a Status update to a job as a normal user for his/her group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2686,9 +2687,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1070: Adds a Status update to a job as a normal user for another user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2699,9 +2700,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1080: Adds a Status update to a job as a normal user for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2712,9 +2713,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1090: Adds a Status update to a job as unauthhenticated user for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2724,9 +2725,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1100: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2737,9 +2738,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1110: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2750,9 +2751,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1120: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2763,9 +2764,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1130: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2777,9 +2778,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1140: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2789,9 +2790,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1150: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2801,9 +2802,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1160: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2813,9 +2814,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1170: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2826,9 +2827,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1180: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2839,9 +2840,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1190: Adds a Status update to a job as a normal user for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2852,9 +2853,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1200: Adds a Status update to a job as a normal user for another user's job in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2865,9 +2866,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1210: Adds a Status update to a job as a normal user for his/her group in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2878,9 +2879,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1220: Adds a Status update to a job as a normal user for another user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2891,9 +2892,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1230: Adds a Status update to a job as a normal user for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2904,9 +2905,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1240: Adds a Status update to a job as unauthhenticated user for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2916,9 +2917,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1250: Adds a Status update to a job as a user from ADMIN_GROUPS for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2929,9 +2930,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1260: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2942,9 +2943,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1270: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2955,9 +2956,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1280: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2968,9 +2969,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1290: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2981,9 +2982,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1300: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2994,9 +2995,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1310: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3007,9 +3008,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1320: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3020,9 +3021,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1330: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3033,9 +3034,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1340: Adds a Status update to a job as user5.1 for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3046,9 +3047,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1350: Adds a Status update to a job as user5.1 for another user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3059,9 +3060,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1360: Adds a Status update to a job as user5.1 for his/her group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3072,9 +3073,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1370: Adds a Status update to a job as user5.1 for another user's group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3085,9 +3086,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1380: Adds a Status update to a job as user5.1 for anonymous user's group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3098,9 +3099,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1390: Adds a Status update to a job as user5.2 for his/her job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec7}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3111,9 +3112,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1400: Adds a Status update to a job as user5.2 for user's 5.1 in same group job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3124,9 +3125,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1410: Adds a Status update to a job as user5.2 for another user in his/her group job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3137,9 +3138,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1420: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec1}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3150,9 +3151,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1430: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3163,9 +3164,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1440: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3176,9 +3177,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1450: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3189,9 +3190,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1460: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3202,9 +3203,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1470: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3215,9 +3216,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1480: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec3}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3228,9 +3229,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1490: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3241,9 +3242,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1500: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3254,9 +3255,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1510: Adds a Status update to a job as user5.1 for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3267,9 +3268,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1520: Adds a Status update to a job as user5.1 for another user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3280,9 +3281,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1530: Adds a Status update to a job as user5.1 for his/her group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3293,9 +3294,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1540: Adds a Status update to a job as user5.1 for another user's group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3306,9 +3307,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1550: Adds a Status update to a job as user5.1 for anonymous user's group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3319,9 +3320,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1560: Adds a Status update to a job as user5.2 for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec7}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3333,9 +3334,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1570: Adds a Status update to a job as user5.2 for user's 5.1 in same group job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3346,9 +3347,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1580: Adds a Status update to a job as user5.2 for another user in his/her group job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3359,9 +3360,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1590: Adds a Status update to a job as user3 for his/her job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec8}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser3}` }) @@ -3372,9 +3373,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1600: Adds a Status update to a job as user3 for user's 5.1 job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser3}` }) @@ -3385,9 +3386,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1610: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#all' configuration with non-existing jobId, which should fail as bad request", async () => { return request(appUrl) .patch(`/api/v3/Jobs/badJobId`) - .send({ - statusCode: "update status of a job", - statusMessage: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3404,7 +3405,7 @@ describe("1100: Jobs: Test New Job Model", () => { .expect(TestData.SuccessfulGetStatusCode) .expect("Content-Type", /json/) .then((res) => { - res.body.should.be.an("array").to.have.lengthOf(60); + res.body.should.be.an("array").to.have.lengthOf(61); }); }); @@ -3419,7 +3420,7 @@ describe("1100: Jobs: Test New Job Model", () => { .expect(TestData.SuccessfulGetStatusCode) .expect("Content-Type", /json/) .then((res) => { - res.body.should.be.an("array").to.have.lengthOf(36); + res.body.should.be.an("array").to.have.lengthOf(37); }); }); @@ -3816,20 +3817,347 @@ describe("1100: Jobs: Test New Job Model", () => { .expect("Content-Type", /json/); }); - it("1960: Access jobs as a user from ADMIN_GROUPS, which should be one less that before prooving that delete works.", async () => { + it("1960: Access jobs as a user from ADMIN_GROUPS, which should be one less than before proving that delete works.", async () => { return request(appUrl) - .get(`/api/v3/Jobs/`) - .send({}) - .set("Accept", "application/json") - .set({ Authorization: `Bearer ${accessTokenAdmin}` }) - .expect(TestData.SuccessfulGetStatusCode) - .expect("Content-Type", /json/) - .then((res) => { - res.body.should.be.an("array").to.have.lengthOf(59); - }); + .get(`/api/v3/Jobs/`) + .send({}) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(60); + }); + }); + + it("1970: Fullquery jobs as a user from ADMIN_GROUPS, limited by 5", async () => { + const query = { limit: 5 }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .set("Accept", "application/json") + .query("limits=" + encodeURIComponent(JSON.stringify(query))) + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(5); + }); + }); + + it("1980: Fullquery jobs as a user from ADMIN_GROUPS that were created by admin", async () => { + const query = { createdBy: "admin" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(36); + }); + }); + + it("1990: Fullquery jobs as a user from ADMIN_GROUPS that were created by User1", async () => { + const query = { createdBy: "user1" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(11); + }); + }); + + it("2000: Fullquery jobs as a user from ADMIN_GROUPS that were created by User5.1, limited by 5", async () => { + const queryFields = { createdBy: "user5.1" }; + const queryLimits = { limit: 5 }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(queryFields))) + .query("limits=" + encodeURIComponent(JSON.stringify(queryLimits))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(5); + }); + }); + + it("2010: Fullquery jobs as a user from ADMIN_GROUPS that were created by User5.2", async () => { + const query = { createdBy: "user5.2" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(1); + }); + }); + + it("2020: Fullquery jobs as a user from ADMIN_GROUPS that were created by anonymous user", async () => { + const query = { createdBy: "anonymous" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(2); + }); + }); + + it("2040: Fullquery jobs as a user from CREATE_JOB_GROUPS that were created by admin", async () => { + const query = { createdBy: "admin" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser1}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(14); + }); + }); + + it("2050: Fullquery jobs as a user from CREATE_JOB_GROUPS that were created by User1", async () => { + const query = { createdBy: "user1" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser1}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(11); + }); + }); + + it("2060: Fullquery jobs as a normal user", async () => { + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser51}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(10); + }); + }); + + it("2070: Fullquery jobs as a normal user (user5.1) that were created by admin", async () => { + const query = { createdBy: "admin" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser51}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(0); + }); + }); + + it("2080: Fullquery jobs as another normal user (user5.2)", async () => { + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser52}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").to.have.lengthOf(2); + }); + }); + + it("2090: Fullquery jobs as unauthenticated user, which should be forbidden", async () => { + return request(appUrl) + .get(`/api/v3/Jobs/fullquery`) + .send({}) + .set("Accept", "application/json") + .expect(TestData.AccessForbiddenStatusCode) + .expect("Content-Type", /json/); + }); + + it("3010: Fullfacet jobs as unauthenticated user, which should be forbidden", async () => { + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .set("Accept", "application/json") + .expect(TestData.AccessForbiddenStatusCode) + .expect("Content-Type", /json/); + }); + + it("3020: Fullfacet jobs as a user from ADMIN_GROUPS that were created by admin", async () => { + const query = { createdBy: "admin" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 36 }] }); + }); + }); + + it("3030: Fullfacet jobs as a user from ADMIN_GROUPS that were created by User1", async () => { + const query = { createdBy: "user1" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 11 }] }); + }); + }); + + it("3040: Fullfacet jobs as a user from ADMIN_GROUPS that were created by User5.1", async () => { + const queryFields = { createdBy: "user5.1" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(queryFields))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 10 }] }); + }); + }); + + it("3050: Fullfacet jobs as a user from ADMIN_GROUPS that were created by User5.2", async () => { + const query = { createdBy: "user5.2" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 1 }] }); + }); + }); + + it("3060: Fullfacet jobs as a user from ADMIN_GROUPS that were created by anonymous user", async () => { + const query = { createdBy: "anonymous" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenAdmin}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 2 }] }); + }); + }); + + it("3070: Fullfacet jobs as a user from CREATE_JOB_GROUPS that were created by admin", async () => { + const query = { createdBy: "admin" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser1}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 14 }] }); + }); + }); + + it("3080: Fullfacet jobs as a user from CREATE_JOB_GROUPS that were created by User1", async () => { + const query = { createdBy: "user1" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser1}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 11 }] }); + }); + }); + + it("3090: Fullfacet jobs as a normal user", async () => { + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser51}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 10 }] }); + }); + }); + + it("3100: Fullfacet jobs as a normal user (user5.1) that were created by admin", async () => { + const query = { createdBy: "admin" }; + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .query("fields=" + encodeURIComponent(JSON.stringify(query))) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser51}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [] }); + }); + }); + + it("3110: Fullfacet jobs as another normal user (user5.2)", async () => { + return request(appUrl) + .get(`/api/v3/Jobs/fullfacet`) + .send({}) + .set("Accept", "application/json") + .set({ Authorization: `Bearer ${accessTokenUser52}` }) + .expect(TestData.SuccessfulGetStatusCode) + .expect("Content-Type", /json/) + .then((res) => { + res.body.should.be.an("array").that.deep.contains({ all: [{ totalSets: 2 }] }); + }); }); - describe("1970: Validate Job Action", () => { + describe("0000: Validate Job Action", () => { it("1970: create validate job fails without required parameters", async () => { const newDataset = { diff --git a/test/config/jobconfig.json b/test/config/jobconfig.json index 1139a3c40..db5138ba9 100644 --- a/test/config/jobconfig.json +++ b/test/config/jobconfig.json @@ -95,7 +95,7 @@ "actionType": "validate", "request": { "$": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", "required": ["jobResultObject"], "properties": { "jobResultObject":{ From 62e59da841c69a7eb4e7cd5e31cd85e7509bc262 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Fri, 11 Oct 2024 22:16:58 +0200 Subject: [PATCH 11/16] Renumber tests within the 'Validate Job Action' section. --- test/Jobs.js | 530 +++++++++++++++++++++++++-------------------------- 1 file changed, 265 insertions(+), 265 deletions(-) diff --git a/test/Jobs.js b/test/Jobs.js index 6df99c552..ea93ed7c0 100644 --- a/test/Jobs.js +++ b/test/Jobs.js @@ -2313,9 +2313,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0780: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId1}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2326,9 +2326,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0790: Adds a Status update to a job as a user from ADMIN_GROUPS for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2339,9 +2339,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0800: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2352,9 +2352,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0810: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2365,9 +2365,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0820: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2378,9 +2378,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0830: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2391,9 +2391,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0840: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2404,9 +2404,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0850: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2417,9 +2417,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0860: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2430,9 +2430,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0870: Adds a Status update to a job as a normal user for his/her job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2443,9 +2443,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0880: Adds a Status update to a job as a normal user for another user's job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2456,9 +2456,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0890: Adds a Status update to a job as a normal user for his/her group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2469,9 +2469,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0900: Adds a Status update to a job as a normal user for another user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2482,9 +2482,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0910: Adds a Status update to a job as a normal user for anonymous user's group in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2495,9 +2495,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0920: Adds a Status update to a job as unauthhenticated user for anonymous job in '#all' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.SuccessfulPatchStatusCode) @@ -2507,9 +2507,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0930: Adds a Status update to a job as unauthhenticated user for anouther group's job in '#all' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2519,9 +2519,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0940: Adds a Status update to a job as unauthhenticated user for another user's job in '#all' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobId2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2531,9 +2531,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0950: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser1}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2544,9 +2544,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0960: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2557,9 +2557,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0970: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2570,9 +2570,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0980: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2583,9 +2583,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("0990: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2596,9 +2596,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1000: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2609,9 +2609,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1010: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2622,9 +2622,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1020: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2635,9 +2635,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1030: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2648,9 +2648,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1040: Adds a Status update to a job as a normal user for his/her job in '#jobOwnerUser' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2661,9 +2661,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1050: Adds a Status update to a job as a normal user for another user's job in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2674,9 +2674,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1060: Adds a Status update to a job as a normal user for his/her group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2687,9 +2687,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1070: Adds a Status update to a job as a normal user for another user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2700,9 +2700,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1080: Adds a Status update to a job as a normal user for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2713,9 +2713,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1090: Adds a Status update to a job as unauthhenticated user for anonymous user's group in '#jobOwnerUser' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUser6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2725,9 +2725,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1100: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup1}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2738,9 +2738,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1110: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2751,9 +2751,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1120: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2764,9 +2764,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1130: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2778,9 +2778,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1140: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2790,9 +2790,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1150: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2802,9 +2802,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1160: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2814,9 +2814,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1170: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2827,9 +2827,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1180: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2840,9 +2840,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1190: Adds a Status update to a job as a normal user for his/her job in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2853,9 +2853,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1200: Adds a Status update to a job as a normal user for another user's job in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2866,9 +2866,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1210: Adds a Status update to a job as a normal user for his/her group in '#jobOwnerGroup' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2879,9 +2879,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1220: Adds a Status update to a job as a normal user for another user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2892,9 +2892,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1230: Adds a Status update to a job as a normal user for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -2905,9 +2905,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1240: Adds a Status update to a job as unauthhenticated user for anonymous user's group in '#jobOwnerGroup' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroup6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .expect(TestData.AccessForbiddenStatusCode) @@ -2917,9 +2917,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1250: Adds a Status update to a job as a user from ADMIN_GROUPS for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec1}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2930,9 +2930,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1260: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2943,9 +2943,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1270: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2956,9 +2956,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1280: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -2969,9 +2969,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1290: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2982,9 +2982,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1300: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -2995,9 +2995,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1310: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3008,9 +3008,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1320: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3021,9 +3021,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1330: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3034,9 +3034,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1340: Adds a Status update to a job as user5.1 for his/her job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3047,9 +3047,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1350: Adds a Status update to a job as user5.1 for another user's job in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3060,9 +3060,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1360: Adds a Status update to a job as user5.1 for his/her group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3073,9 +3073,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1370: Adds a Status update to a job as user5.1 for another user's group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3086,9 +3086,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1380: Adds a Status update to a job as user5.1 for anonymous user's group in 'USER5.1' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3099,9 +3099,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1390: Adds a Status update to a job as user5.2 for his/her job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec7}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3112,9 +3112,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1400: Adds a Status update to a job as user5.2 for user's 5.1 in same group job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3125,9 +3125,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1410: Adds a Status update to a job as user5.2 for another user in his/her group job in 'USER5.1' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdUserSpec5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3138,9 +3138,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1420: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec1}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3151,9 +3151,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1430: Adds a Status update to a job as a user from ADMIN_GROUPS for another group's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3164,9 +3164,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1440: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3177,9 +3177,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1450: Adds a Status update to a job as a user from ADMIN_GROUPS for anonymous user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3190,9 +3190,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1460: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3203,9 +3203,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1470: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3216,9 +3216,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1480: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for his/her group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec3}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3229,9 +3229,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1490: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for another user's group in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3242,9 +3242,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1500: Adds a Status update to a job as a user from UPDATE_JOB_GROUPS for anonymous user's group in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser1}` }) @@ -3255,9 +3255,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1510: Adds a Status update to a job as user5.1 for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3268,9 +3268,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1520: Adds a Status update to a job as user5.1 for another user's job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec2}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3281,9 +3281,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1530: Adds a Status update to a job as user5.1 for his/her group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3294,9 +3294,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1540: Adds a Status update to a job as user5.1 for another user's group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3307,9 +3307,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1550: Adds a Status update to a job as user5.1 for anonymous user's group in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec6}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser51}` }) @@ -3320,9 +3320,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1560: Adds a Status update to a job as user5.2 for his/her job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec7}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3334,9 +3334,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1570: Adds a Status update to a job as user5.2 for user's 5.1 in same group job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3347,9 +3347,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1580: Adds a Status update to a job as user5.2 for another user in his/her group job in '@group5' configuration", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec5}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser52}` }) @@ -3360,9 +3360,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1590: Adds a Status update to a job as user3 for his/her job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec8}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser3}` }) @@ -3373,9 +3373,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1600: Adds a Status update to a job as user3 for user's 5.1 job in '@group5' configuration, which should fail as forbidden", async () => { return request(appUrl) .patch(`/api/v3/Jobs/${encodedJobIdGroupSpec4}`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenUser3}` }) @@ -3386,9 +3386,9 @@ describe("1100: Jobs: Test New Job Model", () => { it("1610: Adds a status update to a job as a user from ADMIN_GROUPS for his/her job in '#all' configuration with non-existing jobId, which should fail as bad request", async () => { return request(appUrl) .patch(`/api/v3/Jobs/badJobId`) - .send({ - statusMessage: "update status of a job", - statusCode: "job finished/blocked/etc", + .send({ + statusMessage: "update status of a job", + statusCode: "job finished/blocked/etc", }) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3828,7 +3828,7 @@ describe("1100: Jobs: Test New Job Model", () => { .then((res) => { res.body.should.be.an("array").to.have.lengthOf(60); }); - }); + }); it("1970: Fullquery jobs as a user from ADMIN_GROUPS, limited by 5", async () => { const query = { limit: 5 }; @@ -3849,7 +3849,7 @@ describe("1100: Jobs: Test New Job Model", () => { const query = { createdBy: "admin" }; return request(appUrl) .get(`/api/v3/Jobs/fullquery`) - .send({}) + .send({}) .query("fields=" + encodeURIComponent(JSON.stringify(query))) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -3992,7 +3992,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.be.an("array").to.have.lengthOf(2); }); }); - + it("2090: Fullquery jobs as unauthenticated user, which should be forbidden", async () => { return request(appUrl) .get(`/api/v3/Jobs/fullquery`) @@ -4015,7 +4015,7 @@ describe("1100: Jobs: Test New Job Model", () => { const query = { createdBy: "admin" }; return request(appUrl) .get(`/api/v3/Jobs/fullfacet`) - .send({}) + .send({}) .query("fields=" + encodeURIComponent(JSON.stringify(query))) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) @@ -4157,9 +4157,9 @@ describe("1100: Jobs: Test New Job Model", () => { }); }); - describe("0000: Validate Job Action", () => { + describe("3120: Validate Job Action", () => { - it("1970: create validate job fails without required parameters", async () => { + it("0010: create validate job fails without required parameters", async () => { const newDataset = { ...jobValidate, jobParams: { @@ -4180,7 +4180,7 @@ describe("1100: Jobs: Test New Job Model", () => { }); }); - it("1980: create validate job fails with the wrong types", async () => { + it("0020: create validate job fails with the wrong types", async () => { const newDataset = { type: "validate", jobParams: { @@ -4201,7 +4201,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for 'jobParams.requiredParam'"); }); }); - it("1981: create validate job fails with the wrong types", async () => { + it("0030: create validate job fails with the wrong types", async () => { const newDataset = { type: "validate", jobParams: { @@ -4222,7 +4222,7 @@ describe("1100: Jobs: Test New Job Model", () => { res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for 'jobParams.arrayOfStrings'"); }); }); - it("1982: create validate job fails with the wrong types", async () => { + it("0040: create validate job fails with the wrong types", async () => { const newDataset = { type: "validate", jobParams: { @@ -4244,7 +4244,7 @@ describe("1100: Jobs: Test New Job Model", () => { }); }); - it("1985: create validate succeeds with the right types", async () => { + it("0050: create validate succeeds with the right types", async () => { const newDataset = { type: "validate", jobParams: { @@ -4270,7 +4270,7 @@ describe("1100: Jobs: Test New Job Model", () => { }); }); - it("1990: update validate fails without the required parameters", async () => { + it("0060: update validate fails without the required parameters", async () => { const update = { statusCode: "finished", statusMessage: "done", @@ -4294,7 +4294,7 @@ describe("1100: Jobs: Test New Job Model", () => { }); - it("1991: update validate fails with incorrect types", async () => { + it("0070: update validate fails with incorrect types", async () => { const update = { statusCode: "finished", statusMessage: "done", @@ -4319,7 +4319,7 @@ describe("1100: Jobs: Test New Job Model", () => { }); - it("2000: updating validate succeeds with the required parameters", async () => { + it("0080: updating validate succeeds with the required parameters", async () => { const update = { statusCode: "finished", statusMessage: "done", From 04fe49e6cbd6cd1a89f827991b11b33a390531ed Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Sat, 12 Oct 2024 02:49:56 +0200 Subject: [PATCH 12/16] Fix jobconfig.example.json to match ValidateAction --- src/jobs/config/jobConfig.example.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/jobs/config/jobConfig.example.json b/src/jobs/config/jobConfig.example.json index 9c9562598..f61239a48 100644 --- a/src/jobs/config/jobConfig.example.json +++ b/src/jobs/config/jobConfig.example.json @@ -62,7 +62,12 @@ "actions": [ { "actionType": "validate", - "required": ["jobParams.datasetIds[0]"] + "request": { + "jobParams.datasetIds[*]": { + "type": "object", + "required": ["pid","files"] + } + } } ] }, From 66f6637bfd1d2e0abb8e4b53d5b41de8e66c648a Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Wed, 23 Oct 2024 16:13:22 +0200 Subject: [PATCH 13/16] Change example to use datasetList --- src/jobs/config/jobConfig.example.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jobs/config/jobConfig.example.json b/src/jobs/config/jobConfig.example.json index f61239a48..2f26987c7 100644 --- a/src/jobs/config/jobConfig.example.json +++ b/src/jobs/config/jobConfig.example.json @@ -63,7 +63,7 @@ { "actionType": "validate", "request": { - "jobParams.datasetIds[*]": { + "jobParams.datasetList[*]": { "type": "object", "required": ["pid","files"] } From bcd65b2fafc113922c9a112f356376c80798aaf4 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Wed, 23 Oct 2024 16:52:05 +0200 Subject: [PATCH 14/16] Whitespace changes --- test/config/jobconfig.json | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/test/config/jobconfig.json b/test/config/jobconfig.json index 759729bb8..66c314569 100644 --- a/test/config/jobconfig.json +++ b/test/config/jobconfig.json @@ -14,8 +14,8 @@ "statusUpdate": { "auth": "#all" } - }, - { + }, + { "jobType": "public_access", "create": { "auth": "#datasetPublic" @@ -104,12 +104,10 @@ { "actionType": "validate", "request": { - "jobParams.requiredParam": {"type":"string"}, + "jobParams.requiredParam": {"type": "string"}, "jobParams.arrayOfStrings": { - "type":"array", - "items":{ - "type":"string" - } + "type": "array", + "items": {"type": "string"} } } } @@ -125,12 +123,15 @@ "$schema": "http://json-schema.org/draft-07/schema#", "required": ["jobResultObject"], "properties": { - "jobResultObject":{ - "type":"object", + "jobResultObject": { + "type": "object", "required": ["requiredParam", "arrayOfStrings"], "properties": { - "requiredParam":{"type":"string"}, - "arrayOfStrings":{"type":"array","items":{"type":"string"}} + "requiredParam": {"type": "string"}, + "arrayOfStrings": { + "type": "array", + "items": {"type": "string"} + } } } } From 656afd9306c7119026fb56f2d0ed9c4141a9fb07 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Thu, 24 Oct 2024 10:49:51 +0200 Subject: [PATCH 15/16] Fix test value (incorrect following merge) --- src/common/utils.ts | 2 +- src/jobs/config/jobconfig.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/utils.ts b/src/common/utils.ts index 9259874fd..3abc7b33b 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -32,7 +32,7 @@ export const convertToSI = ( .toJSON(); return { valueSI: Number(quantity.value), unitSI: quantity.unit }; } catch (error) { - console.error(error); + Logger.warn(`Error converting unit to SI: {error}`); return { valueSI: inputValue, unitSI: inputUnit }; } }; diff --git a/src/jobs/config/jobconfig.spec.ts b/src/jobs/config/jobconfig.spec.ts index 243816308..af68efaad 100644 --- a/src/jobs/config/jobconfig.spec.ts +++ b/src/jobs/config/jobconfig.spec.ts @@ -14,7 +14,7 @@ describe("Job configuration", () => { const path = "test/config/jobconfig.json"; const config = await loadJobConfig(path); expect(config).toBeDefined(); - expect(config.length).toBe(10); + expect(config.length).toBe(11); expect(config[0].jobType).toBe("all_access"); expect(config[0].create).toBeDefined(); const create = config[0].create; From 761bac5dd2262229016b7942f9a17d1131ff4bb4 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Thu, 24 Oct 2024 11:28:07 +0200 Subject: [PATCH 16/16] Fix failing test --- test/Jobs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Jobs.js b/test/Jobs.js index 41cdaf348..51defbdf1 100644 --- a/test/Jobs.js +++ b/test/Jobs.js @@ -4544,7 +4544,7 @@ describe("1100: Jobs: Test New Job Model", () => { .expect("Content-Type", /json/) .then((res) => { res.body.should.not.have.property("type") - res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for 'jobParams.arrayOfStrings[*]'"); + res.body.should.have.property("message").and.be.equal("Invalid request. Invalid value for 'jobParams.arrayOfStrings'"); }); }); @@ -4562,7 +4562,7 @@ describe("1100: Jobs: Test New Job Model", () => { .send(newDataset) .set("Accept", "application/json") .set({ Authorization: `Bearer ${accessTokenAdmin}` }) - //.expect(TestData.EntryCreatedStatusCode) + .expect(TestData.EntryCreatedStatusCode) .expect("Content-Type", /json/) .then((res) => { res.body.should.have.property("type").and.equal("validate");