Backend/e-suite.Service.EFlowSync/e-suite.Service.EFlowSync.UnitTests/EFlowSync/SyncEFlowPrinterCategoriesUnitTests.cs
2026-01-20 21:50:10 +00:00

744 lines
28 KiB
C#

using e_suite.Database.Core.Tables.CustomFields;
using e_suite.Database.Core.Tables.Forms;
using e_suite.Database.Core.Tables.Printer;
using e_suite.Service.EFlowSync.EflowAPI;
using e_suite.Service.EFlowSync.UnitTests.Helpers;
using eSuite.Core.CustomFields;
using eSuite.Core.Miscellaneous;
using Moq;
using NUnit.Framework;
namespace e_suite.Service.EFlowSync.UnitTests.EFlowSync
{
public class SyncEFlowPrinterCategoriesUnitTests : SyncEFlowTestBase
{
[SetUp]
public async Task SetUp()
{
await base.Setup();
}
[Test]
public void SyncEFlowPrinterCategories_NoDomainsToSync_DoesNothing()
{
//Arrange
Domains.Clear();
Assert.That(DomainsToLookup.Data.Count(), Is.Zero);
//Act & Assert
Assert.DoesNotThrowAsync(async() => await EFlowSync.SyncEFlowPrinterCategories(null!));
}
[Test]
public void SyncEFlowPrinterCategories_NullPassedAsParameter_ThrowsNullReferenceException()
{
//Arrange
//Act & Assert
Assert.ThrowsAsync<NullReferenceException>( async () => await EFlowSync.SyncEFlowPrinterCategories(null!));
}
[Test]
public async Task SyncEFlowPrinterCategories_EmptyListPassedAsParameter_ThrowsNullReferenceException()
{
//Arrange
foreach (var domain in Domains)
{
domain.SunriseAppId = string.Empty; //makes sure that all domains are not setup for syncing with e-flow.
}
var domainsToSync = new List<GeneralIdRef>();
//Act & Assert
await EFlowSync.SyncEFlowPrinterCategories(domainsToSync);
}
[Test]
public void SyncEFlowPrinterCategories_FailsToGetCategoryFromEflow_ThrowsExpectedException()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>();
//Act
var exception = Assert.ThrowsAsync<NullReferenceException>( async() => await EFlowSync.SyncEFlowPrinterCategories(domainsToSync));
//Assert
Assert.That(exception!.Message, Is.EqualTo("Unable to find e-flow printer category"));
}
[Test]
public void SyncEFlowPrinterCategories_RequestToUpdateNonExistingDomain_DoesNothingGracefully()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>
{
new() { Guid = new Guid("{497AAEE7-496A-468C-A6A3-4C003E815CE6}") }
};
//Act & Assert
Assert.DoesNotThrowAsync(async () => await EFlowSync.SyncEFlowPrinterCategories(domainsToSync));
}
[Test]
public async Task SyncEFlowPrinterCategories_WhenCategoryDoesNotContainAnything_AddsExtraCategoryToEFlow()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>();
var testCategory = new CategoryInfo
{
Id = "Category1",
DisplayName = "e-print printers"
};
EFlowCategoriesMock.Setup(x => x.GetCategories("Category1")).ReturnsAsync(testCategory);
FakeFormRepository.FormInstances.Add(new FormInstance
{
Id = 1000,
FormFields = new List<FormFieldInstance>
{
new()
{
Id = 100,
CustomField = new CustomField
{
Guid = new Guid("{45821c2d-9d6e-4c82-ac57-965755960422}"),
FieldType = FieldType.Domain,
MaxEntries = 0
},
Index = 1,
Value = "63cac905-acea-48d4-9faa-25deb34de123"
}
}
}
);
FakeSpecificationManagerRepository.Specifications.Add( new Specification
{
FormInstanceId = 1000,
Name = "TestSpecification",
Site = new Site
{
Id = 2,
Name = "MySite",
Organisation = new Organisation
{
Id = 3,
Name = "MyOrganisation"
}
}
});
//Act
await EFlowSync.SyncEFlowPrinterCategories(domainsToSync);
//Assert
EFlowCategoriesMock.Verify(x => x.PostCategory(It.IsAny<CategoryInfo>()), Times.Exactly(3));
EFlowCategoriesMock.Verify(x => x.DeleteCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.UpdateCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.RestoreCategory(It.IsAny<CategoryInfo>()), Times.Never);
Assert.That(testCategory.Children.Count, Is.EqualTo(1));
var organisationCategory = testCategory.Children[0];
Assert.That(organisationCategory.DisplayName, Is.EqualTo("MyOrganisation"));
Assert.That(organisationCategory.Children.Count, Is.EqualTo(1));
var siteCategory = organisationCategory.Children[0];
Assert.That(siteCategory.DisplayName, Is.EqualTo("MySite"));
Assert.That(siteCategory.Children.Count, Is.EqualTo(1));
var specificationCategory = siteCategory.Children[0];
Assert.That(specificationCategory.DisplayName, Is.EqualTo("TestSpecification"));
Assert.That(specificationCategory.Children.Count, Is.Zero);
}
[Test]
public async Task SyncEFlowPrinterCategories_WhenOrganisationSiteAndSpecAlreadyExists_ChangesNothing()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>();
var testCategory = new CategoryInfo
{
Id = "Category1",
DisplayName = "e-print printers",
Children =
[
new CategoryInfo
{
Id = "Org1",
DisplayName = "MyOrganisation",
Children = [
new CategoryInfo
{
Id = "Site1",
DisplayName = "MySite",
Children = [
new CategoryInfo
{
Id = "Spec1",
DisplayName = "TestSpecification"
}
]
}
]
}
]
};
EFlowCategoriesMock.Setup(x => x.GetCategories("Category1")).ReturnsAsync(testCategory);
FakeFormRepository.FormInstances.Add(new FormInstance
{
Id = 1000,
FormFields = new List<FormFieldInstance>
{
new()
{
Id = 100,
CustomField = new CustomField
{
Guid = new Guid("{45821c2d-9d6e-4c82-ac57-965755960422}"),
FieldType = FieldType.Domain,
MaxEntries = 0
},
Index = 1,
Value = "63cac905-acea-48d4-9faa-25deb34de123"
}
}
});
var commonSite = new Site
{
Id = 2,
Name = "MySite",
Organisation = new Organisation
{
Id = 3,
Name = "MyOrganisation"
}
};
FakeSpecificationManagerRepository.Specifications.Add(new Specification
{
Id = 10000,
FormInstanceId = 1000,
Name = "TestSpecification",
Site = commonSite
});
//Act
await EFlowSync.SyncEFlowPrinterCategories(domainsToSync);
//Assert
EFlowCategoriesMock.Verify(x => x.PostCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.DeleteCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.UpdateCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.RestoreCategory(It.IsAny<CategoryInfo>()), Times.Never);
}
[Test]
public async Task SyncEFlowPrinterCategories_WhenNewSpecificationAddedToSite_AddsOnlyNewSpec()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>();
var testCategory = new CategoryInfo
{
Id = "Category1",
DisplayName = "e-print printers",
Children =
[
new CategoryInfo
{
Id = "Org1",
DisplayName = "MyOrganisation",
Children = [
new CategoryInfo
{
Id = "Site1",
DisplayName = "MySite",
Children = [
new CategoryInfo
{
Id = "Spec1",
DisplayName = "TestSpecification"
}
]
}
]
}
]
};
EFlowCategoriesMock.Setup(x => x.GetCategories("Category1")).ReturnsAsync(testCategory);
FakeFormRepository.FormInstances.Add(new FormInstance
{
Id = 1000,
FormFields = new List<FormFieldInstance>
{
new()
{
Id = 100,
CustomField = new CustomField
{
Guid = new Guid("{45821c2d-9d6e-4c82-ac57-965755960422}"),
FieldType = FieldType.Domain,
MaxEntries = 0
},
Index = 1,
Value = "63cac905-acea-48d4-9faa-25deb34de123"
}
}
});
FakeFormRepository.FormInstances.Add(new FormInstance
{
Id = 1001,
FormFields = new List<FormFieldInstance>
{
new()
{
Id = 100,
CustomField = new CustomField
{
Guid = new Guid("{45821c2d-9d6e-4c82-ac57-965755960422}"),
FieldType = FieldType.Domain,
MaxEntries = 0
},
Index = 1,
Value = "63cac905-acea-48d4-9faa-25deb34de123"
}
}
});
var commonSite = new Site
{
Id = 2,
Name = "MySite",
Organisation = new Organisation
{
Id = 3,
Name = "MyOrganisation"
}
};
FakeSpecificationManagerRepository.Specifications.Add(new Specification
{
Id = 10000,
FormInstanceId = 1000,
Name = "TestSpecification",
Site = commonSite
});
FakeSpecificationManagerRepository.Specifications.Add(new Specification
{
Id = 10001,
FormInstanceId = 1000,
Name = "TestSpecification1",
Site = commonSite
});
//Act
await EFlowSync.SyncEFlowPrinterCategories(domainsToSync);
//Assert
EFlowCategoriesMock.Verify(x => x.PostCategory(It.IsAny<CategoryInfo>()), Times.Once);
EFlowCategoriesMock.Verify(x => x.DeleteCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.UpdateCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.RestoreCategory(It.IsAny<CategoryInfo>()), Times.Never);
}
[Test]
public async Task SyncEFlowPrinterCategories_WhenSpecificationRemoved_DeletesCorrectSpecification()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>();
var testCategory = new CategoryInfo
{
Id = "Category1",
DisplayName = "e-print printers",
Children =
[
new CategoryInfo
{
Id = "Org1",
DisplayName = "MyOrganisation",
Children = [
new CategoryInfo
{
Id = "Site1",
DisplayName = "MySite",
Children = [
new CategoryInfo
{
Id = "Spec1",
DisplayName = "TestSpecification"
}
]
}
]
},
new CategoryInfo
{
Id = "Org2",
DisplayName = "MyOrganisation2",
Children = [
new CategoryInfo
{
Id = "Site2",
DisplayName = "MySite2",
Children = [
new CategoryInfo
{
Id = "Spec2",
DisplayName = "TestSpecification2"
}
]
}
]
}
]
};
EFlowCategoriesMock.Setup(x => x.GetCategories("Category1")).ReturnsAsync(testCategory);
FakeFormRepository.FormInstances.Add(new FormInstance
{
Id = 1000,
FormFields = new List<FormFieldInstance>
{
new()
{
Id = 100,
CustomField = new CustomField
{
Guid = new Guid("{45821c2d-9d6e-4c82-ac57-965755960422}"),
FieldType = FieldType.Domain,
MaxEntries = 0
},
Index = 1,
Value = "63cac905-acea-48d4-9faa-25deb34de123"
}
}
});
var commonSite = new Site
{
Id = 2,
Name = "MySite",
Organisation = new Organisation
{
Id = 3,
Name = "MyOrganisation"
}
};
FakeSpecificationManagerRepository.Specifications.Add(new Specification
{
Id = 10000,
FormInstanceId = 1000,
Name = "TestSpecification",
Site = commonSite
});
//Act
await EFlowSync.SyncEFlowPrinterCategories(domainsToSync);
//Assert
EFlowCategoriesMock.Verify(x => x.PostCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.DeleteCategory(It.IsAny<CategoryInfo>()), Times.Exactly(3));
EFlowCategoriesMock.Verify(x => x.UpdateCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.RestoreCategory(It.IsAny<CategoryInfo>()), Times.Never);
}
[Test]
public async Task SyncEFlowPrinterCategories_WhenSpecificationNameChanges_UpdatedExistingSpecification()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>();
var testCategory = new CategoryInfo
{
Id = "Category1",
DisplayName = "e-print printers",
Children =
[
new CategoryInfo
{
Id = "Org1",
DisplayName = "MyOrganisation",
Children = [
new CategoryInfo
{
Id = "Site1",
DisplayName = "MySite",
Children = [
new CategoryInfo
{
Id = "Spec1",
DisplayName = "TestSpecification Renamed"
}
]
}
]
}
]
};
EFlowCategoriesMock.Setup(x => x.GetCategories("Category1")).ReturnsAsync(testCategory);
FakeFormRepository.FormInstances.Add(new FormInstance
{
Id = 1000,
FormFields = new List<FormFieldInstance>
{
new()
{
Id = 100,
CustomField = new CustomField
{
Guid = new Guid("{45821c2d-9d6e-4c82-ac57-965755960422}"),
FieldType = FieldType.Domain,
MaxEntries = 0
},
Index = 1,
Value = "63cac905-acea-48d4-9faa-25deb34de123"
}
}
});
var commonSite = new Site
{
Id = 2,
Name = "MySite",
Organisation = new Organisation
{
Id = 3,
Name = "MyOrganisation"
}
};
FakeSpecificationManagerRepository.Specifications.Add(new Specification
{
Id = 10000,
FormInstanceId = 1000,
Name = "TestSpecification",
Site = commonSite
});
FakeEFlowSyncRepository.ExternalIds.Add(("e_suite.Database.Core.Tables.Printer.Organisation", "{\"Id\":2}"), "Org1");
FakeEFlowSyncRepository.ExternalIds.Add(("e_suite.Database.Core.Tables.Printer.Site", "{\"Id\":2}"), "Site1");
FakeEFlowSyncRepository.ExternalIds.Add(("e_suite.Database.Core.Tables.Printer.Specification", "{\"Id\":10000}"), "Spec1");
//Act
await EFlowSync.SyncEFlowPrinterCategories(domainsToSync);
//Assert
EFlowCategoriesMock.Verify(x => x.PostCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.DeleteCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.UpdateCategory(It.IsAny<CategoryInfo>()), Times.Once);
EFlowCategoriesMock.Verify(x => x.RestoreCategory(It.IsAny<CategoryInfo>()), Times.Never);
}
[Test]
public async Task SyncEFlowPrinterCategories_WhenSpecificationIsRestored_RestoresCategory()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>();
var testCategory = new CategoryInfo
{
Id = "Category1",
DisplayName = "e-print printers",
Children =
[
new CategoryInfo
{
Id = "Org1",
DisplayName = "MyOrganisation",
Children = [
new CategoryInfo
{
Id = "Site1",
DisplayName = "MySite",
Children = [
new CategoryInfo
{
Id = "Spec1",
DisplayName = "TestSpecification",
Deleted = new DateTimeOffset(2025, 01, 01, 00,00,00, TimeSpan.Zero)
}
]
}
]
}
]
};
EFlowCategoriesMock.Setup(x => x.GetCategories("Category1")).ReturnsAsync(testCategory);
FakeFormRepository.FormInstances.Add(new FormInstance
{
Id = 1000,
FormFields = new List<FormFieldInstance>
{
new()
{
Id = 100,
CustomField = new CustomField
{
Guid = new Guid("{45821c2d-9d6e-4c82-ac57-965755960422}"),
FieldType = FieldType.Domain,
MaxEntries = 0
},
Index = 1,
Value = "63cac905-acea-48d4-9faa-25deb34de123"
}
}
});
var commonSite = new Site
{
Id = 2,
Name = "MySite",
Organisation = new Organisation
{
Id = 3,
Name = "MyOrganisation"
}
};
FakeSpecificationManagerRepository.Specifications.Add(new Specification
{
Id = 10000,
FormInstanceId = 1000,
Name = "TestSpecification",
Site = commonSite
});
FakeEFlowSyncRepository.ExternalIds.Add(("e_suite.Database.Core.Tables.Printer.Organisation", "{\"Id\":2}"), "Org1");
FakeEFlowSyncRepository.ExternalIds.Add(("e_suite.Database.Core.Tables.Printer.Site", "{\"Id\":2}"), "Site1");
FakeEFlowSyncRepository.ExternalIds.Add(("e_suite.Database.Core.Tables.Printer.Specification", "{\"Id\":10000}"), "Spec1");
//Act
await EFlowSync.SyncEFlowPrinterCategories(domainsToSync);
//Assert
EFlowCategoriesMock.Verify(x => x.PostCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.DeleteCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.UpdateCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.RestoreCategory(It.IsAny<CategoryInfo>()), Times.Once);
}
[Test]
public async Task SyncEFlowPrinterCategories_WhenAttemptingToDeleteAlreadyDeletedSpeciciation_DoesNothing()
{
//Arrange
var domainsToSync = new List<GeneralIdRef>();
var testCategory = new CategoryInfo
{
Id = "Category1",
DisplayName = "e-print printers",
Children =
[
new CategoryInfo
{
Id = "Org1",
DisplayName = "MyOrganisation",
Children = [
new CategoryInfo
{
Id = "Site1",
DisplayName = "MySite",
Children = [
new CategoryInfo
{
Id = "Spec1",
DisplayName = "TestSpecification"
}
]
}
]
},
new CategoryInfo
{
Id = "Org2",
DisplayName = "MyOrganisation2",
Deleted = new DateTimeOffset(2025, 01, 01, 00,00,00, TimeSpan.Zero),
Children = [
new CategoryInfo
{
Id = "Site2",
DisplayName = "MySite2",
Deleted = new DateTimeOffset(2025, 01, 01, 00,00,00, TimeSpan.Zero),
Children = [
new CategoryInfo
{
Id = "Spec2",
DisplayName = "TestSpecification2",
Deleted = new DateTimeOffset(2025, 01, 01, 00,00,00, TimeSpan.Zero)
}
]
}
]
}
]
};
EFlowCategoriesMock.Setup(x => x.GetCategories("Category1")).ReturnsAsync(testCategory);
FakeFormRepository.FormInstances.Add(new FormInstance
{
Id = 1000,
FormFields = new List<FormFieldInstance>
{
new()
{
Id = 100,
CustomField = new CustomField
{
Guid = new Guid("{45821c2d-9d6e-4c82-ac57-965755960422}"),
FieldType = FieldType.Domain,
MaxEntries = 0
},
Index = 1,
Value = "63cac905-acea-48d4-9faa-25deb34de123"
}
}
});
var commonSite = new Site
{
Id = 2,
Name = "MySite",
Organisation = new Organisation
{
Id = 3,
Name = "MyOrganisation"
}
};
FakeSpecificationManagerRepository.Specifications.Add(new Specification
{
Id = 10000,
FormInstanceId = 1000,
Name = "TestSpecification",
Site = commonSite
});
//Act
await EFlowSync.SyncEFlowPrinterCategories(domainsToSync);
//Assert
EFlowCategoriesMock.Verify(x => x.PostCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.DeleteCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.UpdateCategory(It.IsAny<CategoryInfo>()), Times.Never);
EFlowCategoriesMock.Verify(x => x.RestoreCategory(It.IsAny<CategoryInfo>()), Times.Never);
}
}
}