From 416745762a3899b7676f368f12c6dd677dd44aa5 Mon Sep 17 00:00:00 2001 From: Sebastijan K <58827427+sebastijankuzner@users.noreply.github.com> Date: Fri, 28 Aug 2020 18:27:36 +0200 Subject: [PATCH] test(core-magistrate-crypto): increase test coverage to 100% (#3983) --- .../builders/bridgechain-registration.test.ts | 64 ++++++++ .../builders/bridgechain-resignation.test.ts | 57 +++++++ .../builders/bridgechain-update.test.ts | 63 ++++++++ .../builders/business-registration.test.ts | 60 ++++++++ .../builders/business-resignation.test.ts | 27 ++++ .../builders/business-update.test.ts | 60 ++++++++ .../builders/enity.test.ts | 49 ++++++ .../fixtures/entity/assets/generate.ts | 140 +++--------------- .../unit/core-magistrate-crypto/helper.ts | 4 + .../bridgechain-registration.test.ts | 19 ++- .../bridgechain-resignation.test.ts | 17 +++ .../transactions/bridgechain-update.test.ts | 87 ++++++++--- .../business-registration.test.ts | 17 +++ .../transactions/business-update.test.ts | 37 ++++- .../transactions/entity.test.ts | 81 +++++----- 15 files changed, 595 insertions(+), 187 deletions(-) create mode 100644 __tests__/unit/core-magistrate-crypto/builders/bridgechain-registration.test.ts create mode 100644 __tests__/unit/core-magistrate-crypto/builders/bridgechain-resignation.test.ts create mode 100644 __tests__/unit/core-magistrate-crypto/builders/bridgechain-update.test.ts create mode 100644 __tests__/unit/core-magistrate-crypto/builders/business-registration.test.ts create mode 100644 __tests__/unit/core-magistrate-crypto/builders/business-resignation.test.ts create mode 100644 __tests__/unit/core-magistrate-crypto/builders/business-update.test.ts create mode 100644 __tests__/unit/core-magistrate-crypto/builders/enity.test.ts diff --git a/__tests__/unit/core-magistrate-crypto/builders/bridgechain-registration.test.ts b/__tests__/unit/core-magistrate-crypto/builders/bridgechain-registration.test.ts new file mode 100644 index 0000000000..e814e4a7be --- /dev/null +++ b/__tests__/unit/core-magistrate-crypto/builders/bridgechain-registration.test.ts @@ -0,0 +1,64 @@ +import "jest-extended"; + +import { BridgechainRegistrationTransaction } from "@arkecosystem/core-magistrate-crypto/dist/transactions"; +import { BridgechainRegistrationBuilder } from "@packages/core-magistrate-crypto/src/builders"; +import { IBridgechainRegistrationAsset } from "@packages/core-magistrate-crypto/src/interfaces"; +import { Managers, Transactions } from "@packages/crypto"; + +let builder: BridgechainRegistrationBuilder; + +const bridgechainRegistrationAsset: IBridgechainRegistrationAsset = { + name: "dummy_name", + seedNodes: [], + genesisHash: "dummy_genesis_hash", + bridgechainRepository: "dummy_repository", + bridgechainAssetRepository: "dummy_asset_repository", + ports: { + port_name: 1234, + }, +}; + +beforeAll(() => { + Transactions.TransactionRegistry.registerTransactionType(BridgechainRegistrationTransaction); +}); + +beforeEach(() => { + Managers.configManager.setFromPreset("testnet"); + Managers.configManager.setHeight(2); + builder = new BridgechainRegistrationBuilder(); +}); + +describe("Bridgechain registration builder", () => { + describe("bridgechainRegistrationAsset", () => { + it("should set asset", () => { + expect(builder.bridgechainRegistrationAsset(bridgechainRegistrationAsset)).toBe(builder); + + expect(builder.data.asset!.bridgechainRegistration).toEqual(bridgechainRegistrationAsset); + }); + + it("should not set asset if asset is undefined", () => { + builder.data.asset = undefined; + + expect(builder.bridgechainRegistrationAsset(bridgechainRegistrationAsset)).toBe(builder); + + expect(builder.data.asset).toBeUndefined(); + }); + + it("should not set asset if asset.bridgechainRegistration is undefined", () => { + builder.data.asset!.bridgechainRegistration = undefined; + + expect(builder.bridgechainRegistrationAsset(bridgechainRegistrationAsset)).toBe(builder); + + expect(builder.data.asset!.bridgechainRegistration).toBeUndefined(); + }); + }); + + describe("getStruct", () => { + it("should return struct", () => { + builder.bridgechainRegistrationAsset(bridgechainRegistrationAsset); + const struct = builder.sign("dummy_passphrase").getStruct(); + + expect(struct.asset!.bridgechainRegistration).toEqual(bridgechainRegistrationAsset); + }); + }); +}); diff --git a/__tests__/unit/core-magistrate-crypto/builders/bridgechain-resignation.test.ts b/__tests__/unit/core-magistrate-crypto/builders/bridgechain-resignation.test.ts new file mode 100644 index 0000000000..78fa85ad01 --- /dev/null +++ b/__tests__/unit/core-magistrate-crypto/builders/bridgechain-resignation.test.ts @@ -0,0 +1,57 @@ +import "jest-extended"; + +import { BridgechainResignationTransaction } from "@arkecosystem/core-magistrate-crypto/dist/transactions"; +import { BridgechainResignationBuilder } from "@packages/core-magistrate-crypto/src/builders"; +import { IBridgechainResignationAsset } from "@packages/core-magistrate-crypto/src/interfaces"; +import { Managers, Transactions } from "@packages/crypto"; + +let builder: BridgechainResignationBuilder; + +const bridgechainResignationAsset: IBridgechainResignationAsset = { + bridgechainId: "dummy_id", +}; + +beforeAll(() => { + Transactions.TransactionRegistry.registerTransactionType(BridgechainResignationTransaction); +}); + +beforeEach(() => { + Managers.configManager.setFromPreset("testnet"); + Managers.configManager.setHeight(2); + builder = new BridgechainResignationBuilder(); +}); + +describe("Bridgechain resignation builder", () => { + describe("bridgechainResignationAsset", () => { + it("should set asset", () => { + expect(builder.bridgechainResignationAsset("dummy_id")).toBe(builder); + + expect(builder.data.asset!.bridgechainResignation).toEqual(bridgechainResignationAsset); + }); + + it("should not set asset if asset is undefined", () => { + builder.data.asset = undefined; + + expect(builder.bridgechainResignationAsset("dummy_id")).toBe(builder); + + expect(builder.data.asset).toBeUndefined(); + }); + + it("should not set asset if asset.bridgechainRegistration is undefined", () => { + builder.data.asset!.bridgechainResignation = undefined; + + expect(builder.bridgechainResignationAsset("dummy_id")).toBe(builder); + + expect(builder.data.asset!.bridgechainResignation).toBeUndefined(); + }); + }); + + describe("getStruct", () => { + it("should return struct", () => { + builder.bridgechainResignationAsset("dummy_id"); + const struct = builder.sign("dummy_passphrase").getStruct(); + + expect(struct.asset!.bridgechainResignation).toEqual(bridgechainResignationAsset); + }); + }); +}); diff --git a/__tests__/unit/core-magistrate-crypto/builders/bridgechain-update.test.ts b/__tests__/unit/core-magistrate-crypto/builders/bridgechain-update.test.ts new file mode 100644 index 0000000000..f71d9d4ee0 --- /dev/null +++ b/__tests__/unit/core-magistrate-crypto/builders/bridgechain-update.test.ts @@ -0,0 +1,63 @@ +import "jest-extended"; + +import { BridgechainUpdateTransaction } from "@arkecosystem/core-magistrate-crypto/dist/transactions"; +import { BridgechainUpdateBuilder } from "@packages/core-magistrate-crypto/src/builders"; +import { IBridgechainUpdateAsset } from "@packages/core-magistrate-crypto/src/interfaces"; +import { Managers, Transactions } from "@packages/crypto"; + +let builder: BridgechainUpdateBuilder; + +const bridgechainUpdateAsset: IBridgechainUpdateAsset = { + bridgechainId: "dummy_id", + seedNodes: [], + ports: { + dummy_port: 1234, + }, + bridgechainRepository: "dummy_repository", + bridgechainAssetRepository: "dummy_asset_repository", +}; + +beforeAll(() => { + Transactions.TransactionRegistry.registerTransactionType(BridgechainUpdateTransaction); +}); + +beforeEach(() => { + Managers.configManager.setFromPreset("testnet"); + Managers.configManager.setHeight(2); + builder = new BridgechainUpdateBuilder(); +}); + +describe("Bridgechain update builder", () => { + describe("bridgechainUpdateAsset", () => { + it("should set asset", () => { + expect(builder.bridgechainUpdateAsset(bridgechainUpdateAsset)).toBe(builder); + + expect(builder.data.asset!.bridgechainUpdate).toEqual(bridgechainUpdateAsset); + }); + + it("should not set asset if asset is undefined", () => { + builder.data.asset = undefined; + + expect(builder.bridgechainUpdateAsset(bridgechainUpdateAsset)).toBe(builder); + + expect(builder.data.asset).toBeUndefined(); + }); + + it("should not set asset if asset.bridgechainRegistration is undefined", () => { + builder.data.asset!.bridgechainUpdate = undefined; + + expect(builder.bridgechainUpdateAsset(bridgechainUpdateAsset)).toBe(builder); + + expect(builder.data.asset!.bridgechainUpdate).toBeUndefined(); + }); + }); + + describe("getStruct", () => { + it("should return struct", () => { + builder.bridgechainUpdateAsset(bridgechainUpdateAsset); + const struct = builder.sign("dummy_passphrase").getStruct(); + + expect(struct.asset!.bridgechainUpdate).toEqual(bridgechainUpdateAsset); + }); + }); +}); diff --git a/__tests__/unit/core-magistrate-crypto/builders/business-registration.test.ts b/__tests__/unit/core-magistrate-crypto/builders/business-registration.test.ts new file mode 100644 index 0000000000..cd9e969987 --- /dev/null +++ b/__tests__/unit/core-magistrate-crypto/builders/business-registration.test.ts @@ -0,0 +1,60 @@ +import "jest-extended"; + +import { BusinessRegistrationTransaction } from "@arkecosystem/core-magistrate-crypto/dist/transactions"; +import { BusinessRegistrationBuilder } from "@packages/core-magistrate-crypto/src/builders"; +import { IBusinessRegistrationAsset } from "@packages/core-magistrate-crypto/src/interfaces"; +import { Managers, Transactions } from "@packages/crypto"; + +let builder: BusinessRegistrationBuilder; + +const businessRegistrationAsset: IBusinessRegistrationAsset = { + name: "dummy_name", + website: "dummy_website", + vat: "dummy_vat", + repository: "dummy_repository", +}; + +beforeAll(() => { + Transactions.TransactionRegistry.registerTransactionType(BusinessRegistrationTransaction); +}); + +beforeEach(() => { + Managers.configManager.setFromPreset("testnet"); + Managers.configManager.setHeight(2); + builder = new BusinessRegistrationBuilder(); +}); + +describe("Business registration builder", () => { + describe("businessRegistrationAsset", () => { + it("should set asset", () => { + expect(builder.businessRegistrationAsset(businessRegistrationAsset)).toBe(builder); + + expect(builder.data.asset!.businessRegistration).toEqual(businessRegistrationAsset); + }); + + it("should not set asset if asset is undefined", () => { + builder.data.asset = undefined; + + expect(builder.businessRegistrationAsset(businessRegistrationAsset)).toBe(builder); + + expect(builder.data.asset).toBeUndefined(); + }); + + it("should not set asset if asset.bridgechainRegistration is undefined", () => { + builder.data.asset!.businessRegistration = undefined; + + expect(builder.businessRegistrationAsset(businessRegistrationAsset)).toBe(builder); + + expect(builder.data.asset!.businessRegistration).toBeUndefined(); + }); + }); + + describe("getStruct", () => { + it("should return struct", () => { + builder.businessRegistrationAsset(businessRegistrationAsset); + const struct = builder.sign("dummy_passphrase").getStruct(); + + expect(struct.asset!.businessRegistration).toEqual(businessRegistrationAsset); + }); + }); +}); diff --git a/__tests__/unit/core-magistrate-crypto/builders/business-resignation.test.ts b/__tests__/unit/core-magistrate-crypto/builders/business-resignation.test.ts new file mode 100644 index 0000000000..7afc0590f3 --- /dev/null +++ b/__tests__/unit/core-magistrate-crypto/builders/business-resignation.test.ts @@ -0,0 +1,27 @@ +import "jest-extended"; + +import { BusinessResignationTransaction } from "@arkecosystem/core-magistrate-crypto/dist/transactions"; +import { BusinessResignationBuilder } from "@packages/core-magistrate-crypto/src/builders"; +import { Managers, Transactions } from "@packages/crypto"; + +let builder: BusinessResignationBuilder; + +beforeAll(() => { + Transactions.TransactionRegistry.registerTransactionType(BusinessResignationTransaction); +}); + +beforeEach(() => { + Managers.configManager.setFromPreset("testnet"); + Managers.configManager.setHeight(2); + builder = new BusinessResignationBuilder(); +}); + +describe("Business resignation builder", () => { + describe("getStruct", () => { + it("should return struct", () => { + const struct = builder.sign("dummy_passphrase").getStruct(); + + expect(struct.asset!.businessResignation).toEqual({}); + }); + }); +}); diff --git a/__tests__/unit/core-magistrate-crypto/builders/business-update.test.ts b/__tests__/unit/core-magistrate-crypto/builders/business-update.test.ts new file mode 100644 index 0000000000..f96713c91a --- /dev/null +++ b/__tests__/unit/core-magistrate-crypto/builders/business-update.test.ts @@ -0,0 +1,60 @@ +import "jest-extended"; + +import { BusinessUpdateTransaction } from "@arkecosystem/core-magistrate-crypto/dist/transactions"; +import { BusinessUpdateBuilder } from "@packages/core-magistrate-crypto/src/builders"; +import { IBusinessUpdateAsset } from "@packages/core-magistrate-crypto/src/interfaces"; +import { Managers, Transactions } from "@packages/crypto"; + +let builder: BusinessUpdateBuilder; + +const businessUpdateAsset: IBusinessUpdateAsset = { + name: "dummy_name", + website: "dummy_website", + vat: "dummy_vat", + repository: "dummy_repository", +}; + +beforeAll(() => { + Transactions.TransactionRegistry.registerTransactionType(BusinessUpdateTransaction); +}); + +beforeEach(() => { + Managers.configManager.setFromPreset("testnet"); + Managers.configManager.setHeight(2); + builder = new BusinessUpdateBuilder(); +}); + +describe("Business update builder", () => { + describe("businessUpdateAsset", () => { + it("should set asset", () => { + expect(builder.businessUpdateAsset(businessUpdateAsset)).toBe(builder); + + expect(builder.data.asset!.businessUpdate).toEqual(businessUpdateAsset); + }); + + it("should not set asset if asset is undefined", () => { + builder.data.asset = undefined; + + expect(builder.businessUpdateAsset(businessUpdateAsset)).toBe(builder); + + expect(builder.data.asset).toBeUndefined(); + }); + + it("should not set asset if asset.bridgechainRegistration is undefined", () => { + builder.data.asset!.businessUpdate = undefined; + + expect(builder.businessUpdateAsset(businessUpdateAsset)).toBe(builder); + + expect(builder.data.asset!.businessUpdate).toBeUndefined(); + }); + }); + + describe("getStruct", () => { + it("should return struct", () => { + builder.businessUpdateAsset(businessUpdateAsset); + const struct = builder.sign("dummy_passphrase").getStruct(); + + expect(struct.asset!.businessUpdate).toEqual(businessUpdateAsset); + }); + }); +}); diff --git a/__tests__/unit/core-magistrate-crypto/builders/enity.test.ts b/__tests__/unit/core-magistrate-crypto/builders/enity.test.ts new file mode 100644 index 0000000000..8ef542ed50 --- /dev/null +++ b/__tests__/unit/core-magistrate-crypto/builders/enity.test.ts @@ -0,0 +1,49 @@ +import "jest-extended"; + +import { EntityAction, EntitySubType, EntityType } from "@arkecosystem/core-magistrate-crypto/dist/enums"; +import { EntityTransaction } from "@arkecosystem/core-magistrate-crypto/dist/transactions"; +import { EntityBuilder } from "@packages/core-magistrate-crypto/src/builders"; +import { IEntityAsset } from "@packages/core-magistrate-crypto/src/interfaces"; +import { Managers, Transactions } from "@packages/crypto"; + +let builder: EntityBuilder; + +const entityAsset: IEntityAsset = { + type: EntityType.Bridgechain, + subType: EntitySubType.None, + action: EntityAction.Register, + registrationId: "dummy_registration_id", + data: { + name: "dummy_name", + ipfsData: "dummy_ipfs_data", + }, +}; + +beforeAll(() => { + Transactions.TransactionRegistry.registerTransactionType(EntityTransaction); +}); + +beforeEach(() => { + Managers.configManager.setFromPreset("testnet"); + Managers.configManager.setHeight(2); + builder = new EntityBuilder(); +}); + +describe("Entity builder", () => { + describe("businessRegistrationAsset", () => { + it("should set asset", () => { + expect(builder.asset(entityAsset)).toBe(builder); + + expect(builder.data.asset).toEqual(entityAsset); + }); + }); + + describe("getStruct", () => { + it("should return struct", () => { + builder.asset(entityAsset); + const struct = builder.sign("dummy_passphrase").getStruct(); + + expect(struct.asset).toEqual(entityAsset); + }); + }); +}); diff --git a/__tests__/unit/core-magistrate-crypto/fixtures/entity/assets/generate.ts b/__tests__/unit/core-magistrate-crypto/fixtures/entity/assets/generate.ts index bebb7fa3f4..29784d85c2 100644 --- a/__tests__/unit/core-magistrate-crypto/fixtures/entity/assets/generate.ts +++ b/__tests__/unit/core-magistrate-crypto/fixtures/entity/assets/generate.ts @@ -1,93 +1,10 @@ -import { - EntityType, - EntitySubType, - EntityAction -} from "@arkecosystem/core-magistrate-crypto/src/enums"; import { IEntityAsset } from "@arkecosystem/core-magistrate-crypto/dist/interfaces"; +import { EntityAction, EntitySubType, EntityType } from "@arkecosystem/core-magistrate-crypto/src/enums"; -const allTypes = [ - EntityType.Business, - EntityType.Bridgechain, - EntityType.Developer, - EntityType.Plugin, -]; -const allSubTypes = [ - EntitySubType.None, - EntitySubType.PluginCore, - EntitySubType.PluginDesktop, -]; -const allActions = [ - EntityAction.Register, - EntityAction.Update, - EntityAction.Resign, -]; -const registrationIds = [ - undefined, - "c8b924ec44ac3341a110d440f630149e97c8c9c630dff5040466834096eba7f9", -] -const datas = [ - { name: "the name of the entity" }, - { description: " the description of the entity" }, - { website: "www.thewebsite.com" }, - { website: "website could be any string tho for ser/deser" }, - { sourceControl: { github: "https://github.com/theorg/therepo" }}, - { sourceControl: { github: "github could be any string tho" }}, - { sourceControl: { gitlab: "https://gitlab.com/theorg/therepo" }}, - { sourceControl: { gitlab: "gitlab could be any string tho" }}, - { sourceControl: { bitbucket: "https://bitbucket.com/theorg/therepo" }}, - { sourceControl: { bitbucket: "bitbucket could be any string tho" }}, - { sourceControl: { npmjs: "https://npmjs.com/theorg/therepo" }}, - { sourceControl: { npmjs: "npmjs could be any string tho" }}, - { socialMedia: { twitter: "https://twitter.com/dummy" }}, - { socialMedia: { twitter: "twitter could be any string tho" }}, - { socialMedia: { facebook: "https://facebook.com/dummy" }}, - { socialMedia: { facebook: "facebook could be any string tho" }}, - { socialMedia: { linkedin: "https://linkedin.com/dummy" }}, - { socialMedia: { linkedin: "linkedin could be any string tho" }}, - { images: [ "https://flickr.com/dummy.png" ] }, - { images: [ "https://flickr.com/dummy1.png", "https://flickr.com/dummy2.png", "could be any string as image tho" ] }, - { videos: [ "https://youtube.com/dummy" ] }, - { videos: [ "https://youtube.com/dummy", "https://youtube.com/dummy3423", "could be any string as video tho" ] }, -]; -const specialDatas = [ - // special datas where data => ser => deser does not give back data (see examples) - // basically, empty object or empty array or empty string is considered undefined - // [dataToSerialize, expectedDeserialized] - [{ name: "" }, {}], - [{ description: "" }, {}], - [{ website: "" }, {}], - [{ sourceControl: { github: "" }}, {}], - [{ sourceControl: { gitlab: "" }}, {}], - [{ sourceControl: { bitbucket: "" }}, {}], - [{ sourceControl: { npmjs: "" }}, {}], - [{ socialMedia: { twitter: "" }}, {}], - [{ socialMedia: { facebook: "" }}, {}], - [{ socialMedia: { linkedin: "" }}, {}], - [ { images: [] }, {} ], - [ { name: "the name", images: [] }, { name: "the name" }], - [ { videos: [] }, {} ], - [ { name: "another name", videos: [] }, { name: "another name" }], - [ { sourceControl: {} }, {} ], - [ { name: "new name", sourceControl: {} }, { name: "new name" }], - [ { socialMedia: {} }, {} ], - [ { description: "some description", socialMedia: {} }, { description: "some description" }], -]; - -// base asset properties we will use to generate all kind of {data} with it -const baseAssets = [ - { - type: EntityType.Developer, - subType: EntitySubType.None, - action: EntityAction.Update, - registrationId: "533384534cd561fc17f72be0bb57bf39961954ba0741f53c08e3f463ef19118c", - }, - { - type: EntityType.Plugin, - subType: EntitySubType.PluginDesktop, - action: EntityAction.Register, - registrationId: undefined - } -]; +const allTypes = [EntityType.Business, EntityType.Bridgechain, EntityType.Developer, EntityType.Plugin]; +const allSubTypes = [EntitySubType.None, EntitySubType.PluginCore, EntitySubType.PluginDesktop]; +const allActions = [EntityAction.Register, EntityAction.Update, EntityAction.Resign]; +const registrationIds = [undefined, "c8b924ec44ac3341a110d440f630149e97c8c9c630dff5040466834096eba7f9"]; export const generateAssets = () => { // generate all combinations of { type, subType, action, registrationId} @@ -102,42 +19,23 @@ export const generateAssets = () => { subType, action, registrationId, - data: {} // in theory (for ser/deser) we could have empty {data} - }) + data: {}, // in theory (for ser/deser) we could have empty {data} + }); + + assets.push({ + type, + subType, + action, + registrationId, + data: { + name: "name", + ipfsData: "ipfsData", + }, + }); } } } } - - for (const baseAsset of baseAssets) { - for (const data of datas) { - assets.push({ - ...baseAsset, - data - }) - } - } - - return assets; -} - -// generateSpecialAssets returns [assetToSerialize, expectedAssetDeserialized] -export const generateSpecialAssets = () => { - const assets: any[] = []; - for (const baseAsset of baseAssets) { - for (const [dataToSerialize, expectedDeserialized] of specialDatas) { - assets.push([ - { - ...baseAsset, - data: dataToSerialize - }, - { - ...baseAsset, - data: expectedDeserialized - }, - ]) - } - } return assets; -} \ No newline at end of file +}; diff --git a/__tests__/unit/core-magistrate-crypto/helper.ts b/__tests__/unit/core-magistrate-crypto/helper.ts index 2ede34d5d3..75604dbe17 100644 --- a/__tests__/unit/core-magistrate-crypto/helper.ts +++ b/__tests__/unit/core-magistrate-crypto/helper.ts @@ -60,6 +60,10 @@ export const businessUpdateAsset3: IBusinessUpdateAsset = { repository: "http://www.repository.com/myorg/myrepo", }; +export const businessUpdateAsset4: IBusinessUpdateAsset = { + website: "https://www.ark.io", +}; + // Bridgechain registration assets export const bridgechainRegistrationAsset1: IBridgechainRegistrationAsset = { name: "arkecosystem1", diff --git a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-registration.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-registration.test.ts index 076acf74c6..3cae29f9cc 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-registration.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-registration.test.ts @@ -1,9 +1,9 @@ import "jest-extended"; import { BridgechainRegistrationBuilder } from "@packages/core-magistrate-crypto/src/builders"; +import { BridgechainRegistrationTransaction } from "@packages/core-magistrate-crypto/src/transactions"; import { Managers, Transactions, Validation } from "@packages/crypto"; -import { BridgechainRegistrationTransaction } from "@packages/core-magistrate-crypto/src/transactions"; import { bridgechainRegistrationAsset1, bridgechainRegistrationAsset2, checkCommonFields } from "../helper"; let builder: BridgechainRegistrationBuilder; @@ -56,6 +56,23 @@ describe("Bridgechain registration transaction", () => { bridgechainRegistration.asset!.bridgechainRegistration, ); }); + + it("should throw on serialization if asset is undefined", () => { + const bridgechainRegistration = builder + .bridgechainRegistrationAsset(bridgechainRegistrationAsset2) + .network(23) + .sign("passphrase") + .getStruct(); + + const transaction = Transactions.TransactionFactory.fromData(bridgechainRegistration); + expect(transaction.serialize()).toBeDefined(); + + transaction.data.asset = undefined; + + expect(() => { + transaction.serialize(); + }).toThrowError(); + }); }); describe("Schema tests", () => { diff --git a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-resignation.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-resignation.test.ts index 30a5bbee5e..b36ad7ddcb 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-resignation.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-resignation.test.ts @@ -34,6 +34,23 @@ describe("Bridgechain registration transaction", () => { checkCommonFields(deserialized, bridgechainResignation); }); + + it("should throw on serialization if asset is undefined", () => { + const bridgechainResignation = builder + .bridgechainResignationAsset(genesisHash) + .network(23) + .sign("passphrase") + .getStruct(); + + const transaction = Transactions.TransactionFactory.fromData(bridgechainResignation); + expect(transaction.serialize()).toBeDefined(); + + transaction.data.asset = undefined; + + expect(() => { + transaction.serialize(); + }).toThrowError(); + }); }); describe("Schema tests", () => { diff --git a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-update.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-update.test.ts index 54ff5c6865..287758c256 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-update.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-update.test.ts @@ -1,5 +1,7 @@ import "jest-extended"; +import ByteBuffer from "bytebuffer"; + import { BridgechainUpdateBuilder } from "@packages/core-magistrate-crypto/src/builders"; import { Managers, Transactions, Validation } from "@packages/crypto"; import { BridgechainUpdateTransaction } from "@packages/core-magistrate-crypto/src/transactions"; @@ -19,23 +21,74 @@ describe("Bridgechain update ser/deser", () => { builder = new BridgechainUpdateBuilder(); }); - it("should ser/deserialize giving back original fields", () => { - const businessResignation = builder - .network(23) - .bridgechainUpdateAsset({ - bridgechainId: genesisHash, - seedNodes: ["74.125.224.72"], - ports: { "@arkecosystem/core-api": 12345 }, - bridgechainRepository: "http://www.repository.com/myorg/myrepo", - bridgechainAssetRepository: "http://www.repository.com/myorg/myassetrepo", - }) - .sign("passphrase") - .getStruct(); - - const serialized = Transactions.TransactionFactory.fromData(businessResignation).serialized.toString("hex"); - const deserialized = Transactions.Deserializer.deserialize(serialized); - - checkCommonFields(deserialized, businessResignation); + describe("Ser/deser", () => { + it("should ser/deserialize giving back original fields", () => { + const businessResignation = builder + .network(23) + .bridgechainUpdateAsset({ + bridgechainId: genesisHash, + seedNodes: ["74.125.224.72"], + ports: {"@arkecosystem/core-api": 12345}, + bridgechainRepository: "http://www.repository.com/myorg/myrepo", + bridgechainAssetRepository: "http://www.repository.com/myorg/myassetrepo", + }) + .sign("passphrase") + .getStruct(); + + const serialized = Transactions.TransactionFactory.fromData(businessResignation).serialized.toString("hex"); + const deserialized = Transactions.Deserializer.deserialize(serialized); + + checkCommonFields(deserialized, businessResignation); + }); + + it("should ser/deserialize if fiends have length 0", () => { + const businessResignation = builder + .network(23) + .bridgechainUpdateAsset({ + bridgechainId: genesisHash, + seedNodes: ["74.125.224.72"], + ports: {"@arkecosystem/core-api": 12345}, + bridgechainRepository: "http://www.repository.com/myorg/myrepo", + bridgechainAssetRepository: "http://www.repository.com/myorg/myassetrepo", + }) + .sign("passphrase") + .getStruct(); + + const transaction = Transactions.TransactionFactory.fromData(businessResignation); + + + transaction.data.asset!.seedNodes = []; + transaction.data.asset!.ports = {}; + transaction.data.asset!.bridgechainRepository = ""; + transaction.data.asset!.bridgechainAssetRepository = ""; + + const serialized = ByteBuffer.fromHex(transaction.serialize().toString("hex")); + + transaction.deserialize(serialized); + }); + + it("should throw on serialization if asset is undefined", () => { + const businessResignation = builder + .network(23) + .bridgechainUpdateAsset({ + bridgechainId: genesisHash, + seedNodes: ["74.125.224.72"], + ports: {"@arkecosystem/core-api": 12345}, + bridgechainRepository: "http://www.repository.com/myorg/myrepo", + bridgechainAssetRepository: "http://www.repository.com/myorg/myassetrepo", + }) + .sign("passphrase") + .getStruct(); + + const transaction = Transactions.TransactionFactory.fromData(businessResignation); + expect(transaction.serialize()).toBeDefined(); + + transaction.data.asset = undefined; + + expect(() => { + transaction.serialize(); + }).toThrowError(); + }); }); describe("Schema tests", () => { diff --git a/__tests__/unit/core-magistrate-crypto/transactions/business-registration.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/business-registration.test.ts index d94f22fcc1..60639852b5 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/business-registration.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/business-registration.test.ts @@ -89,6 +89,23 @@ describe("Business registration transaction", () => { expect(deserialized.data.asset!.businessRegistration).toStrictEqual(businessRegistrationAsset4); }); + + it("should throw on serialization if asset is undefined", () => { + const businessRegistration = builder + .businessRegistrationAsset(businessRegistrationAsset4) + .network(23) + .sign("passphrase") + .getStruct(); + + const transaction = Transactions.TransactionFactory.fromData(businessRegistration); + expect(transaction.serialize()).toBeDefined(); + + transaction.data.asset = undefined; + + expect(() => { + transaction.serialize(); + }).toThrowError(); + }); }); describe("Schema tests", () => { diff --git a/__tests__/unit/core-magistrate-crypto/transactions/business-update.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/business-update.test.ts index 68d6318fef..a80490c285 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/business-update.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/business-update.test.ts @@ -4,7 +4,13 @@ import { BusinessUpdateBuilder } from "@packages/core-magistrate-crypto/src/buil import { BusinessUpdateTransaction } from "@packages/core-magistrate-crypto/src/transactions"; import { Managers, Transactions, Validation as Ajv } from "@packages/crypto"; -import { businessUpdateAsset1, businessUpdateAsset2, businessUpdateAsset3, checkCommonFields } from "../helper"; +import { + businessUpdateAsset1, + businessUpdateAsset2, + businessUpdateAsset3, + businessUpdateAsset4, + checkCommonFields, +} from "../helper"; let builder: BusinessUpdateBuilder; @@ -55,6 +61,35 @@ describe("Business update transaction", () => { checkCommonFields(deserialized, businessResignation); }); + it("should ser/deserialize giving back original fields", () => { + const businessResignation = builder + .network(23) + .businessUpdateAsset(businessUpdateAsset4) + .sign("passphrase") + .getStruct(); + + const serialized = Transactions.TransactionFactory.fromData(businessResignation).serialized.toString("hex"); + const deserialized = Transactions.Deserializer.deserialize(serialized); + + checkCommonFields(deserialized, businessResignation); + }); + + it("should throw on serialization if asset is undefined", () => { + const businessResignation = builder + .network(23) + .businessUpdateAsset(businessUpdateAsset3) + .sign("passphrase") + .getStruct(); + + const transaction = Transactions.TransactionFactory.fromData(businessResignation); + expect(transaction.serialize()).toBeDefined(); + + transaction.data.asset = undefined; + + expect(() => { + transaction.serialize(); + }).toThrowError(); + }); }); describe("Schema validation", () => { diff --git a/__tests__/unit/core-magistrate-crypto/transactions/entity.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/entity.test.ts index 075af9601a..9aee1eedf3 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/entity.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/entity.test.ts @@ -1,15 +1,15 @@ import "jest-extended"; +import { Interfaces } from "@arkecosystem/core-magistrate-crypto"; import { EntityBuilder } from "@arkecosystem/core-magistrate-crypto/src/builders"; import { EntityTransaction } from "@arkecosystem/core-magistrate-crypto/src/transactions"; import { Managers, Transactions, Validation } from "@arkecosystem/crypto"; +import { generateAssets } from "../fixtures/entity/assets/generate"; +import { invalidRegisters, validRegisters } from "../fixtures/entity/schemas/register"; +import { invalidResigns, validResigns } from "../fixtures/entity/schemas/resign"; +import { invalidUpdates, validUpdates } from "../fixtures/entity/schemas/update"; import { checkCommonFields } from "../helper"; -import { generateAssets, generateSpecialAssets } from "../fixtures/entity/assets/generate"; -import { validRegisters, invalidRegisters } from "../fixtures/entity/schemas/register"; -import { validResigns, invalidResigns } from "../fixtures/entity/schemas/resign"; -import { validUpdates, invalidUpdates } from "../fixtures/entity/schemas/update"; -import { Interfaces } from "@arkecosystem/core-magistrate-crypto"; let builder: EntityBuilder; @@ -25,18 +25,13 @@ describe("Entity transaction", () => { describe("Ser/deser", () => { const entityAssets = generateAssets(); - const entitySpecialAssets = generateSpecialAssets(); - it.each([entityAssets])("should ser/deserialize giving back original fields", (asset) => { - const mockVerifySchema = jest.spyOn(Transactions.Verifier, "verifySchema").mockImplementation( - (data) => ({ value: data, error: undefined }) - ); + it.each(entityAssets)("should ser/deserialize giving back original fields", (asset) => { + const mockVerifySchema = jest + .spyOn(Transactions.Verifier, "verifySchema") + .mockImplementation((data) => ({ value: data, error: undefined })); - const entity = builder - .network(23) - .asset(asset) - .sign("passphrase") - .getStruct(); + const entity = builder.network(23).asset(asset).sign("passphrase").getStruct(); const serialized = Transactions.TransactionFactory.fromData(entity).serialized.toString("hex"); const deserialized = Transactions.Deserializer.deserialize(serialized); @@ -46,21 +41,6 @@ describe("Entity transaction", () => { mockVerifySchema.mockRestore(); }); - - it.each([entitySpecialAssets]) - ("should ser/deserialize giving back original fields", ([assetToSerialize, expectedDeserialized]) => { - const entity = builder - .network(23) - .asset(assetToSerialize) - .sign("passphrase") - .getStruct(); - - const serialized = Transactions.TransactionFactory.fromData(entity).serialized.toString("hex"); - const deserialized = Transactions.Deserializer.deserialize(serialized); - - checkCommonFields(deserialized, entity); - expect(deserialized.data.asset).toEqual(expectedDeserialized); - }); }); describe("Schema tests", () => { @@ -70,21 +50,28 @@ describe("Entity transaction", () => { transactionSchema = EntityTransaction.getSchema(); }); - it.each([...validRegisters, ...validResigns, ...validUpdates].map(asset => [asset])) - ("should not give any validation error", (asset: Interfaces.IEntityAsset) => { - const entityRegistration = builder.asset(asset).sign("passphrase"); - - const { error, value } = Validation.validator.validate(transactionSchema, entityRegistration.getStruct()); - expect(error).toBeUndefined(); - expect(value.asset).toEqual(asset); - }); - - it.each([...invalidRegisters, ...invalidResigns, ...invalidUpdates].map(asset => [asset])) - ("should give validation error", (asset: Interfaces.IEntityAsset) => { - const entityRegistration = builder.asset(asset).sign("passphrase"); - - const { error } = Validation.validator.validate(transactionSchema, entityRegistration.getStruct()); - expect(error).not.toBeUndefined(); - }); + it.each([...validRegisters, ...validResigns, ...validUpdates].map((asset) => [asset]))( + "should not give any validation error", + (asset: Interfaces.IEntityAsset) => { + const entityRegistration = builder.asset(asset).sign("passphrase"); + + const { error, value } = Validation.validator.validate( + transactionSchema, + entityRegistration.getStruct(), + ); + expect(error).toBeUndefined(); + expect(value.asset).toEqual(asset); + }, + ); + + it.each([...invalidRegisters, ...invalidResigns, ...invalidUpdates].map((asset) => [asset]))( + "should give validation error", + (asset: Interfaces.IEntityAsset) => { + const entityRegistration = builder.asset(asset).sign("passphrase"); + + const { error } = Validation.validator.validate(transactionSchema, entityRegistration.getStruct()); + expect(error).not.toBeUndefined(); + }, + ); }); -}); \ No newline at end of file +});