@@ -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.Data.SqlClient; | |||
namespace DotNetCore.CAP.EntityFrameworkCore.Test | |||
namespace DotNetCore.CAP.SqlServer.Test | |||
{ | |||
public static class ConnectionUtil | |||
{ | |||
@@ -1,62 +1,62 @@ | |||
using System.Data; | |||
using System.Threading.Tasks; | |||
using System.Threading; | |||
using Dapper; | |||
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.Extensions.DependencyInjection; | |||
namespace DotNetCore.CAP.EntityFrameworkCore.Test | |||
namespace DotNetCore.CAP.SqlServer.Test | |||
{ | |||
public abstract class TestHost : IDisposable | |||
{ | |||
@@ -28,8 +28,9 @@ namespace DotNetCore.CAP.EntityFrameworkCore.Test | |||
services.AddLogging(); | |||
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; | |||
} | |||
@@ -8,17 +8,21 @@ namespace DotNetCore.CAP.Test | |||
{ | |||
public class CapBuilderTest | |||
{ | |||
[Fact] | |||
public void CanCreateInstanceAndGetService() | |||
{ | |||
var services = new ServiceCollection(); | |||
services.AddSingleton<ICapPublisher, MyProducerService>(); | |||
var builder = new CapBuilder(services); | |||
Assert.NotNull(builder); | |||
var count = builder.Services.Count; | |||
Assert.Equal(1, count); | |||
var provider = services.BuildServiceProvider(); | |||
var capPublisher = provider.GetService<ICapPublisher>(); | |||
Assert.NotNull(capPublisher); | |||
} | |||
[Fact] | |||
@@ -45,6 +49,16 @@ namespace DotNetCore.CAP.Test | |||
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 | |||
{ | |||
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(); | |||
} | |||
} |