diff --git a/.env.ci b/.env.ci index 00bfa4a..389c0fa 100644 --- a/.env.ci +++ b/.env.ci @@ -6,4 +6,4 @@ DB_USER=unused DB_PASSWORD=bla DB_NAME=./test.sqlite NODE_ENV=dev -POSTALCODE_COUNTRYCODE=null \ No newline at end of file +POSTALCODE_COUNTRYCODE=DE \ No newline at end of file diff --git a/src/controllers/RunnerOrganisationController.ts b/src/controllers/RunnerOrganisationController.ts index 15c12ff..fbbd03a 100644 --- a/src/controllers/RunnerOrganisationController.ts +++ b/src/controllers/RunnerOrganisationController.ts @@ -29,7 +29,7 @@ export class RunnerOrganisationController { @OpenAPI({ description: 'Lists all organisations.
This includes their address, contact and teams (if existing/associated).' }) async getAll() { let responseTeams: ResponseRunnerOrganisation[] = new Array(); - const runners = await this.runnerOrganisationRepository.find({ relations: ['address', 'contact', 'teams'] }); + const runners = await this.runnerOrganisationRepository.find({ relations: ['contact', 'teams'] }); runners.forEach(runner => { responseTeams.push(new ResponseRunnerOrganisation(runner)); }); @@ -43,7 +43,7 @@ export class RunnerOrganisationController { @OnUndefined(RunnerOrganisationNotFoundError) @OpenAPI({ description: 'Lists all information about the organisation whose id got provided.' }) async getOne(@Param('id') id: number) { - let runnerOrg = await this.runnerOrganisationRepository.findOne({ id: id }, { relations: ['address', 'contact', 'teams'] }); + let runnerOrg = await this.runnerOrganisationRepository.findOne({ id: id }, { relations: ['contact', 'teams'] }); if (!runnerOrg) { throw new RunnerOrganisationNotFoundError(); } return new ResponseRunnerOrganisation(runnerOrg); } @@ -62,7 +62,7 @@ export class RunnerOrganisationController { runnerOrganisation = await this.runnerOrganisationRepository.save(runnerOrganisation); - return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(runnerOrganisation, { relations: ['address', 'contact', 'teams'] })); + return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(runnerOrganisation, { relations: ['contact', 'teams'] })); } @Put('/:id') @@ -84,7 +84,7 @@ export class RunnerOrganisationController { await this.runnerOrganisationRepository.save(await updateOrganisation.update(oldRunnerOrganisation)); - return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(id, { relations: ['address', 'contact', 'teams'] })); + return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(id, { relations: ['contact', 'teams'] })); } @Delete('/:id') @@ -98,7 +98,7 @@ export class RunnerOrganisationController { async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { let organisation = await this.runnerOrganisationRepository.findOne({ id: id }); if (!organisation) { return null; } - let runnerOrganisation = await this.runnerOrganisationRepository.findOne(organisation, { relations: ['address', 'contact', 'runners', 'teams'] }); + let runnerOrganisation = await this.runnerOrganisationRepository.findOne(organisation, { relations: ['contact', 'runners', 'teams'] }); if (!force) { if (runnerOrganisation.teams.length != 0) { diff --git a/src/errors/AddressErrors.ts b/src/errors/AddressErrors.ts index ec68d67..300bb31 100644 --- a/src/errors/AddressErrors.ts +++ b/src/errors/AddressErrors.ts @@ -1,24 +1,57 @@ -import { IsString } from 'class-validator'; -import { NotAcceptableError, NotFoundError } from 'routing-controllers'; - -/** - * Error to throw, when to provided address doesn't belong to the accepted types. - */ -export class AddressWrongTypeError extends NotAcceptableError { - @IsString() - name = "AddressWrongTypeError" - - @IsString() - message = "The address must be an existing address's id. \n You provided a object of another type." -} - -/** - * Error to throw, when a non-existent address get's loaded. - */ -export class AddressNotFoundError extends NotFoundError { - @IsString() - name = "AddressNotFoundError" - - @IsString() - message = "The address you provided couldn't be located in the system. \n Please check your request." +import { IsString } from 'class-validator'; +import { BadRequestError } from 'routing-controllers'; + +/** + * Error to throw when an address's postal code fails validation. + */ +export class AddressPostalCodeInvalidError extends BadRequestError { + @IsString() + name = "AddressPostalCodeInvalidError" + + @IsString() + message = "The postal code you provided is invalid. \n Please check if your postal code follows the postal code validation guidelines." +} + +/** + * Error to throw when an non-empty address's first line isn't set. + */ +export class AddressFirstLineEmptyError extends BadRequestError { + @IsString() + name = "AddressFirstLineEmptyError" + + @IsString() + message = "You provided a empty first address line. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country" +} + +/** + * Error to throw when an non-empty address's postal code isn't set. + */ +export class AddressPostalCodeEmptyError extends BadRequestError { + @IsString() + name = "AddressPostalCodeEmptyError" + + @IsString() + message = "You provided a empty postal code. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country" +} + +/** + * Error to throw when an non-empty address's city isn't set. + */ +export class AddressCityEmptyError extends BadRequestError { + @IsString() + name = "AddressCityEmptyError" + + @IsString() + message = "You provided a empty city. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country" +} + +/** + * Error to throw when an non-empty address's country isn't set. + */ +export class AddressCountryEmptyError extends BadRequestError { + @IsString() + name = "AddressCountryEmptyError" + + @IsString() + message = "You provided a empty country. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country" } \ No newline at end of file diff --git a/src/models/actions/create/CreateAddress.ts b/src/models/actions/create/CreateAddress.ts deleted file mode 100644 index 77ce4a8..0000000 --- a/src/models/actions/create/CreateAddress.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { IsNotEmpty, IsOptional, IsPostalCode, IsString } from 'class-validator'; -import { config } from '../../../config'; -import { Address } from '../../entities/Address'; - -/** - * This classed is used to create a new Address entity from a json body (post request). - */ -export class CreateAddress { - /** - * The newaddress's description. - */ - @IsString() - @IsOptional() - description?: string; - - /** - * The new address's first line. - * Containing the street and house number. - */ - @IsString() - @IsNotEmpty() - address1: string; - - /** - * The new address's second line. - * Containing optional information. - */ - @IsString() - @IsOptional() - address2?: string; - - /** - * The new address's postal code. - * This will get checked against the postal code syntax for the configured country. - */ - @IsString() - @IsNotEmpty() - @IsPostalCode(config.postalcode_validation_countrycode) - postalcode: string; - - /** - * The new address's city. - */ - @IsString() - @IsNotEmpty() - city: string; - - /** - * The new address's country. - */ - @IsString() - @IsNotEmpty() - country: string; - - /** - * Creates a new Address entity from this. - */ - public async toEntity(): Promise
{ - let newAddress: Address = new Address(); - - newAddress.address1 = this.address1; - newAddress.address2 = this.address2; - newAddress.postalcode = this.postalcode; - newAddress.city = this.city; - newAddress.country = this.country; - - return newAddress; - } -} \ No newline at end of file diff --git a/src/models/actions/create/CreateDonor.ts b/src/models/actions/create/CreateDonor.ts index a207983..397a8d7 100644 --- a/src/models/actions/create/CreateDonor.ts +++ b/src/models/actions/create/CreateDonor.ts @@ -1,38 +1,39 @@ -import { IsBoolean, IsOptional } from 'class-validator'; -import { DonorReceiptAddressNeededError } from '../../../errors/DonorErrors'; -import { Donor } from '../../entities/Donor'; -import { CreateParticipant } from './CreateParticipant'; - -/** - * This classed is used to create a new Donor entity from a json body (post request). - */ -export class CreateDonor extends CreateParticipant { - - /** - * Does this donor need a receipt? - */ - @IsBoolean() - @IsOptional() - receiptNeeded?: boolean = false; - - /** - * Creates a new Donor entity from this. - */ - public async toEntity(): Promise { - let newDonor: Donor = new Donor(); - - newDonor.firstname = this.firstname; - newDonor.middlename = this.middlename; - newDonor.lastname = this.lastname; - newDonor.phone = this.phone; - newDonor.email = this.email; - newDonor.address = await this.getAddress(); - newDonor.receiptNeeded = this.receiptNeeded; - - if (this.receiptNeeded == true && this.address == null) { - throw new DonorReceiptAddressNeededError() - } - - return newDonor; - } +import { IsBoolean, IsOptional } from 'class-validator'; +import { DonorReceiptAddressNeededError } from '../../../errors/DonorErrors'; +import { Address } from '../../entities/Address'; +import { Donor } from '../../entities/Donor'; +import { CreateParticipant } from './CreateParticipant'; + +/** + * This classed is used to create a new Donor entity from a json body (post request). + */ +export class CreateDonor extends CreateParticipant { + + /** + * Does this donor need a receipt? + */ + @IsBoolean() + @IsOptional() + receiptNeeded?: boolean = false; + + /** + * Creates a new Donor entity from this. + */ + public async toEntity(): Promise { + let newDonor: Donor = new Donor(); + + newDonor.firstname = this.firstname; + newDonor.middlename = this.middlename; + newDonor.lastname = this.lastname; + newDonor.phone = this.phone; + newDonor.email = this.email; + newDonor.receiptNeeded = this.receiptNeeded; + newDonor.address = this.address; + Address.validate(newDonor.address); + if (this.receiptNeeded == true && Address.isValidAddress(newDonor.address) == false) { + throw new DonorReceiptAddressNeededError() + } + + return newDonor; + } } \ No newline at end of file diff --git a/src/models/actions/create/CreateGroupContact.ts b/src/models/actions/create/CreateGroupContact.ts index 2a52341..c6538e8 100644 --- a/src/models/actions/create/CreateGroupContact.ts +++ b/src/models/actions/create/CreateGroupContact.ts @@ -1,78 +1,68 @@ -import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; -import { config } from '../../../config'; -import { AddressNotFoundError } from '../../../errors/AddressErrors'; -import { Address } from '../../entities/Address'; -import { GroupContact } from '../../entities/GroupContact'; - -/** - * This classed is used to create a new Group entity from a json body (post request). - */ -export class CreateGroupContact { - /** - * The new contact's first name. - */ - @IsNotEmpty() - @IsString() - firstname: string; - - /** - * The new contact's middle name. - */ - @IsOptional() - @IsString() - middlename?: string; - - /** - * The new contact's last name. - */ - @IsNotEmpty() - @IsString() - lastname: string; - - /** - * The new contact's address's id. - */ - @IsInt() - @IsOptional() - address?: number; - - /** - * The contact's phone number. - * This will be validated against the configured country phone numer syntax (default: international). - */ - @IsOptional() - @IsPhoneNumber(config.phone_validation_countrycode) - phone?: string; - - /** - * The contact's email address. - */ - @IsOptional() - @IsEmail() - email?: string; - - /** - * Gets the new contact's address by it's id. - */ - public async getAddress(): Promise
{ - if (!this.address) { return null; } - let address = await getConnectionManager().get().getRepository(Address).findOne({ id: this.address }); - if (!address) { throw new AddressNotFoundError; } - return address; - } - - /** - * Creates a new Address entity from this. - */ - public async toEntity(): Promise { - let contact: GroupContact = new GroupContact(); - contact.firstname = this.firstname; - contact.middlename = this.middlename; - contact.lastname = this.lastname; - contact.email = this.email; - contact.phone = this.phone; - contact.address = await this.getAddress(); - return null; - } +import { IsEmail, IsNotEmpty, IsObject, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; +import { config } from '../../../config'; +import { Address } from '../../entities/Address'; +import { GroupContact } from '../../entities/GroupContact'; + +/** + * This classed is used to create a new Group entity from a json body (post request). + */ +export class CreateGroupContact { + /** + * The new contact's first name. + */ + @IsNotEmpty() + @IsString() + firstname: string; + + /** + * The new contact's middle name. + */ + @IsOptional() + @IsString() + middlename?: string; + + /** + * The new contact's last name. + */ + @IsNotEmpty() + @IsString() + lastname: string; + + /** + * The new contact's address. + */ + @IsOptional() + @IsObject() + address?: Address; + + /** + * The contact's phone number. + * This will be validated against the configured country phone numer syntax (default: international). + */ + @IsOptional() + @IsPhoneNumber(config.phone_validation_countrycode) + phone?: string; + + /** + * The contact's email address. + */ + @IsOptional() + @IsEmail() + email?: string; + + + /** + * Creates a new Address entity from this. + */ + public async toEntity(): Promise { + let contact: GroupContact = new GroupContact(); + contact.firstname = this.firstname; + contact.middlename = this.middlename; + contact.lastname = this.lastname; + contact.email = this.email; + contact.phone = this.phone; + contact.address = this.address; + Address.validate(contact.address); + return contact; + } } \ No newline at end of file diff --git a/src/models/actions/create/CreateParticipant.ts b/src/models/actions/create/CreateParticipant.ts index 753822c..8e008e7 100644 --- a/src/models/actions/create/CreateParticipant.ts +++ b/src/models/actions/create/CreateParticipant.ts @@ -1,65 +1,53 @@ -import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; -import { config } from '../../../config'; -import { AddressNotFoundError } from '../../../errors/AddressErrors'; -import { Address } from '../../entities/Address'; - -/** - * This classed is used to create a new Participant entity from a json body (post request). - */ -export abstract class CreateParticipant { - /** - * The new participant's first name. - */ - @IsString() - @IsNotEmpty() - firstname: string; - - /** - * The new participant's middle name. - */ - @IsString() - @IsOptional() - middlename?: string; - - /** - * The new participant's last name. - */ - @IsString() - @IsNotEmpty() - lastname: string; - - /** - * The new participant's phone number. - * This will be validated against the configured country phone numer syntax (default: international). - */ - @IsString() - @IsOptional() - @IsPhoneNumber(config.phone_validation_countrycode) - phone?: string; - - /** - * The new participant's e-mail address. - */ - @IsString() - @IsOptional() - @IsEmail() - email?: string; - - /** - * The new participant's address's id. - */ - @IsInt() - @IsOptional() - address?: number; - - /** - * Gets the new participant's address by it's id. - */ - public async getAddress(): Promise
{ - if (!this.address) { return null; } - let address = await getConnectionManager().get().getRepository(Address).findOne({ id: this.address }); - if (!address) { throw new AddressNotFoundError; } - return address; - } +import { IsEmail, IsNotEmpty, IsObject, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; +import { config } from '../../../config'; +import { Address } from '../../entities/Address'; + +/** + * This classed is used to create a new Participant entity from a json body (post request). + */ +export abstract class CreateParticipant { + /** + * The new participant's first name. + */ + @IsString() + @IsNotEmpty() + firstname: string; + + /** + * The new participant's middle name. + */ + @IsString() + @IsOptional() + middlename?: string; + + /** + * The new participant's last name. + */ + @IsString() + @IsNotEmpty() + lastname: string; + + /** + * The new participant's phone number. + * This will be validated against the configured country phone numer syntax (default: international). + */ + @IsString() + @IsOptional() + @IsPhoneNumber(config.phone_validation_countrycode) + phone?: string; + + /** + * The new participant's e-mail address. + */ + @IsString() + @IsOptional() + @IsEmail() + email?: string; + + /** + * The new participant's address. + */ + @IsOptional() + @IsObject() + address?: Address; } \ No newline at end of file diff --git a/src/models/actions/create/CreateRunner.ts b/src/models/actions/create/CreateRunner.ts index addfee2..9916ba8 100644 --- a/src/models/actions/create/CreateRunner.ts +++ b/src/models/actions/create/CreateRunner.ts @@ -1,53 +1,55 @@ -import { IsInt } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; -import { RunnerGroupNotFoundError } from '../../../errors/RunnerGroupErrors'; -import { RunnerOrganisationWrongTypeError } from '../../../errors/RunnerOrganisationErrors'; -import { RunnerTeamNeedsParentError } from '../../../errors/RunnerTeamErrors'; -import { Runner } from '../../entities/Runner'; -import { RunnerGroup } from '../../entities/RunnerGroup'; -import { CreateParticipant } from './CreateParticipant'; - -/** - * This classed is used to create a new Runner entity from a json body (post request). - */ -export class CreateRunner extends CreateParticipant { - - /** - * The new runner's group's id. - */ - @IsInt() - group: number; - - /** - * Creates a new Runner entity from this. - */ - public async toEntity(): Promise { - let newRunner: Runner = new Runner(); - - newRunner.firstname = this.firstname; - newRunner.middlename = this.middlename; - newRunner.lastname = this.lastname; - newRunner.phone = this.phone; - newRunner.email = this.email; - newRunner.group = await this.getGroup(); - newRunner.address = await this.getAddress(); - - return newRunner; - } - - /** - * Gets the new runner's group by it's id. - */ - public async getGroup(): Promise { - if (this.group === undefined || this.group === null) { - throw new RunnerTeamNeedsParentError(); - } - if (!isNaN(this.group)) { - let group = await getConnectionManager().get().getRepository(RunnerGroup).findOne({ id: this.group }); - if (!group) { throw new RunnerGroupNotFoundError; } - return group; - } - - throw new RunnerOrganisationWrongTypeError; - } +import { IsInt } from 'class-validator'; +import { getConnectionManager } from 'typeorm'; +import { RunnerGroupNotFoundError } from '../../../errors/RunnerGroupErrors'; +import { RunnerOrganisationWrongTypeError } from '../../../errors/RunnerOrganisationErrors'; +import { RunnerTeamNeedsParentError } from '../../../errors/RunnerTeamErrors'; +import { Address } from '../../entities/Address'; +import { Runner } from '../../entities/Runner'; +import { RunnerGroup } from '../../entities/RunnerGroup'; +import { CreateParticipant } from './CreateParticipant'; + +/** + * This classed is used to create a new Runner entity from a json body (post request). + */ +export class CreateRunner extends CreateParticipant { + + /** + * The new runner's group's id. + */ + @IsInt() + group: number; + + /** + * Creates a new Runner entity from this. + */ + public async toEntity(): Promise { + let newRunner: Runner = new Runner(); + + newRunner.firstname = this.firstname; + newRunner.middlename = this.middlename; + newRunner.lastname = this.lastname; + newRunner.phone = this.phone; + newRunner.email = this.email; + newRunner.group = await this.getGroup(); + newRunner.address = this.address; + Address.validate(newRunner.address); + + return newRunner; + } + + /** + * Gets the new runner's group by it's id. + */ + public async getGroup(): Promise { + if (this.group === undefined || this.group === null) { + throw new RunnerTeamNeedsParentError(); + } + if (!isNaN(this.group)) { + let group = await getConnectionManager().get().getRepository(RunnerGroup).findOne({ id: this.group }); + if (!group) { throw new RunnerGroupNotFoundError; } + return group; + } + + throw new RunnerOrganisationWrongTypeError; + } } \ No newline at end of file diff --git a/src/models/actions/create/CreateRunnerOrganisation.ts b/src/models/actions/create/CreateRunnerOrganisation.ts index f1e6369..e99d851 100644 --- a/src/models/actions/create/CreateRunnerOrganisation.ts +++ b/src/models/actions/create/CreateRunnerOrganisation.ts @@ -1,41 +1,30 @@ -import { IsInt, IsOptional } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; -import { AddressNotFoundError } from '../../../errors/AddressErrors'; -import { Address } from '../../entities/Address'; -import { RunnerOrganisation } from '../../entities/RunnerOrganisation'; -import { CreateRunnerGroup } from './CreateRunnerGroup'; - -/** - * This classed is used to create a new RunnerOrganisation entity from a json body (post request). - */ -export class CreateRunnerOrganisation extends CreateRunnerGroup { - /** - * The new organisation's address's id. - */ - @IsInt() - @IsOptional() - address?: number; - - /** - * Gets the org's address by it's id. - */ - public async getAddress(): Promise
{ - if (!this.address) { return null; } - let address = await getConnectionManager().get().getRepository(Address).findOne({ id: this.address }); - if (!address) { throw new AddressNotFoundError; } - return address; - } - - /** - * Creates a new RunnerOrganisation entity from this. - */ - public async toEntity(): Promise { - let newRunnerOrganisation: RunnerOrganisation = new RunnerOrganisation(); - - newRunnerOrganisation.name = this.name; - newRunnerOrganisation.contact = await this.getContact(); - newRunnerOrganisation.address = await this.getAddress(); - - return newRunnerOrganisation; - } +import { IsObject, IsOptional } from 'class-validator'; +import { Address } from '../../entities/Address'; +import { RunnerOrganisation } from '../../entities/RunnerOrganisation'; +import { CreateRunnerGroup } from './CreateRunnerGroup'; + +/** + * This classed is used to create a new RunnerOrganisation entity from a json body (post request). + */ +export class CreateRunnerOrganisation extends CreateRunnerGroup { + /** + * The new organisation's address. + */ + @IsOptional() + @IsObject() + address?: Address; + + /** + * Creates a new RunnerOrganisation entity from this. + */ + public async toEntity(): Promise { + let newRunnerOrganisation: RunnerOrganisation = new RunnerOrganisation(); + + newRunnerOrganisation.name = this.name; + newRunnerOrganisation.contact = await this.getContact(); + newRunnerOrganisation.address = this.address; + Address.validate(newRunnerOrganisation.address); + + return newRunnerOrganisation; + } } \ No newline at end of file diff --git a/src/models/actions/update/UpdateDonor.ts b/src/models/actions/update/UpdateDonor.ts index 0e35bcf..7b6fcfa 100644 --- a/src/models/actions/update/UpdateDonor.ts +++ b/src/models/actions/update/UpdateDonor.ts @@ -1,44 +1,46 @@ -import { IsBoolean, IsInt, IsOptional } from 'class-validator'; -import { DonorReceiptAddressNeededError } from '../../../errors/DonorErrors'; -import { Donor } from '../../entities/Donor'; -import { CreateParticipant } from '../create/CreateParticipant'; - -/** - * This class is used to update a Donor entity (via put request). - */ -export class UpdateDonor extends CreateParticipant { - - /** - * The updated donor's id. - * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to). - */ - @IsInt() - id: number; - - /** - * Does the updated donor need a receipt? - */ - @IsBoolean() - @IsOptional() - receiptNeeded?: boolean; - - - /** - * Updates a provided Donor entity based on this. - */ - public async update(donor: Donor): Promise { - donor.firstname = this.firstname; - donor.middlename = this.middlename; - donor.lastname = this.lastname; - donor.phone = this.phone; - donor.email = this.email; - donor.receiptNeeded = this.receiptNeeded; - donor.address = await this.getAddress(); - - if (this.receiptNeeded == true && this.address == null) { - throw new DonorReceiptAddressNeededError() - } - - return donor; - } +import { IsBoolean, IsInt, IsOptional } from 'class-validator'; +import { DonorReceiptAddressNeededError } from '../../../errors/DonorErrors'; +import { Address } from '../../entities/Address'; +import { Donor } from '../../entities/Donor'; +import { CreateParticipant } from '../create/CreateParticipant'; + +/** + * This class is used to update a Donor entity (via put request). + */ +export class UpdateDonor extends CreateParticipant { + + /** + * The updated donor's id. + * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to). + */ + @IsInt() + id: number; + + /** + * Does the updated donor need a receipt? + */ + @IsBoolean() + @IsOptional() + receiptNeeded?: boolean; + + + /** + * Updates a provided Donor entity based on this. + */ + public async update(donor: Donor): Promise { + donor.firstname = this.firstname; + donor.middlename = this.middlename; + donor.lastname = this.lastname; + donor.phone = this.phone; + donor.email = this.email; + donor.receiptNeeded = this.receiptNeeded; + if (!this.address) { donor.address.reset(); } + else { donor.address = this.address; } + Address.validate(donor.address); + if (this.receiptNeeded == true && Address.isValidAddress(donor.address) == false) { + throw new DonorReceiptAddressNeededError() + } + + return donor; + } } \ No newline at end of file diff --git a/src/models/actions/update/UpdateRunner.ts b/src/models/actions/update/UpdateRunner.ts index df98021..2df10fe 100644 --- a/src/models/actions/update/UpdateRunner.ts +++ b/src/models/actions/update/UpdateRunner.ts @@ -1,54 +1,57 @@ -import { IsInt, IsPositive } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; -import { RunnerGroupNotFoundError } from '../../../errors/RunnerGroupErrors'; -import { RunnerTeamNeedsParentError } from '../../../errors/RunnerTeamErrors'; -import { Runner } from '../../entities/Runner'; -import { RunnerGroup } from '../../entities/RunnerGroup'; -import { CreateParticipant } from '../create/CreateParticipant'; - -/** - * This class is used to update a Runner entity (via put request). - */ -export class UpdateRunner extends CreateParticipant { - - /** - * The updated runner's id. - * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to). - */ - @IsInt() - id: number; - - /** - * The updated runner's group's id. - */ - @IsInt() - @IsPositive() - group: number; - - /** - * Updates a provided Runner entity based on this. - */ - public async update(runner: Runner): Promise { - runner.firstname = this.firstname; - runner.middlename = this.middlename; - runner.lastname = this.lastname; - runner.phone = this.phone; - runner.email = this.email; - runner.group = await this.getGroup(); - runner.address = await this.getAddress(); - - return runner; - } - - /** - * Loads the updated runner's group based on it's id. - */ - public async getGroup(): Promise { - if (this.group === undefined || this.group === null) { - throw new RunnerTeamNeedsParentError(); - } - let group = await getConnectionManager().get().getRepository(RunnerGroup).findOne({ id: this.group }); - if (!group) { throw new RunnerGroupNotFoundError; } - return group; - } +import { IsInt, IsPositive } from 'class-validator'; +import { getConnectionManager } from 'typeorm'; +import { RunnerGroupNotFoundError } from '../../../errors/RunnerGroupErrors'; +import { RunnerTeamNeedsParentError } from '../../../errors/RunnerTeamErrors'; +import { Address } from '../../entities/Address'; +import { Runner } from '../../entities/Runner'; +import { RunnerGroup } from '../../entities/RunnerGroup'; +import { CreateParticipant } from '../create/CreateParticipant'; + +/** + * This class is used to update a Runner entity (via put request). + */ +export class UpdateRunner extends CreateParticipant { + + /** + * The updated runner's id. + * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to). + */ + @IsInt() + id: number; + + /** + * The updated runner's group's id. + */ + @IsInt() + @IsPositive() + group: number; + + /** + * Updates a provided Runner entity based on this. + */ + public async update(runner: Runner): Promise { + runner.firstname = this.firstname; + runner.middlename = this.middlename; + runner.lastname = this.lastname; + runner.phone = this.phone; + runner.email = this.email; + runner.group = await this.getGroup(); + if (!this.address) { runner.address.reset(); } + else { runner.address = this.address; } + Address.validate(runner.address); + + return runner; + } + + /** + * Loads the updated runner's group based on it's id. + */ + public async getGroup(): Promise { + if (this.group === undefined || this.group === null) { + throw new RunnerTeamNeedsParentError(); + } + let group = await getConnectionManager().get().getRepository(RunnerGroup).findOne({ id: this.group }); + if (!group) { throw new RunnerGroupNotFoundError; } + return group; + } } \ No newline at end of file diff --git a/src/models/actions/update/UpdateRunnerOrganisation.ts b/src/models/actions/update/UpdateRunnerOrganisation.ts index 2fde7dc..b34bc8f 100644 --- a/src/models/actions/update/UpdateRunnerOrganisation.ts +++ b/src/models/actions/update/UpdateRunnerOrganisation.ts @@ -1,48 +1,38 @@ -import { IsInt, IsOptional } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; -import { AddressNotFoundError } from '../../../errors/AddressErrors'; -import { Address } from '../../entities/Address'; -import { RunnerOrganisation } from '../../entities/RunnerOrganisation'; -import { CreateRunnerGroup } from '../create/CreateRunnerGroup'; - -/** - * This class is used to update a RunnerOrganisation entity (via put request). - */ -export class UpdateRunnerOrganisation extends CreateRunnerGroup { - - /** - * The updated orgs's id. - * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to). - */ - @IsInt() - id: number; - - /** - * The updated organisation's address's id. - */ - @IsInt() - @IsOptional() - address?: number; - - /** - * Loads the organisation's address based on it's id. - */ - public async getAddress(): Promise
{ - if (!this.address) { return null; } - let address = await getConnectionManager().get().getRepository(Address).findOne({ id: this.address }); - if (!address) { throw new AddressNotFoundError; } - return address; - } - - /** - * Updates a provided RunnerOrganisation entity based on this. - */ - public async update(organisation: RunnerOrganisation): Promise { - - organisation.name = this.name; - organisation.contact = await this.getContact(); - organisation.address = await this.getAddress(); - - return organisation; - } +import { IsInt, IsObject, IsOptional } from 'class-validator'; +import { Address } from '../../entities/Address'; +import { RunnerOrganisation } from '../../entities/RunnerOrganisation'; +import { CreateRunnerGroup } from '../create/CreateRunnerGroup'; + +/** + * This class is used to update a RunnerOrganisation entity (via put request). + */ +export class UpdateRunnerOrganisation extends CreateRunnerGroup { + + /** + * The updated orgs's id. + * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to). + */ + @IsInt() + id: number; + + /** + * The updated organisation's address. + */ + @IsOptional() + @IsObject() + address?: Address; + + /** + * Updates a provided RunnerOrganisation entity based on this. + */ + public async update(organisation: RunnerOrganisation): Promise { + + organisation.name = this.name; + organisation.contact = await this.getContact(); + if (!this.address) { organisation.address.reset(); } + else { organisation.address = this.address; } + Address.validate(organisation.address); + + return organisation; + } } \ No newline at end of file diff --git a/src/models/entities/Address.ts b/src/models/entities/Address.ts index 3728f43..21ec92a 100644 --- a/src/models/entities/Address.ts +++ b/src/models/entities/Address.ts @@ -1,90 +1,93 @@ -import { - IsInt, - IsNotEmpty, - IsOptional, - IsPostalCode, - IsString -} from "class-validator"; -import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; -import { config } from '../../config'; -import { IAddressUser } from './IAddressUser'; - -/** - * Defines the Address entity. - * Implemented this way to prevent any formatting differences. -*/ -@Entity() -export class Address { - /** - * Autogenerated unique id (primary key). - */ - @PrimaryGeneratedColumn() - @IsInt() - id: number; - - /** - * The address's description. - * Optional and mostly for UX. - */ - @Column({ nullable: true }) - @IsString() - @IsOptional() - description?: string; - - /** - * The address's first line. - * Containing the street and house number. - */ - @Column() - @IsString() - @IsNotEmpty() - address1: string; - - /** - * The address's second line. - * Containing optional information. - */ - @Column({ nullable: true }) - @IsString() - @IsOptional() - address2?: string; - - /** - * The address's postal code. - * This will get checked against the postal code syntax for the configured country. - */ - @Column() - @IsString() - @IsNotEmpty() - @IsPostalCode(config.postalcode_validation_countrycode) - postalcode: string; - - /** - * The address's city. - */ - @Column() - @IsString() - @IsNotEmpty() - city: string; - - /** - * The address's country. - */ - @Column() - @IsString() - @IsNotEmpty() - country: string; - - /** - * Used to link the address to participants. - */ - @OneToMany(() => IAddressUser, addressUser => addressUser.address, { nullable: true }) - addressUsers: IAddressUser[]; - - /** - * Turns this entity into it's response class. - */ - public toResponse() { - return new Error("NotImplemented"); - } -} +import { + IsNotEmpty, + IsOptional, + IsPostalCode, + IsString +} from "class-validator"; +import { Column } from "typeorm"; +import ValidatorJS from 'validator'; +import { config } from '../../config'; +import { AddressCityEmptyError, AddressCountryEmptyError, AddressFirstLineEmptyError, AddressPostalCodeEmptyError, AddressPostalCodeInvalidError } from '../../errors/AddressErrors'; + +/** + * Defines the Address class. + * Implemented this way to prevent any formatting differences. +*/ +export class Address { + /** + * The address's first line. + * Containing the street and house number. + */ + @Column() + @IsString() + @IsNotEmpty() + address1: string; + + /** + * The address's second line. + * Containing optional information. + */ + @Column({ nullable: true }) + @IsString() + @IsOptional() + address2?: string; + + /** + * The address's postal code. + * This will get checked against the postal code syntax for the configured country. + */ + @Column() + @IsString() + @IsNotEmpty() + @IsPostalCode(config.postalcode_validation_countrycode) + postalcode: string; + + /** + * The address's city. + */ + @Column() + @IsString() + @IsNotEmpty() + city: string; + + /** + * The address's country. + */ + @Column() + @IsString() + @IsNotEmpty() + country: string; + + public reset() { + this.address1 = null; + this.address2 = null; + this.city = null; + this.country = null; + this.postalcode = null; + } + + /** + * Checks if this is a valid address + */ + public static isValidAddress(address: Address): Boolean { + if (address == null) { return false; } + if (address.address1 == null || address.city == null || address.country == null || address.postalcode == null) { return false; } + if (ValidatorJS.isPostalCode(address.postalcode, config.postalcode_validation_countrycode) == false) { return false; } + return true; + } + + /** + * This function validates addresses. + * This is a workaround for non-existant class validation for embedded entities. + * @param address The address that shall get validated. + */ + public static validate(address: Address) { + if (address == null) { return; } + if (address.address1 == null && address.city == null && address.country == null && address.postalcode == null) { return; } + if (address.address1 == null) { throw new AddressFirstLineEmptyError(); } + if (address.postalcode == null) { throw new AddressPostalCodeEmptyError(); } + if (address.city == null) { throw new AddressCityEmptyError(); } + if (address.country == null) { throw new AddressCountryEmptyError(); } + if (ValidatorJS.isPostalCode(address.postalcode.toString(), config.postalcode_validation_countrycode) == false) { throw new AddressPostalCodeInvalidError(); } + } +} diff --git a/src/models/entities/GroupContact.ts b/src/models/entities/GroupContact.ts index f650259..d2b0abe 100644 --- a/src/models/entities/GroupContact.ts +++ b/src/models/entities/GroupContact.ts @@ -7,10 +7,9 @@ import { IsString } from "class-validator"; -import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; import { config } from '../../config'; import { Address } from "./Address"; -import { IAddressUser } from './IAddressUser'; import { RunnerGroup } from "./RunnerGroup"; /** @@ -18,7 +17,7 @@ import { RunnerGroup } from "./RunnerGroup"; * Mainly it's own class to reduce duplicate code and enable contact's to be associated with multiple groups. */ @Entity() -export class GroupContact implements IAddressUser { +export class GroupContact { /** * Autogenerated unique id (primary key). */ @@ -55,7 +54,7 @@ export class GroupContact implements IAddressUser { * This is a address object to prevent any formatting differences. */ @IsOptional() - @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) + @Column(type => Address) address?: Address; /** diff --git a/src/models/entities/IAddressUser.ts b/src/models/entities/IAddressUser.ts deleted file mode 100644 index f3b5d5a..0000000 --- a/src/models/entities/IAddressUser.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Entity, ManyToOne, PrimaryColumn } from 'typeorm'; -import { Address } from './Address'; - -/** - * The interface(tm) all entities using addresses have to implement. - * This is a abstract class, because apparently typeorm can't really work with interfaces :/ - */ -@Entity() -export abstract class IAddressUser { - @PrimaryColumn() - id: number; - - @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) - address?: Address - - /** - * Turns this entity into it's response class. - */ - public abstract toResponse(); -} diff --git a/src/models/entities/Participant.ts b/src/models/entities/Participant.ts index fa40a8f..ccf7656 100644 --- a/src/models/entities/Participant.ts +++ b/src/models/entities/Participant.ts @@ -7,11 +7,10 @@ import { IsString } from "class-validator"; -import { Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm"; +import { Column, Entity, PrimaryGeneratedColumn, TableInheritance } from "typeorm"; import { config } from '../../config'; import { ResponseParticipant } from '../responses/ResponseParticipant'; import { Address } from "./Address"; -import { IAddressUser } from './IAddressUser'; /** * Defines the Participant entity. @@ -19,7 +18,7 @@ import { IAddressUser } from './IAddressUser'; */ @Entity() @TableInheritance({ column: { name: "type", type: "varchar" } }) -export abstract class Participant implements IAddressUser { +export abstract class Participant { /** * Autogenerated unique id (primary key). */ @@ -55,7 +54,7 @@ export abstract class Participant implements IAddressUser { * The participant's address. * This is a address object to prevent any formatting differences. */ - @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) + @Column(type => Address) address?: Address; /** diff --git a/src/models/entities/RunnerOrganisation.ts b/src/models/entities/RunnerOrganisation.ts index 9aabe17..e5f3330 100644 --- a/src/models/entities/RunnerOrganisation.ts +++ b/src/models/entities/RunnerOrganisation.ts @@ -1,65 +1,64 @@ -import { IsInt, IsOptional } from "class-validator"; -import { ChildEntity, ManyToOne, OneToMany } from "typeorm"; -import { ResponseRunnerOrganisation } from '../responses/ResponseRunnerOrganisation'; -import { Address } from './Address'; -import { IAddressUser } from './IAddressUser'; -import { Runner } from './Runner'; -import { RunnerGroup } from "./RunnerGroup"; -import { RunnerTeam } from "./RunnerTeam"; - -/** - * Defines the RunnerOrganisation entity. - * This usually is a school, club or company. -*/ -@ChildEntity() -export class RunnerOrganisation extends RunnerGroup implements IAddressUser { - - /** - * The organisations's address. - */ - @IsOptional() - @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) - address?: Address; - - /** - * The organisation's teams. - * Used to link teams to a organisation. - */ - @OneToMany(() => RunnerTeam, team => team.parentGroup, { nullable: true }) - teams: RunnerTeam[]; - - /** - * Returns all runners associated with this organisation (directly or indirectly via teams). - */ - public get allRunners(): Runner[] { - let returnRunners: Runner[] = new Array(); - returnRunners.push(...this.runners); - for (let team of this.teams) { - returnRunners.push(...team.runners) - } - return returnRunners; - } - - /** - * Returns the total distance ran by this group's runners based on all their valid scans. - */ - @IsInt() - public get distance(): number { - return this.allRunners.reduce((sum, current) => sum + current.distance, 0); - } - - /** - * Returns the total donations a runner has collected based on his linked donations and distance ran. - */ - @IsInt() - public get distanceDonationAmount(): number { - return this.allRunners.reduce((sum, current) => sum + current.distanceDonationAmount, 0); - } - - /** - * Turns this entity into it's response class. - */ - public toResponse(): ResponseRunnerOrganisation { - return new ResponseRunnerOrganisation(this); - } +import { IsInt, IsOptional } from "class-validator"; +import { ChildEntity, Column, OneToMany } from "typeorm"; +import { ResponseRunnerOrganisation } from '../responses/ResponseRunnerOrganisation'; +import { Address } from './Address'; +import { Runner } from './Runner'; +import { RunnerGroup } from "./RunnerGroup"; +import { RunnerTeam } from "./RunnerTeam"; + +/** + * Defines the RunnerOrganisation entity. + * This usually is a school, club or company. +*/ +@ChildEntity() +export class RunnerOrganisation extends RunnerGroup { + + /** + * The organisations's address. + */ + @IsOptional() + @Column(type => Address) + address?: Address; + + /** + * The organisation's teams. + * Used to link teams to a organisation. + */ + @OneToMany(() => RunnerTeam, team => team.parentGroup, { nullable: true }) + teams: RunnerTeam[]; + + /** + * Returns all runners associated with this organisation (directly or indirectly via teams). + */ + public get allRunners(): Runner[] { + let returnRunners: Runner[] = new Array(); + returnRunners.push(...this.runners); + for (let team of this.teams) { + returnRunners.push(...team.runners) + } + return returnRunners; + } + + /** + * Returns the total distance ran by this group's runners based on all their valid scans. + */ + @IsInt() + public get distance(): number { + return this.allRunners.reduce((sum, current) => sum + current.distance, 0); + } + + /** + * Returns the total donations a runner has collected based on his linked donations and distance ran. + */ + @IsInt() + public get distanceDonationAmount(): number { + return this.allRunners.reduce((sum, current) => sum + current.distanceDonationAmount, 0); + } + + /** + * Turns this entity into it's response class. + */ + public toResponse(): ResponseRunnerOrganisation { + return new ResponseRunnerOrganisation(this); + } } \ No newline at end of file diff --git a/src/models/responses/ResponseParticipant.ts b/src/models/responses/ResponseParticipant.ts index 135a837..93a6918 100644 --- a/src/models/responses/ResponseParticipant.ts +++ b/src/models/responses/ResponseParticipant.ts @@ -1,56 +1,65 @@ -import { IsInt, IsString } from "class-validator"; -import { Participant } from '../entities/Participant'; - -/** - * Defines the participant response. -*/ -export abstract class ResponseParticipant { - /** - * The participant's id. - */ - @IsInt() - id: number; - - /** - * The participant's first name. - */ - @IsString() - firstname: string; - - /** - * The participant's middle name. - */ - @IsString() - middlename?: string; - - /** - * The participant's last name. - */ - @IsString() - lastname: string; - - /** - * The participant's phone number. - */ - @IsString() - phone?: string; - - /** - * The participant's e-mail address. - */ - @IsString() - email?: string; - - /** - * Creates a ResponseParticipant object from a participant. - * @param participant The participant the response shall be build for. - */ - public constructor(participant: Participant) { - this.id = participant.id; - this.firstname = participant.firstname; - this.middlename = participant.middlename; - this.lastname = participant.lastname; - this.phone = participant.phone; - this.email = participant.email; - } -} +import { IsInt, IsObject, IsOptional, IsString } from "class-validator"; +import { Address } from '../entities/Address'; +import { Participant } from '../entities/Participant'; + +/** + * Defines the participant response. +*/ +export abstract class ResponseParticipant { + /** + * The participant's id. + */ + @IsInt() + id: number; + + /** + * The participant's first name. + */ + @IsString() + firstname: string; + + /** + * The participant's middle name. + */ + @IsString() + middlename?: string; + + /** + * The participant's last name. + */ + @IsString() + lastname: string; + + /** + * The participant's phone number. + */ + @IsString() + phone?: string; + + /** + * The participant's e-mail address. + */ + @IsString() + email?: string; + + /** + * The participant's address. + */ + @IsOptional() + @IsObject() + address?: Address; + + /** + * Creates a ResponseParticipant object from a participant. + * @param participant The participant the response shall be build for. + */ + public constructor(participant: Participant) { + this.id = participant.id; + this.firstname = participant.firstname; + this.middlename = participant.middlename; + this.lastname = participant.lastname; + this.phone = participant.phone; + this.email = participant.email; + this.address = participant.address; + } +} diff --git a/src/tests/donors/donor_add.spec.ts b/src/tests/donors/donor_add.spec.ts index 30d84c9..3226b8c 100644 --- a/src/tests/donors/donor_add.spec.ts +++ b/src/tests/donors/donor_add.spec.ts @@ -1,94 +1,84 @@ -import axios from 'axios'; -import { config } from '../../config'; -const base = "http://localhost:" + config.internal_port - -let access_token; -let axios_config; - -beforeAll(async () => { - const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); - access_token = res.data["access_token"]; - axios_config = { - headers: { "authorization": "Bearer " + access_token }, - validateStatus: undefined - }; -}); - -// --------------- -describe('POST /api/donors with errors', () => { - it('creating a new donor without any parameters should return 400', async () => { - const res1 = await axios.post(base + '/api/donors', null, axios_config); - expect(res1.status).toEqual(400); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new donor without a last name should return 400', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "first", - "middlename": "middle" - }, axios_config); - expect(res2.status).toEqual(400); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('creating a new donor with a invalid address should return 404', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "first", - "middlename": "middle", - "lastname": "last", - "address": 99999999999999999999999999 - }, axios_config); - expect(res2.status).toEqual(404); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('creating a new donor with a invalid phone number should return 400', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "first", - "middlename": "middle", - "lastname": "last", - "phone": "123" - }, axios_config); - expect(res2.status).toEqual(400); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('creating a new donor with a invalid mail address should return 400', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "string", - "middlename": "string", - "lastname": "string", - "phone": null, - "email": "123", - }, axios_config); - expect(res2.status).toEqual(400); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('creating a new donor without an address but with receiptNeeded=true 406', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "string", - "middlename": "string", - "lastname": "string", - "receiptNeeded": true - }, axios_config); - expect(res2.status).toEqual(406); - expect(res2.headers['content-type']).toContain("application/json") - }); -}); -// --------------- -describe('POST /api/donors working', () => { - it('creating a new donor with only needed params should return 200', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "first", - "lastname": "last" - }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('creating a new donor with all non-relationship optional params should return 200', async () => { - const res3 = await axios.post(base + '/api/donors', { - "firstname": "first", - "middlename": "middle", - "lastname": "last", - "receiptNeeded": false - }, axios_config); - expect(res3.status).toEqual(200); - expect(res3.headers['content-type']).toContain("application/json") - }); +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +// --------------- +describe('POST /api/donors with errors', () => { + it('creating a new donor without any parameters should return 400', async () => { + const res1 = await axios.post(base + '/api/donors', null, axios_config); + expect(res1.status).toEqual(400); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new donor without a last name should return 400', async () => { + const res2 = await axios.post(base + '/api/donors', { + "firstname": "first", + "middlename": "middle" + }, axios_config); + expect(res2.status).toEqual(400); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('creating a new donor with a invalid phone number should return 400', async () => { + const res2 = await axios.post(base + '/api/donors', { + "firstname": "first", + "middlename": "middle", + "lastname": "last", + "phone": "123" + }, axios_config); + expect(res2.status).toEqual(400); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('creating a new donor with a invalid mail address should return 400', async () => { + const res2 = await axios.post(base + '/api/donors', { + "firstname": "string", + "middlename": "string", + "lastname": "string", + "phone": null, + "email": "123", + }, axios_config); + expect(res2.status).toEqual(400); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('creating a new donor without an address but with receiptNeeded=true 406', async () => { + const res2 = await axios.post(base + '/api/donors', { + "firstname": "string", + "middlename": "string", + "lastname": "string", + "receiptNeeded": true + }, axios_config); + expect(res2.status).toEqual(406); + expect(res2.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('POST /api/donors working', () => { + it('creating a new donor with only needed params should return 200', async () => { + const res2 = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('creating a new donor with all non-relationship optional params should return 200', async () => { + const res3 = await axios.post(base + '/api/donors', { + "firstname": "first", + "middlename": "middle", + "lastname": "last", + "receiptNeeded": false + }, axios_config); + expect(res3.status).toEqual(200); + expect(res3.headers['content-type']).toContain("application/json") + }); }); \ No newline at end of file diff --git a/src/tests/donors/donor_update.spec.ts b/src/tests/donors/donor_update.spec.ts index d77824a..a317adc 100644 --- a/src/tests/donors/donor_update.spec.ts +++ b/src/tests/donors/donor_update.spec.ts @@ -1,75 +1,75 @@ -import axios from 'axios'; -import { config } from '../../config'; -const base = "http://localhost:" + config.internal_port - -let access_token; -let axios_config; - -beforeAll(async () => { - const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); - access_token = res.data["access_token"]; - axios_config = { - headers: { "authorization": "Bearer " + access_token }, - validateStatus: undefined - }; -}); - -describe('Update donor name after adding', () => { - let added_donor; - it('creating a new runner with only needed params should return 200', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "first", - "lastname": "last" - }, axios_config); - added_donor = res2.data; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('valid update should return 200', async () => { - let donor_copy = added_donor - donor_copy.firstname = "second" - const res3 = await axios.put(base + '/api/donors/' + added_donor.id, donor_copy, axios_config); - expect(res3.status).toEqual(200); - expect(res3.headers['content-type']).toContain("application/json") - let updated_donor = res3.data - expect(updated_donor).toEqual(donor_copy); - }); -}); -// --------------- -describe('Update donor id after adding(should fail)', () => { - let added_donor; - it('creating a new donor with only needed params should return 200', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "first", - "lastname": "last" - }, axios_config); - added_donor = res2.data; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('invalid update should return 406', async () => { - added_donor.id++; - const res3 = await axios.put(base + '/api/donors/' + (added_donor.id - 1), added_donor, axios_config); - expect(res3.status).toEqual(406); - expect(res3.headers['content-type']).toContain("application/json") - }); -}); -// --------------- -describe('Update donor without address but receiptNeeded=true should fail', () => { - let added_donor; - it('creating a new donor with only needed params should return 200', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "first", - "lastname": "last", - }, axios_config); - added_donor = res2.data; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('invalid update should return 406', async () => { - added_donor.receiptNeeded = true; - const res3 = await axios.put(base + '/api/donors/' + added_donor.id, added_donor, axios_config); - expect(res3.status).toEqual(406); - expect(res3.headers['content-type']).toContain("application/json") - }); +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +describe('Update donor name after adding', () => { + let added_donor; + it('creating a new runner with only needed params should return 200', async () => { + const res2 = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res2.data; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('valid update should return 200', async () => { + let donor_copy = added_donor + donor_copy.firstname = "second" + const res3 = await axios.put(base + '/api/donors/' + added_donor.id, donor_copy, axios_config); + expect(res3.status).toEqual(200); + expect(res3.headers['content-type']).toContain("application/json") + let updated_donor = res3.data + expect(updated_donor).toEqual(donor_copy); + }); +}); +// --------------- +describe('Update donor id after adding(should fail)', () => { + let added_donor; + it('creating a new donor with only needed params should return 200', async () => { + const res2 = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res2.data; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('invalid update should return 406', async () => { + added_donor.id++; + const res3 = await axios.put(base + '/api/donors/' + (added_donor.id - 1), added_donor, axios_config); + expect(res3.status).toEqual(406); + expect(res3.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('Update donor without address but receiptNeeded=true should fail', () => { + let added_donor; + it('creating a new donor with only needed params should return 200', async () => { + const res2 = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "testtest", + }, axios_config); + added_donor = res2.data; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('invalid update should return 406', async () => { + added_donor.receiptNeeded = true; + const res3 = await axios.put(base + '/api/donors/' + added_donor.id, added_donor, axios_config); + expect(res3.status).toEqual(406); + expect(res3.headers['content-type']).toContain("application/json") + }); }); \ No newline at end of file diff --git a/src/tests/runnerOrgs/org_add.spec.ts b/src/tests/runnerOrgs/org_add.spec.ts index e64a8a2..9d939ef 100644 --- a/src/tests/runnerOrgs/org_add.spec.ts +++ b/src/tests/runnerOrgs/org_add.spec.ts @@ -1,90 +1,102 @@ -import axios from 'axios'; -import { config } from '../../config'; -const base = "http://localhost:" + config.internal_port - -let access_token; -let axios_config; - -beforeAll(async () => { - const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); - access_token = res.data["access_token"]; - axios_config = { - headers: { "authorization": "Bearer " + access_token }, - validateStatus: undefined - }; -}); - -describe('GET /api/organisations', () => { - it('basic get should return 200', async () => { - const res = await axios.get(base + '/api/organisations', axios_config); - expect(res.status).toEqual(200); - expect(res.headers['content-type']).toContain("application/json") - }); -}); -// --------------- -describe('POST /api/organisations', () => { - it('creating a new org with just a name should return 200', async () => { - const res = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - expect(res.status).toEqual(200); - expect(res.headers['content-type']).toContain("application/json") - }); - it('creating a new org with without a name should return 400', async () => { - const res = await axios.post(base + '/api/organisations', { - "name": null - }, axios_config); - expect(res.status).toEqual(400); - expect(res.headers['content-type']).toContain("application/json") - }); -}); -// --------------- -describe('adding + getting from all orgs', () => { - it('creating a new org with just a name should return 200', async () => { - const res = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - expect(res.status).toEqual(200); - expect(res.headers['content-type']).toContain("application/json") - }); - it('check if org was added', async () => { - const res = await axios.get(base + '/api/organisations', axios_config); - expect(res.status).toEqual(200); - expect(res.headers['content-type']).toContain("application/json") - let added_org = res.data[res.data.length - 1] - delete added_org.id - expect(added_org).toEqual({ - "name": "test123", - "contact": null, - "address": null, - "teams": [] - }) - }); -}); -// --------------- -describe('adding + getting explicitly', () => { - let added_org_id - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - let added_org = res1.data - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('check if org was added', async () => { - const res2 = await axios.get(base + '/api/organisations/' + added_org_id, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - let added_org2 = res2.data - added_org_id = added_org2.id; - delete added_org2.id - expect(added_org2).toEqual({ - "name": "test123", - "contact": null, - "address": null, - "teams": [] - }) - }); +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +describe('GET /api/organisations', () => { + it('basic get should return 200', async () => { + const res = await axios.get(base + '/api/organisations', axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('POST /api/organisations', () => { + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with without a name should return 400', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": null + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('adding + getting from all orgs', () => { + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('check if org was added', async () => { + const res = await axios.get(base + '/api/organisations', axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + let added_org = res.data[res.data.length - 1] + delete added_org.id + expect(added_org).toEqual({ + "name": "test123", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, + "teams": [] + }) + }); +}); +// --------------- +describe('adding + getting explicitly', () => { + let added_org_id + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + let added_org = res1.data + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('check if org was added', async () => { + const res2 = await axios.get(base + '/api/organisations/' + added_org_id, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + let added_org2 = res2.data + added_org_id = added_org2.id; + delete added_org2.id + expect(added_org2).toEqual({ + "name": "test123", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, + "teams": [] + }) + }); }); \ No newline at end of file diff --git a/src/tests/runnerOrgs/org_delete.spec.ts b/src/tests/runnerOrgs/org_delete.spec.ts index 9c023e8..d28faa1 100644 --- a/src/tests/runnerOrgs/org_delete.spec.ts +++ b/src/tests/runnerOrgs/org_delete.spec.ts @@ -1,132 +1,144 @@ -import axios from 'axios'; -import { config } from '../../config'; -const base = "http://localhost:" + config.internal_port - -let access_token; -let axios_config; - -beforeAll(async () => { - const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); - access_token = res.data["access_token"]; - axios_config = { - headers: { "authorization": "Bearer " + access_token }, - validateStatus: undefined - }; -}); - -// --------------- -describe('adding + deletion (non-existant)', () => { - it('delete', async () => { - const res2 = await axios.delete(base + '/api/organisations/0', axios_config); - expect(res2.status).toEqual(204); - }); -}); -// --------------- -describe('adding + deletion (successfull)', () => { - let added_org_id - let added_org - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('delete', async () => { - const res2 = await axios.delete(base + '/api/organisations/' + added_org_id, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - let added_org2 = res2.data - added_org_id = added_org2.id; - delete added_org2.id - expect(added_org2).toEqual({ - "name": "test123", - "contact": null, - "address": null, - "teams": [] - }); - }); - it('check if org really was deleted', async () => { - const res3 = await axios.get(base + '/api/organisations/' + added_org_id, axios_config); - expect(res3.status).toEqual(404); - expect(res3.headers['content-type']).toContain("application/json") - }); -}); -// --------------- -describe('adding + deletion with teams still existing (without force)', () => { - let added_org; - let added_org_id; - let added_team; - let added_team_id - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data; - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new team with a valid org should return 200', async () => { - const res2 = await axios.post(base + '/api/teams', { - "name": "test123", - "parentGroup": added_org_id - }, axios_config); - added_team = res2.data; - added_team_id = added_team.id; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('delete org - this should fail with a 406', async () => { - const res2 = await axios.delete(base + '/api/organisations/' + added_org_id, axios_config); - expect(res2.status).toEqual(406); - expect(res2.headers['content-type']).toContain("application/json") - }); -}); -// --------------- -describe('adding + deletion with teams still existing (with force)', () => { - let added_org; - let added_org_id; - let added_team; - let added_team_id - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data; - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new team with a valid org should return 200', async () => { - const res2 = await axios.post(base + '/api/teams', { - "name": "test123", - "parentGroup": added_org_id - }, axios_config); - added_team = res2.data; - added_team_id = added_team.id; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('delete', async () => { - const res2 = await axios.delete(base + '/api/organisations/' + added_org_id + '?force=true', axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - let added_org2 = res2.data - added_org_id = added_org2.id; - delete added_org2.id; - delete added_org2.teams; - expect(added_org2).toEqual({ - "name": "test123", - "contact": null, - "address": null - }); - }); - it('check if org really was deleted', async () => { - const res3 = await axios.get(base + '/api/organisations/' + added_org_id, axios_config); - expect(res3.status).toEqual(404); - expect(res3.headers['content-type']).toContain("application/json") - }); +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +// --------------- +describe('adding + deletion (non-existant)', () => { + it('delete', async () => { + const res2 = await axios.delete(base + '/api/organisations/0', axios_config); + expect(res2.status).toEqual(204); + }); +}); +// --------------- +describe('adding + deletion (successfull)', () => { + let added_org_id + let added_org + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('delete', async () => { + const res2 = await axios.delete(base + '/api/organisations/' + added_org_id, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + let added_org2 = res2.data + added_org_id = added_org2.id; + delete added_org2.id + expect(added_org2).toEqual({ + "name": "test123", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, + "teams": [] + }); + }); + it('check if org really was deleted', async () => { + const res3 = await axios.get(base + '/api/organisations/' + added_org_id, axios_config); + expect(res3.status).toEqual(404); + expect(res3.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('adding + deletion with teams still existing (without force)', () => { + let added_org; + let added_org_id; + let added_team; + let added_team_id + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data; + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new team with a valid org should return 200', async () => { + const res2 = await axios.post(base + '/api/teams', { + "name": "test123", + "parentGroup": added_org_id + }, axios_config); + added_team = res2.data; + added_team_id = added_team.id; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('delete org - this should fail with a 406', async () => { + const res2 = await axios.delete(base + '/api/organisations/' + added_org_id, axios_config); + expect(res2.status).toEqual(406); + expect(res2.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('adding + deletion with teams still existing (with force)', () => { + let added_org; + let added_org_id; + let added_team; + let added_team_id + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data; + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new team with a valid org should return 200', async () => { + const res2 = await axios.post(base + '/api/teams', { + "name": "test123", + "parentGroup": added_org_id + }, axios_config); + added_team = res2.data; + added_team_id = added_team.id; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('delete', async () => { + const res2 = await axios.delete(base + '/api/organisations/' + added_org_id + '?force=true', axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + let added_org2 = res2.data + added_org_id = added_org2.id; + delete added_org2.id; + delete added_org2.teams; + expect(added_org2).toEqual({ + "name": "test123", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, + }); + }); + it('check if org really was deleted', async () => { + const res3 = await axios.get(base + '/api/organisations/' + added_org_id, axios_config); + expect(res3.status).toEqual(404); + expect(res3.headers['content-type']).toContain("application/json") + }); }); \ No newline at end of file diff --git a/src/tests/runnerOrgs/org_update.spec.ts b/src/tests/runnerOrgs/org_update.spec.ts index 96ab8c8..389dc84 100644 --- a/src/tests/runnerOrgs/org_update.spec.ts +++ b/src/tests/runnerOrgs/org_update.spec.ts @@ -1,73 +1,383 @@ -import axios from 'axios'; -import { config } from '../../config'; -const base = "http://localhost:" + config.internal_port - -let access_token; -let axios_config; - -beforeAll(async () => { - const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); - access_token = res.data["access_token"]; - axios_config = { - headers: { "authorization": "Bearer " + access_token }, - validateStatus: undefined - }; -}); - -// --------------- -describe('adding + updating name', () => { - let added_org_id - let added_org - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('update org', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { - "id": added_org_id, - "name": "testlelele", - "contact": null, - "address": null, - }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - let added_org2 = res2.data - added_org_id = added_org2.id; - delete added_org2.id - expect(added_org2).toEqual({ - "name": "testlelele", - "contact": null, - "address": null, - "teams": [] - }) - }); -}); -// --------------- -describe('adding + try updating id (should return 406)', () => { - let added_org_id - let added_org - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('update org', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { - "id": added_org_id + 1, - "name": "testlelele", - "contact": null, - "address": null, - }, axios_config); - expect(res2.status).toEqual(406); - expect(res2.headers['content-type']).toContain("application/json") - }); +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +// --------------- +describe('adding + updating name', () => { + let added_org_id + let added_org + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + added_org_id = added_org.id; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('update org', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": null, + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + let added_org2 = res.data + added_org_id = added_org2.id; + delete added_org2.id + expect(added_org2).toEqual({ + "name": "testlelele", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, + "teams": [] + }) + }); +}); +// --------------- +describe('adding + try updating id (should return 406)', () => { + let added_org_id + let added_org + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + added_org_id = added_org.id; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('update org', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id + 1, + "name": "testlelele", + "contact": null, + "address": null, + }, axios_config); + expect(res.status).toEqual(406); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('adding + updateing address valid)', () => { + let added_org_id + let added_org + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + added_org_id = added_org.id; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('adding address to org should return 200', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "Herzogenaurach", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "Herzogenaurach", + "country": "Burkina Faso", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s first line should return 200', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s second line should return 200', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s city should return 200', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Burkina Faso", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s country should return 200', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Germany", + "postalcode": "90174" + } + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Germany", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s postal code should return 200', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Germany", + "postalcode": "91065" + } + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Germany", + "postalcode": "91065" + }, + "teams": [] + }); + }); + it('removing org\'s should return 200', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null + }, + "teams": [] + }); + }); +}); +// --------------- +describe('adding + updateing address invalid)', () => { + let added_org_id + let added_org + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + added_org_id = added_org.id; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('adding address to org w/o address1 should return 400', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('adding address to org w/o city should return 400', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": null, + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('adding address to org w/o country should return 400', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "TestCity", + "country": null, + "postalcode": "90174" + } + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('adding address to org w/o postal code should return 400', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": null + } + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('adding address to org w/ invalid postal code should return 400', async () => { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "-1" + } + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); + }); }); \ No newline at end of file diff --git a/src/tests/runnerTeams/team_update.spec.ts b/src/tests/runnerTeams/team_update.spec.ts index 9ad8030..0257bfd 100644 --- a/src/tests/runnerTeams/team_update.spec.ts +++ b/src/tests/runnerTeams/team_update.spec.ts @@ -1,131 +1,130 @@ -import axios from 'axios'; -import { config } from '../../config'; -const base = "http://localhost:" + config.internal_port - -let access_token; -let axios_config; - -beforeAll(async () => { - const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); - access_token = res.data["access_token"]; - axios_config = { - headers: { "authorization": "Bearer " + access_token }, - validateStatus: undefined - }; -}); -// --------------- -describe('adding + updating name', () => { - let added_org; - let added_org_id; - let added_team; - let added_team_id - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data; - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new team with a valid org should return 200', async () => { - const res2 = await axios.post(base + '/api/teams', { - "name": "test123", - "parentGroup": added_org_id - }, axios_config); - added_team = res2.data; - added_team_id = added_team.id; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('update name', async () => { - const res3 = await axios.put(base + '/api/teams/' + added_team_id, { - "id": added_team_id, - "name": "testlelele", - "contact": null, - "parentGroup": added_org.id - }, axios_config); - expect(res3.status).toEqual(200); - expect(res3.headers['content-type']).toContain("application/json") - let updated_team = res3.data; - added_team.name = "testlelele"; - expect(updated_team).toEqual(added_team) - }); -}); -// --------------- -describe('adding + try updating id (should return 406)', () => { - let added_org; - let added_org_id; - let added_team; - let added_team_id - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data; - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new team with a valid org should return 200', async () => { - const res2 = await axios.post(base + '/api/teams', { - "name": "test123", - "parentGroup": added_org_id - }, axios_config); - added_team = res2.data; - added_team_id = added_team.id; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('update team', async () => { - added_team.id = added_team.id + 1; - added_team.parentGroup = added_team.parentGroup.id; - const res3 = await axios.put(base + '/api/teams/' + added_team_id, added_team, axios_config); - expect(res3.status).toEqual(406); - expect(res3.headers['content-type']).toContain("application/json") - }); -}); -// --------------- -describe('add+update parent org (valid)', () => { - let added_org; - let added_org2; - let added_team; - let added_team_id - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new team with a valid org should return 200', async () => { - const res2 = await axios.post(base + '/api/teams', { - "name": "test123", - "parentGroup": added_org.id - }, axios_config); - added_team = res2.data; - added_team_id = added_team.id; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('creating a new org with just a name should return 200', async () => { - const res3 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org2 = res3.data; - expect(res3.status).toEqual(200); - expect(res3.headers['content-type']).toContain("application/json") - }); - it('update team', async () => { - added_team.parentGroup = added_org2.id; - const res4 = await axios.put(base + '/api/teams/' + added_team_id, added_team, axios_config); - let updated_team = res4.data; - expect(res4.status).toEqual(200); - expect(res4.headers['content-type']).toContain("application/json") - delete added_org2.address; - delete added_org2.contact; - delete added_org2.teams; - expect(updated_team.parentGroup).toEqual(added_org2) - }); +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); +// --------------- +describe('adding + updating name', () => { + let added_org; + let added_org_id; + let added_team; + let added_team_id + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data; + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new team with a valid org should return 200', async () => { + const res2 = await axios.post(base + '/api/teams', { + "name": "test123", + "parentGroup": added_org_id + }, axios_config); + added_team = res2.data; + added_team_id = added_team.id; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('update name', async () => { + const res3 = await axios.put(base + '/api/teams/' + added_team_id, { + "id": added_team_id, + "name": "testlelele", + "contact": null, + "parentGroup": added_org.id + }, axios_config); + expect(res3.status).toEqual(200); + expect(res3.headers['content-type']).toContain("application/json") + let updated_team = res3.data; + added_team.name = "testlelele"; + expect(updated_team).toEqual(added_team) + }); +}); +// --------------- +describe('adding + try updating id (should return 406)', () => { + let added_org; + let added_org_id; + let added_team; + let added_team_id + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data; + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new team with a valid org should return 200', async () => { + const res2 = await axios.post(base + '/api/teams', { + "name": "test123", + "parentGroup": added_org_id + }, axios_config); + added_team = res2.data; + added_team_id = added_team.id; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('update team', async () => { + added_team.id = added_team.id + 1; + added_team.parentGroup = added_team.parentGroup.id; + const res3 = await axios.put(base + '/api/teams/' + added_team_id, added_team, axios_config); + expect(res3.status).toEqual(406); + expect(res3.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('add+update parent org (valid)', () => { + let added_org; + let added_org2; + let added_team; + let added_team_id + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new team with a valid org should return 200', async () => { + const res2 = await axios.post(base + '/api/teams', { + "name": "test123", + "parentGroup": added_org.id + }, axios_config); + added_team = res2.data; + added_team_id = added_team.id; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res3 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org2 = res3.data; + expect(res3.status).toEqual(200); + expect(res3.headers['content-type']).toContain("application/json") + }); + it('update team', async () => { + added_team.parentGroup = added_org2.id; + const res4 = await axios.put(base + '/api/teams/' + added_team_id, added_team, axios_config); + let updated_team = res4.data; + expect(res4.status).toEqual(200); + expect(res4.headers['content-type']).toContain("application/json") + delete added_org2.contact; + delete added_org2.teams; + expect(updated_team.parentGroup).toEqual(added_org2) + }); }); \ No newline at end of file diff --git a/src/tests/runners/runner_update.spec.ts b/src/tests/runners/runner_update.spec.ts index 0cba324..92c80e7 100644 --- a/src/tests/runners/runner_update.spec.ts +++ b/src/tests/runners/runner_update.spec.ts @@ -1,160 +1,156 @@ -import axios from 'axios'; -import { config } from '../../config'; -const base = "http://localhost:" + config.internal_port - -let access_token; -let axios_config; - -beforeAll(async () => { - const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); - access_token = res.data["access_token"]; - axios_config = { - headers: { "authorization": "Bearer " + access_token }, - validateStatus: undefined - }; -}); - -describe('Update runner name after adding', () => { - let added_org; - let added_runner; - let updated_runner; - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new runner with only needed params should return 200', async () => { - const res2 = await axios.post(base + '/api/runners', { - "firstname": "first", - "lastname": "last", - "group": added_org.id - }, axios_config); - added_runner = res2.data; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('valid update should return 200', async () => { - let runnercopy = added_runner - runnercopy.firstname = "second" - runnercopy.group = added_runner.group.id; - const res3 = await axios.put(base + '/api/runners/' + added_runner.id, runnercopy, axios_config); - expect(res3.status).toEqual(200); - expect(res3.headers['content-type']).toContain("application/json") - updated_runner = res3.data; - delete added_org.address; - delete added_org.contact; - delete added_org.teams; - runnercopy.group = added_org; - expect(updated_runner).toEqual(runnercopy); - }); -}); -// --------------- -describe('Update runner group after adding', () => { - let added_org_id; - let added_org_2; - let added_runner; - let updated_runner; - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - let added_org = res1.data - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new runner with only needed params should return 200', async () => { - const res2 = await axios.post(base + '/api/runners', { - "firstname": "first", - "lastname": "last", - "group": added_org_id - }, axios_config); - added_runner = res2.data; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('creating a new org with just a name should return 200', async () => { - const res3 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org_2 = res3.data - delete added_org_2.address; - delete added_org_2.contact; - delete added_org_2.teams; - expect(res3.status).toEqual(200); - expect(res3.headers['content-type']).toContain("application/json") - }); - it('valid group update should return 200', async () => { - added_runner.group = added_org_2.id; - const res3 = await axios.put(base + '/api/runners/' + added_runner.id, added_runner, axios_config); - expect(res3.status).toEqual(200); - expect(res3.headers['content-type']).toContain("application/json") - updated_runner = res3.data - expect(updated_runner.group).toEqual(added_org_2); - }); -}); -// --------------- -describe('Update runner id after adding(should fail)', () => { - let added_org_id; - let added_runner; - let added_runner_id; - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - let added_org = res1.data - added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new runner with only needed params should return 200', async () => { - const res2 = await axios.post(base + '/api/runners', { - "firstname": "first", - "lastname": "last", - "group": added_org_id - }, axios_config); - added_runner = res2.data; - added_runner_id = added_runner.id; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('invalid update should return 406', async () => { - added_runner.id++; - added_runner.group = added_runner.group.id; - const res3 = await axios.put(base + '/api/runners/' + added_runner_id, added_runner, axios_config); - expect(res3.status).toEqual(406); - expect(res3.headers['content-type']).toContain("application/json") - }); -}); -// --------------- -describe('Update runner group with invalid group after adding', () => { - let added_org; - let added_runner; - it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { - "name": "test123" - }, axios_config); - added_org = res1.data - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") - }); - it('creating a new runner with only needed params should return 200', async () => { - const res2 = await axios.post(base + '/api/runners', { - "firstname": "first", - "lastname": "last", - "group": added_org.id - }, axios_config); - added_runner = res2.data; - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - }); - it('invalid group update should return 404', async () => { - added_runner.group = 99999999999999999; - const res3 = await axios.put(base + '/api/runners/' + added_runner.id, added_runner, axios_config); - expect(res3.status).toEqual(404); - expect(res3.headers['content-type']).toContain("application/json") - }); +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +describe('Update runner name after adding', () => { + let added_org; + let added_runner; + let updated_runner; + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res2 = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res2.data; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('valid update should return 200', async () => { + let runnercopy = added_runner + runnercopy.firstname = "second" + runnercopy.group = added_runner.group.id; + const res3 = await axios.put(base + '/api/runners/' + added_runner.id, runnercopy, axios_config); + expect(res3.status).toEqual(200); + expect(res3.headers['content-type']).toContain("application/json") + updated_runner = res3.data; + delete added_org.contact; + delete added_org.teams; + runnercopy.group = added_org; + expect(updated_runner).toEqual(runnercopy); + }); +}); +// --------------- +describe('Update runner group after adding', () => { + let added_org_id; + let added_org_2; + let added_runner; + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + let added_org = res1.data + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res2 = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org_id + }, axios_config); + added_runner = res2.data; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res3 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org_2 = res3.data + delete added_org_2.contact; + delete added_org_2.teams; + expect(res3.status).toEqual(200); + expect(res3.headers['content-type']).toContain("application/json") + }); + it('valid group update should return 200', async () => { + added_runner.group = added_org_2.id; + const res3 = await axios.put(base + '/api/runners/' + added_runner.id, added_runner, axios_config); + expect(res3.status).toEqual(200); + expect(res3.headers['content-type']).toContain("application/json") + expect(res3.data.group).toEqual(added_org_2); + }); +}); +// --------------- +describe('Update runner id after adding(should fail)', () => { + let added_org_id; + let added_runner; + let added_runner_id; + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + let added_org = res1.data + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res2 = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org_id + }, axios_config); + added_runner = res2.data; + added_runner_id = added_runner.id; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('invalid update should return 406', async () => { + added_runner.id++; + added_runner.group = added_runner.group.id; + const res3 = await axios.put(base + '/api/runners/' + added_runner_id, added_runner, axios_config); + expect(res3.status).toEqual(406); + expect(res3.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('Update runner group with invalid group after adding', () => { + let added_org; + let added_runner; + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res2 = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res2.data; + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json") + }); + it('invalid group update should return 404', async () => { + added_runner.group = 99999999999999999; + const res3 = await axios.put(base + '/api/runners/' + added_runner.id, added_runner, axios_config); + expect(res3.status).toEqual(404); + expect(res3.headers['content-type']).toContain("application/json") + }); }); \ No newline at end of file