@@ -1,11 +0,0 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using Xunit; | |||||
namespace DotNetCore.CAP.EntityFrameworkCore.Test | |||||
{ | |||||
public class CapMessageStoreTest | |||||
{ | |||||
} | |||||
} |
@@ -1,7 +1,7 @@ | |||||
using System; | using System; | ||||
using System.Data.SqlClient; | using System.Data.SqlClient; | ||||
namespace DotNetCore.CAP.EntityFrameworkCore.Test | |||||
namespace DotNetCore.CAP.SqlServer.Test | |||||
{ | { | ||||
public static class ConnectionUtil | public static class ConnectionUtil | ||||
{ | { | ||||
@@ -1,62 +1,62 @@ | |||||
using System.Data; | using System.Data; | ||||
using System.Threading.Tasks; | |||||
using System.Threading; | |||||
using Dapper; | using Dapper; | ||||
using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||
namespace DotNetCore.CAP.EntityFrameworkCore.Test | |||||
namespace DotNetCore.CAP.SqlServer.Test | |||||
{ | { | ||||
//public abstract class DatabaseTestHost : TestHost | |||||
//{ | |||||
// private static bool _sqlObjectInstalled; | |||||
public abstract class DatabaseTestHost : TestHost | |||||
{ | |||||
private static bool _sqlObjectInstalled; | |||||
// protected override void PostBuildServices() | |||||
// { | |||||
// base.PostBuildServices(); | |||||
// InitializeDatabase(); | |||||
// } | |||||
protected override void PostBuildServices() | |||||
{ | |||||
base.PostBuildServices(); | |||||
InitializeDatabase(); | |||||
} | |||||
// public override void Dispose() | |||||
// { | |||||
// DeleteAllData(); | |||||
// base.Dispose(); | |||||
// } | |||||
public override void Dispose() | |||||
{ | |||||
DeleteAllData(); | |||||
base.Dispose(); | |||||
} | |||||
// private void InitializeDatabase() | |||||
// { | |||||
// if (!_sqlObjectInstalled) | |||||
// { | |||||
// using (CreateScope()) | |||||
// { | |||||
// var context = GetService<TestDbContext>(); | |||||
// context.Database.EnsureDeleted(); | |||||
// context.Database.Migrate(); | |||||
// _sqlObjectInstalled = true; | |||||
// } | |||||
// } | |||||
// } | |||||
private void InitializeDatabase() | |||||
{ | |||||
if (!_sqlObjectInstalled) | |||||
{ | |||||
using (CreateScope()) | |||||
{ | |||||
var storage = GetService<SqlServerStorage>(); | |||||
var token = new CancellationTokenSource().Token; | |||||
storage.InitializeAsync(token).Wait(); | |||||
_sqlObjectInstalled = true; | |||||
} | |||||
} | |||||
} | |||||
// private void DeleteAllData() | |||||
// { | |||||
// using (CreateScope()) | |||||
// { | |||||
// var context = GetService<TestDbContext>(); | |||||
private void DeleteAllData() | |||||
{ | |||||
using (CreateScope()) | |||||
{ | |||||
var context = GetService<TestDbContext>(); | |||||
// var commands = new[] | |||||
// { | |||||
// "DISABLE TRIGGER ALL ON ?", | |||||
// "ALTER TABLE ? NOCHECK CONSTRAINT ALL", | |||||
// "DELETE FROM ?", | |||||
// "ALTER TABLE ? CHECK CONSTRAINT ALL", | |||||
// "ENABLE TRIGGER ALL ON ?" | |||||
// }; | |||||
// foreach (var command in commands) | |||||
// { | |||||
// context.Database.GetDbConnection().Execute( | |||||
// "sp_MSforeachtable", | |||||
// new {command1 = command}, | |||||
// commandType: CommandType.StoredProcedure); | |||||
// } | |||||
// } | |||||
// } | |||||
//} | |||||
var commands = new[] | |||||
{ | |||||
"DISABLE TRIGGER ALL ON ?", | |||||
"ALTER TABLE ? NOCHECK CONSTRAINT ALL", | |||||
"DELETE FROM ?", | |||||
"ALTER TABLE ? CHECK CONSTRAINT ALL", | |||||
"ENABLE TRIGGER ALL ON ?" | |||||
}; | |||||
foreach (var command in commands) | |||||
{ | |||||
context.Database.GetDbConnection().Execute( | |||||
"sp_MSforeachtable", | |||||
new { command1 = command }, | |||||
commandType: CommandType.StoredProcedure); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | } |
@@ -0,0 +1,13 @@ | |||||
using Microsoft.EntityFrameworkCore; | |||||
namespace DotNetCore.CAP.SqlServer.Test | |||||
{ | |||||
public class TestDbContext : DbContext | |||||
{ | |||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) | |||||
{ | |||||
var connectionString = ConnectionUtil.GetConnectionString(); | |||||
optionsBuilder.UseSqlServer(connectionString); | |||||
} | |||||
} | |||||
} |
@@ -2,7 +2,7 @@ using System; | |||||
using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||
using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||
namespace DotNetCore.CAP.EntityFrameworkCore.Test | |||||
namespace DotNetCore.CAP.SqlServer.Test | |||||
{ | { | ||||
public abstract class TestHost : IDisposable | public abstract class TestHost : IDisposable | ||||
{ | { | ||||
@@ -28,8 +28,9 @@ namespace DotNetCore.CAP.EntityFrameworkCore.Test | |||||
services.AddLogging(); | services.AddLogging(); | ||||
var connectionString = ConnectionUtil.GetConnectionString(); | var connectionString = ConnectionUtil.GetConnectionString(); | ||||
//services.AddSingleton(new SqlServerOptions { ConnectionString = connectionString }); | |||||
//services.AddDbContext<TestDbContext>(options => options.UseSqlServer(connectionString)); | |||||
services.AddSingleton(new SqlServerOptions { ConnectionString = connectionString }); | |||||
services.AddSingleton<SqlServerStorage>(); | |||||
services.AddDbContext<TestDbContext>(options => options.UseSqlServer(connectionString)); | |||||
_services = services; | _services = services; | ||||
} | } | ||||
@@ -8,17 +8,21 @@ namespace DotNetCore.CAP.Test | |||||
{ | { | ||||
public class CapBuilderTest | public class CapBuilderTest | ||||
{ | { | ||||
[Fact] | [Fact] | ||||
public void CanCreateInstanceAndGetService() | public void CanCreateInstanceAndGetService() | ||||
{ | { | ||||
var services = new ServiceCollection(); | var services = new ServiceCollection(); | ||||
services.AddSingleton<ICapPublisher, MyProducerService>(); | services.AddSingleton<ICapPublisher, MyProducerService>(); | ||||
var builder = new CapBuilder(services); | var builder = new CapBuilder(services); | ||||
Assert.NotNull(builder); | Assert.NotNull(builder); | ||||
var count = builder.Services.Count; | var count = builder.Services.Count; | ||||
Assert.Equal(1, count); | Assert.Equal(1, count); | ||||
var provider = services.BuildServiceProvider(); | |||||
var capPublisher = provider.GetService<ICapPublisher>(); | |||||
Assert.NotNull(capPublisher); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -45,6 +49,16 @@ namespace DotNetCore.CAP.Test | |||||
Assert.NotNull(thingy); | Assert.NotNull(thingy); | ||||
} | } | ||||
[Fact] | |||||
public void CanResolveCapOptions() | |||||
{ | |||||
var services = new ServiceCollection(); | |||||
services.AddCap(x => { }); | |||||
var builder = services.BuildServiceProvider(); | |||||
var capOptions = builder.GetService<CapOptions>(); | |||||
Assert.NotNull(capOptions); | |||||
} | |||||
private class MyProducerService : ICapPublisher | private class MyProducerService : ICapPublisher | ||||
{ | { | ||||
public Task PublishAsync(string topic, string content) | public Task PublishAsync(string topic, string content) | ||||
@@ -1,6 +0,0 @@ | |||||
namespace CDotNetCore.CAPTest | |||||
{ | |||||
public class ConsistencyOptionsTest | |||||
{ | |||||
} | |||||
} |
@@ -1,21 +0,0 @@ | |||||
using System; | |||||
using System.Threading; | |||||
using System.Threading.Tasks; | |||||
using DotNetCore.CAP.Models; | |||||
namespace DotNetCore.CAP.Test | |||||
{ | |||||
//public class NoopMessageStore : ICapMessageStore | |||||
//{ | |||||
// public Task<OperateResult> ChangeReceivedMessageStateAsync(CapReceivedMessage message, string statusName, | |||||
// bool autoSaveChanges = true) | |||||
// { | |||||
// throw new NotImplementedException(); | |||||
// } | |||||
// public Task<OperateResult> StoreSentMessageAsync(CapSentMessage message) | |||||
// { | |||||
// throw new NotImplementedException(); | |||||
// } | |||||
//} | |||||
} |
@@ -0,0 +1,59 @@ | |||||
using System; | |||||
using DotNetCore.CAP.Infrastructure; | |||||
using DotNetCore.CAP.Models; | |||||
using DotNetCore.CAP.Processor.States; | |||||
using Moq; | |||||
using Xunit; | |||||
namespace DotNetCore.CAP.Test | |||||
{ | |||||
public class StateChangerTest | |||||
{ | |||||
[Fact] | |||||
public void ChangeState() | |||||
{ | |||||
// Arrange | |||||
var fixture = Create(); | |||||
var message = new CapPublishedMessage | |||||
{ | |||||
StatusName = StatusName.Enqueued | |||||
}; | |||||
var state = Mock.Of<IState>(s => s.Name == "s" && s.ExpiresAfter == null); | |||||
var mockTransaction = new Mock<IStorageTransaction>(); | |||||
// Act | |||||
fixture.ChangeState(message, state, mockTransaction.Object); | |||||
// Assert | |||||
Assert.Equal(message.StatusName, "s"); | |||||
Assert.Null(message.ExpiresAt); | |||||
Mock.Get(state).Verify(s => s.Apply(message, mockTransaction.Object), Times.Once); | |||||
mockTransaction.Verify(t => t.UpdateMessage(message), Times.Once); | |||||
mockTransaction.Verify(t => t.CommitAsync(), Times.Never); | |||||
} | |||||
[Fact] | |||||
public void ChangeState_ExpiresAfter() | |||||
{ | |||||
// Arrange | |||||
var fixture = Create(); | |||||
var message = new CapPublishedMessage | |||||
{ | |||||
StatusName = StatusName.Enqueued | |||||
}; | |||||
var state = Mock.Of<IState>(s => s.Name == "s" && s.ExpiresAfter == TimeSpan.FromHours(1)); | |||||
var mockTransaction = new Mock<IStorageTransaction>(); | |||||
// Act | |||||
fixture.ChangeState(message, state, mockTransaction.Object); | |||||
// Assert | |||||
Assert.Equal(message.StatusName, "s"); | |||||
Assert.NotNull(message.ExpiresAt); | |||||
mockTransaction.Verify(t => t.UpdateMessage(message), Times.Once); | |||||
mockTransaction.Verify(t => t.CommitAsync(), Times.Never); | |||||
} | |||||
private StateChanger Create() => new StateChanger(); | |||||
} | |||||
} |