Files
Umbraco-CMS/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/NPocoTests/NPocoUpdateBatchTests.cs
Andy Butland 12adfd52bd Performance: Reduce number of database calls in save and publish operations (#20485)
* Added request caching to media picker media retrieval, to improve performance in save operations.

* WIP: Update or insert in bulk when updating property data.

* Add tests verifying UpdateBatch.

* Fixed issue with UpdateBatch and SQL Server.

* Removed stopwatch.

* Fix test on SQLite (failing on SQLServer).

* Added temporary test for direct call to NPoco UpdateBatch.

* Fixed test on SQLServer.

* Add integration test verifying the same property data is persisted as before the performance refactor.

* Log expected warning in DocumentUrlService as debug.
2025-10-14 11:22:21 +02:00

71 lines
2.2 KiB
C#

// Copyright (c) Umbraco.
// See LICENSE for more details.
using NPoco;
using NUnit.Framework;
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
using Umbraco.Cms.Tests.Common.Testing;
using Umbraco.Cms.Tests.Integration.Testing;
namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.NPocoTests;
[TestFixture]
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
internal sealed class NPocoUpdateBatchTests : UmbracoIntegrationTest
{
[Test]
public void Can_Update_Batch()
{
// Arrange
var servers = new List<ServerRegistrationDto>();
for (var i = 0; i < 3; i++)
{
servers.Add(new ServerRegistrationDto
{
Id = i + 1,
ServerAddress = "address" + i,
ServerIdentity = "computer" + i,
DateRegistered = DateTime.Now,
IsActive = false,
DateAccessed = DateTime.Now,
});
}
using (var scope = ScopeProvider.CreateScope())
{
scope.Database.BulkInsertRecords(servers);
scope.Complete();
}
// Act
for (var i = 0; i < 3; i++)
{
servers[i].ServerAddress = "newaddress" + i;
servers[i].IsActive = true;
}
using (var scope = ScopeProvider.CreateScope())
{
var updateBatch = servers
.Select(x => UpdateBatch.For(x))
.ToList();
var updated = scope.Database.UpdateBatch(updateBatch, new BatchOptions { BatchSize = 100 });
Assert.AreEqual(3, updated);
scope.Complete();
}
// Assert
using (var scope = ScopeProvider.CreateScope())
{
var dtos = scope.Database.Fetch<ServerRegistrationDto>();
Assert.AreEqual(3, dtos.Count);
for (var i = 0; i < 3; i++)
{
Assert.AreEqual(servers[i].ServerAddress, dtos[i].ServerAddress);
Assert.AreEqual(servers[i].ServerIdentity, dtos[i].ServerIdentity);
Assert.AreEqual(servers[i].IsActive, dtos[i].IsActive);
}
}
}
}