diff --git a/README.md b/README.md index 1359158..34ecde2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Beyond The Cloud logo -API version +API version License GitHub Repo stars GitHub Release diff --git a/examples/main/default/classes/AccountTestModule.cls b/examples/main/default/classes/AccountTestModule.cls index 5cf2488..ca357d4 100644 --- a/examples/main/default/classes/AccountTestModule.cls +++ b/examples/main/default/classes/AccountTestModule.cls @@ -44,7 +44,7 @@ public class AccountTestModule implements TestModule.BuilderProvider, TestModule } } - private class Mocker extends TestModule.RecordMocker { + public class Mocker extends TestModule.RecordMocker { private Mocker() { super(new Account(Name = 'Test Account', Industry = 'Technology')); } diff --git a/examples/main/default/classes/AccountTestModule.cls-meta.xml b/examples/main/default/classes/AccountTestModule.cls-meta.xml index 82775b9..b009296 100644 --- a/examples/main/default/classes/AccountTestModule.cls-meta.xml +++ b/examples/main/default/classes/AccountTestModule.cls-meta.xml @@ -1,5 +1,5 @@ - 65.0 + 67.0 Active diff --git a/examples/main/default/classes/ContactTestModule.cls b/examples/main/default/classes/ContactTestModule.cls index 931c304..f42756c 100644 --- a/examples/main/default/classes/ContactTestModule.cls +++ b/examples/main/default/classes/ContactTestModule.cls @@ -44,7 +44,7 @@ public class ContactTestModule implements TestModule.BuilderProvider, TestModule } } - private class Mocker extends TestModule.RecordMocker { + public class Mocker extends TestModule.RecordMocker { private Mocker() { super(new Contact(FirstName = 'Test', LastName = 'Contact', Email = 'test.contact@example.com')); } diff --git a/examples/main/default/classes/ContactTestModule.cls-meta.xml b/examples/main/default/classes/ContactTestModule.cls-meta.xml index 82775b9..b009296 100644 --- a/examples/main/default/classes/ContactTestModule.cls-meta.xml +++ b/examples/main/default/classes/ContactTestModule.cls-meta.xml @@ -1,5 +1,5 @@ - 65.0 + 67.0 Active diff --git a/examples/main/default/classes/OpportunityTestModule.cls b/examples/main/default/classes/OpportunityTestModule.cls index 2f41151..ac63a6a 100644 --- a/examples/main/default/classes/OpportunityTestModule.cls +++ b/examples/main/default/classes/OpportunityTestModule.cls @@ -49,7 +49,7 @@ public class OpportunityTestModule implements TestModule.BuilderProvider, TestMo } } - private class Mocker extends TestModule.RecordMocker { + public class Mocker extends TestModule.RecordMocker { private Mocker() { super(new Opportunity(Name = 'Test Opportunity', StageName = 'Prospecting', CloseDate = Date.today().addDays(30))); } diff --git a/examples/main/default/classes/OpportunityTestModule.cls-meta.xml b/examples/main/default/classes/OpportunityTestModule.cls-meta.xml index 82775b9..b009296 100644 --- a/examples/main/default/classes/OpportunityTestModule.cls-meta.xml +++ b/examples/main/default/classes/OpportunityTestModule.cls-meta.xml @@ -1,5 +1,5 @@ - 65.0 + 67.0 Active diff --git a/force-app/main/default/classes/TestModule.cls b/force-app/main/default/classes/TestModule.cls index ff6f72e..6a7c703 100644 --- a/force-app/main/default/classes/TestModule.cls +++ b/force-app/main/default/classes/TestModule.cls @@ -2,7 +2,7 @@ * Copyright (c) 2026 Beyond The Cloud Sp. z o.o. (BeyondTheCloud.Dev) * Licensed under the MIT License (https://github.com/beyond-the-cloud-dev/test-lib/blob/main/LICENSE) * - * v0.1.0 + * v0.2.0 **/ @IsTest @TestVisible @@ -68,17 +68,23 @@ private class TestModule { return new ListRandomizer(values); } + private static void validateRecordsAmount(Integer amount) { + if (amount == null || amount < 0) { + throw new TestModuleException('Amount must be zero or greater, but was: ' + amount + '.'); + } + } + public abstract class RecordBuilder implements Builder { private SObject prototype; private Template templates; private RandomizersContainer randomizers = new RandomizersContainer(); public RecordBuilder(SObject prototype) { - this.prototype = prototype; + this.prototype = prototype.clone(true, true, true, true); } public RecordBuilder(Template templates) { - this.prototype = templates.defaultTemplate(); + this(templates.defaultTemplate()); this.templates = templates; } @@ -126,17 +132,21 @@ private class TestModule { } public SObject build() { - this.randomizers.randomizeFieldsValues(this.prototype, 0); - return this.prototype; + SObject record = this.prototype.clone(true, true, true, true); + this.randomizers.randomizeFieldsValues(record, 0); + return record; } public SObject buildAndInsert() { - insert as system this.prototype; - return this.prototype; + SObject record = this.build(); + insert as system record; + return record; } public List build(Integer amount) { - List records = new List(); + validateRecordsAmount(amount); + + List records = (List) Type.forName('List<' + this.prototype.getSObjectType() + '>').newInstance(); this.randomizeFieldsValues(records, amount); return records; } @@ -161,6 +171,7 @@ private class TestModule { private Map> children = new Map>(); private Template templates; private RandomizersContainer randomizers = new RandomizersContainer(); + private Boolean withFakeId = false; private SObjectType prototypeType; @@ -184,12 +195,12 @@ private class TestModule { } public virtual RecordMocker setChildren(String relationship, List records) { - this.children.put(relationship, records); + this.children.put(relationship, records.deepClone(true, true, true)); return this; } public virtual RecordMocker setFakeId() { - this.fields.put('Id', TestModule.IdGenerator.get(this.prototypeType)); + this.withFakeId = true; return this; } @@ -213,7 +224,9 @@ private class TestModule { } public List build(Integer amount) { - List records = new List(); + validateRecordsAmount(amount); + + List records = (List) Type.forName('List<' + this.prototypeType + '>').newInstance(); for (Integer i = 0; i < amount; i++) { records.add(this.buildWithIndex(i)); } @@ -224,6 +237,11 @@ private class TestModule { Map record = new Map(); this.setNested(record); + + if (this.withFakeId) { + record.put('Id', TestModule.IdGenerator.get(this.prototypeType)); + } + this.setChildren(record); this.randomizers.randomizeFieldsValues(record, index); @@ -272,6 +290,10 @@ private class TestModule { private List values; public ListRandomizer(List values) { + if (values == null || values.isEmpty()) { + throw new TestModuleException('ListRandomizer requires at least one value.'); + } + this.values = values; } diff --git a/force-app/main/default/classes/TestModule.cls-meta.xml b/force-app/main/default/classes/TestModule.cls-meta.xml index 82775b9..b009296 100644 --- a/force-app/main/default/classes/TestModule.cls-meta.xml +++ b/force-app/main/default/classes/TestModule.cls-meta.xml @@ -1,5 +1,5 @@ - 65.0 + 67.0 Active diff --git a/force-app/main/default/classes/TestModule_Test.cls b/force-app/main/default/classes/TestModule_Test.cls index 427583d..8942643 100644 --- a/force-app/main/default/classes/TestModule_Test.cls +++ b/force-app/main/default/classes/TestModule_Test.cls @@ -68,6 +68,7 @@ private class TestModule_Test { List accounts = new AccountTestModule().Builder().build(5); Assert.areEqual(5, accounts.size()); + Assert.areEqual(Account.SObjectType, accounts.getSObjectType(), 'The built list must be concretely typed.'); for (SObject acc : accounts) { Assert.areEqual('Test Account', acc.get('Name')); } @@ -274,6 +275,7 @@ private class TestModule_Test { List accounts = new AccountTestModule().Mocker().build(3); Assert.areEqual(3, accounts.size()); + Assert.areEqual(Account.SObjectType, accounts.getSObjectType(), 'The built list must be concretely typed.'); for (SObject acc : accounts) { Assert.areEqual('Test Account', acc.get('Name')); } diff --git a/force-app/main/default/classes/TestModule_Test.cls-meta.xml b/force-app/main/default/classes/TestModule_Test.cls-meta.xml index 82775b9..b009296 100644 --- a/force-app/main/default/classes/TestModule_Test.cls-meta.xml +++ b/force-app/main/default/classes/TestModule_Test.cls-meta.xml @@ -1,5 +1,5 @@ - 65.0 + 67.0 Active diff --git a/package/main/default/classes/TestModule.cls b/package/main/default/classes/TestModule.cls index 2b7d315..7b49649 100644 --- a/package/main/default/classes/TestModule.cls +++ b/package/main/default/classes/TestModule.cls @@ -2,7 +2,7 @@ * Copyright (c) 2026 Beyond The Cloud Sp. z o.o. (BeyondTheCloud.Dev) * Licensed under the MIT License (https://github.com/beyond-the-cloud-dev/test-lib/blob/main/LICENSE) * - * v0.1.0 + * v0.2.0 **/ @IsTest global class TestModule { diff --git a/package/main/default/classes/TestModule.cls-meta.xml b/package/main/default/classes/TestModule.cls-meta.xml index 82775b9..b009296 100644 --- a/package/main/default/classes/TestModule.cls-meta.xml +++ b/package/main/default/classes/TestModule.cls-meta.xml @@ -1,5 +1,5 @@ - 65.0 + 67.0 Active diff --git a/package/main/default/classes/TestModule_Test.cls-meta.xml b/package/main/default/classes/TestModule_Test.cls-meta.xml index 82775b9..b009296 100644 --- a/package/main/default/classes/TestModule_Test.cls-meta.xml +++ b/package/main/default/classes/TestModule_Test.cls-meta.xml @@ -1,5 +1,5 @@ - 65.0 + 67.0 Active diff --git a/sfdx-project.json b/sfdx-project.json index 99e6aea..c03b594 100644 --- a/sfdx-project.json +++ b/sfdx-project.json @@ -20,7 +20,7 @@ "name": "BeyondTheCloud", "namespace": "btcdev", "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "65.0", + "sourceApiVersion": "67.0", "packageAliases": { "Test Lib": "0HoP600000002OPKAY", "Test Lib@0.1.0-1": "04tP600000390yLIAQ"