Skip to content

Commit c72d645

Browse files
authored
Merge pull request #28 from catcherwong/di
Read dbtype and barrier tbname from configuration
2 parents 950f571 + b5f8d1c commit c72d645

16 files changed

Lines changed: 406 additions & 339 deletions

src/Dtmcli.Tests/BranchBarrierTests.cs

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,27 @@
88
using System.Linq;
99
using Microsoft.Extensions.Primitives;
1010
using Microsoft.Extensions.Logging.Abstractions;
11+
using Microsoft.Extensions.DependencyInjection;
12+
using Dtmcli.DtmImp;
1113

1214
namespace Dtmcli.Tests
1315
{
1416
public class BranchBarrierTests
1517
{
18+
private readonly IBranchBarrierFactory _factory;
19+
20+
public BranchBarrierTests()
21+
{
22+
var provider = TestHelper.AddDtmCli();
23+
24+
var factory = provider.GetRequiredService<IBranchBarrierFactory>();
25+
_factory = factory;
26+
}
27+
1628
#if NET5_0_OR_GREATER
1729
[Fact]
1830
public void CreateBranchBarrier_FromQs_Should_Succeed()
1931
{
20-
var factory = new DefaultBranchBarrierFactory(NullLoggerFactory.Instance);
21-
2232
var dict = new System.Collections.Generic.Dictionary<string, StringValues>()
2333
{
2434
{ "branch_id","11" },
@@ -29,16 +39,14 @@ public void CreateBranchBarrier_FromQs_Should_Succeed()
2939

3040
var qs = new Microsoft.AspNetCore.Http.QueryCollection(dict);
3141

32-
var bb = factory.CreateBranchBarrier(qs);
42+
var bb = _factory.CreateBranchBarrier(qs);
3343

3444
Assert.NotNull(bb);
3545
}
3646

3747
[Fact]
3848
public void CreateBranchBarrier_FromQs_Should_ThrowException()
3949
{
40-
var factory = new DefaultBranchBarrierFactory(NullLoggerFactory.Instance);
41-
4250
var dict = new System.Collections.Generic.Dictionary<string, StringValues>()
4351
{
4452
{ "branch_id","11" },
@@ -49,7 +57,7 @@ public void CreateBranchBarrier_FromQs_Should_ThrowException()
4957

5058
var qs = new Microsoft.AspNetCore.Http.QueryCollection(dict);
5159

52-
Assert.Throws<DtmcliException>(() => factory.CreateBranchBarrier(qs));
60+
Assert.Throws<DtmcliException>(() => _factory.CreateBranchBarrier(qs));
5361
}
5462
#endif
5563

@@ -58,7 +66,7 @@ public void CreateBranchBarrier_FromQs_Should_ThrowException()
5866
[InlineData("compensate", "action")]
5967
public async void Call_Should_Not_Trigger_When_IsNullCompensation(string op, string origin)
6068
{
61-
var branchBarrier = new BranchBarrier("tcc", "gid", "bid", op);
69+
var branchBarrier = _factory.CreateBranchBarrier("tcc", "gid", "bid", op);
6270

6371
var conn = GetDbConnection();
6472

@@ -79,7 +87,7 @@ public async void Call_Should_Not_Trigger_When_IsNullCompensation(string op, str
7987
[InlineData("other1", "other2")]
8088
public async void Call_Should_Not_Trigger_When_IsDuplicateOrPend(string op, string origin)
8189
{
82-
var branchBarrier = new BranchBarrier("tcc", "gid", "bid", op);
90+
var branchBarrier = _factory.CreateBranchBarrier("tcc", "gid", "bid", op);
8391

8492
var conn = GetDbConnection();
8593

@@ -101,7 +109,7 @@ public async void Call_Should_Not_Trigger_When_IsDuplicateOrPend(string op, stri
101109
[InlineData("compensate", "action")]
102110
public async void Call_Should_Trigger_When_IsNotNullCompensation_And_DuplicateOrPend(string op, string origin)
103111
{
104-
var branchBarrier = new BranchBarrier("tcc", "gid", "bid", op);
112+
var branchBarrier = _factory.CreateBranchBarrier("tcc", "gid", "bid", op);
105113

106114
var conn = GetDbConnection();
107115

@@ -123,39 +131,34 @@ public async void Call_Should_Trigger_When_IsNotNullCompensation_And_DuplicateOr
123131
[Fact]
124132
public void SetBarrierTableName_Should_Succeed()
125133
{
126-
var cusTableName1 = "aaa.bbb";
127-
var cusTableName2 = "aaa.ccc";
134+
var provider = TestHelper.AddDtmCli(tbName: "aaa.bbb");
135+
136+
var factory = provider.GetRequiredService<IBranchBarrierFactory>();
128137

129-
BranchBarrier.SetBarrierTableName(cusTableName1);
130-
var tb1 = BranchBarrier.GetBarrierTableName();
131-
Assert.Equal(cusTableName1, tb1);
138+
var branchBarrier = factory.CreateBranchBarrier("msg", "gid", "bid", "msg");
132139

133-
BranchBarrier.SetBarrierTableName(cusTableName2);
134-
var tb2 = BranchBarrier.GetBarrierTableName();
135-
Assert.Equal(cusTableName2, tb2);
140+
Assert.Equal("aaa.bbb", branchBarrier.DtmOptions.BarrierTableName);
136141
}
137142

138143
[Fact]
139144
public async void DbUtils_Should_Work_With_Cus_BarrierTable_Name()
140145
{
141-
var cusTableName = "aaa.bbb";
146+
var provider = TestHelper.AddDtmCli(tbName: "aaa.bbb");
142147

143-
BranchBarrier.SetBarrierTableName(cusTableName);
144-
var tb = BranchBarrier.GetBarrierTableName();
145-
Assert.Equal(cusTableName, tb);
148+
var dbUtils = provider.GetRequiredService<DbUtils>();
146149

147150
var conn = GetDbConnection();
148-
conn.Mocks.When(cmd => cmd.CommandText.Contains(cusTableName)).ReturnsScalar(cmd => 1);
149-
conn.Mocks.When(cmd => !cmd.CommandText.Contains(cusTableName)).ReturnsScalar(cmd => 2);
150-
var (row, err) = await DbUtils.InsertBarrier(conn, "tt", "gid", "bid", "op", "bid", "reason");
151+
conn.Mocks.When(cmd => cmd.CommandText.Contains("aaa.bbb")).ReturnsScalar(cmd => 1);
152+
conn.Mocks.When(cmd => !cmd.CommandText.Contains("aaa.bbb")).ReturnsScalar(cmd => 2);
153+
var (row, err) = await dbUtils.InsertBarrier(conn, "tt", "gid", "bid", "op", "bid", "reason");
151154

152155
Assert.Equal(1, row);
153156
}
154157

155158
[Fact]
156159
public async void Call_Should_Throw_Duplicated_Exception_When_QueryPrepared_At_First()
157160
{
158-
var branchBarrier = new BranchBarrier("msg", "gid", "bid", "msg");
161+
var branchBarrier = _factory.CreateBranchBarrier("msg", "gid", "bid", "msg");
159162

160163
var connQ = GetDbConnection();
161164
connQ.Mocks.When(cmd => cmd.CommandText.Contains("insert", StringComparison.Ordinal)).ReturnsScalar(cmd => 1);

src/Dtmcli.Tests/DbSpecialTests.cs

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,57 @@
1-
using Xunit;
1+
using Dtmcli.DtmImp;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Xunit;
24

35
namespace Dtmcli.Tests
46
{
57
public class DbSpecialTests
68
{
79
[Fact]
8-
public void TestDbSpecial()
10+
public void Test_Default_DbSpecial()
911
{
10-
DtmImp.DbSpecialDelegate.Instance.SetCurrentDBType("mysql");
12+
var provider = TestHelper.AddDtmCli();
13+
var dbSpecialDelegate = provider.GetRequiredService<DbSpecialDelegate>();
1114

12-
var mysql = DtmImp.DbSpecialDelegate.Instance.GetDBSpecial();
13-
Assert.Equal("xa start 'xa1'", mysql.GetXaSQL("start", "xa1"));
14-
Assert.Equal("insert ignore into a(f) values(@f)", mysql.GetInsertIgnoreTemplate("a(f) values(@f)", "c"));
15+
var special = dbSpecialDelegate.GetDbSpecial();
1516

16-
DtmImp.DbSpecialDelegate.Instance.SetCurrentDBType("postgres");
17+
Assert.IsType<MysqlDBSpecial>(special);
18+
Assert.Equal("xa start 'xa1'", special.GetXaSQL("start", "xa1"));
19+
Assert.Equal("insert ignore into a(f) values(@f)", special.GetInsertIgnoreTemplate("a(f) values(@f)", "c"));
20+
}
21+
22+
[Fact]
23+
public void Test_PgSQL_DbSpecial()
24+
{
25+
var provider = TestHelper.AddDtmCli(db: "postgres");
26+
var dbSpecialDelegate = provider.GetRequiredService<DbSpecialDelegate>();
27+
28+
var special = dbSpecialDelegate.GetDbSpecial();
29+
30+
Assert.IsType<PostgresDBSpecial>(special);
31+
Assert.Equal("begin", special.GetXaSQL("start", "xa1"));
32+
Assert.Equal("insert into a(f) values(@f) on conflict ON CONSTRAINT c do nothing", special.GetInsertIgnoreTemplate("a(f) values(@f)", "c"));
33+
}
1734

18-
var postgres = DtmImp.DbSpecialDelegate.Instance.GetDBSpecial();
19-
Assert.Equal("begin", postgres.GetXaSQL("start", "xa1"));
20-
Assert.Equal("insert into a(f) values(@f) on conflict ON CONSTRAINT c do nothing", postgres.GetInsertIgnoreTemplate("a(f) values(@f)", "c"));
35+
[Fact]
36+
public void Test_MsSQL_DbSpecial()
37+
{
38+
var provider = TestHelper.AddDtmCli(db: "sqlserver");
39+
var dbSpecialDelegate = provider.GetRequiredService<DbSpecialDelegate>();
2140

22-
DtmImp.DbSpecialDelegate.Instance.SetCurrentDBType("sqlserver");
41+
var special = dbSpecialDelegate.GetDbSpecial();
42+
43+
Assert.IsType<SqlServerDBSpecial>(special);
44+
Assert.Equal("insert into a(f) values(@f)", special.GetInsertIgnoreTemplate("a(f) values(@f)", "c"));
45+
Assert.Throws<DtmcliException>(() => special.GetXaSQL("", ""));
46+
}
47+
48+
[Fact]
49+
public void Test_Other_DbSpecial()
50+
{
51+
var provider = TestHelper.AddDtmCli(db: "other");
2352

24-
var sqlserver = DtmImp.DbSpecialDelegate.Instance.GetDBSpecial();
25-
Assert.Equal("insert into a(f) values(@f)", sqlserver.GetInsertIgnoreTemplate("a(f) values(@f)", "c"));
26-
Assert.Throws<DtmcliException>(() => sqlserver.GetXaSQL("", ""));
53+
var ex = Assert.Throws<DtmcliException>(() => provider.GetRequiredService<DbSpecialDelegate>());
54+
Assert.Equal("unknown db type 'other'", ex.Message);
2755
}
2856
}
2957
}

src/Dtmcli.Tests/MsgTests.cs

Lines changed: 30 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Apps72.Dev.Data.DbMocker;
2+
using Microsoft.Extensions.DependencyInjection;
23
using Moq;
34
using System;
45
using System.Collections.Generic;
@@ -12,6 +13,18 @@ namespace Dtmcli.Tests
1213
{
1314
public class MsgTests
1415
{
16+
private readonly IBranchBarrierFactory _branchBarrierFactory;
17+
18+
private static readonly string busi = "http://localhost:8081/busisvc";
19+
20+
public MsgTests()
21+
{
22+
var provider = TestHelper.AddDtmCli();
23+
24+
var factory = provider.GetRequiredService<IBranchBarrierFactory>();
25+
_branchBarrierFactory = factory;
26+
}
27+
1528
[Fact]
1629
public async void Submit_Should_Succeed()
1730
{
@@ -25,9 +38,7 @@ public async void Submit_Should_Succeed()
2538
var dtmClient = new DtmClient(fakeFactory.Object, Microsoft.Extensions.Options.Options.Create(dtmOptions));
2639

2740
var gid = "TestMsgNormal";
28-
var msg = new Msg(dtmClient, gid);
29-
30-
var busi = "http://localhost:8081/api/busi";
41+
var msg = new Msg(dtmClient, _branchBarrierFactory, gid);
3142

3243
var req = new { Amount = 30 };
3344

@@ -53,12 +64,10 @@ public async void Submit_Should_Succeed()
5364
public async void DoAndSubmitDB_Should_Throw_Exception_When_Transbase_InValid()
5465
{
5566
var dtmClient = new Mock<IDtmClient>();
56-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, true);
67+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, true);
5768

5869
var gid = string.Empty;
59-
var msg = new Msg(dtmClient.Object, gid);
60-
61-
var busi = "http://localhost:8081/api/busi";
70+
var msg = new Msg(dtmClient.Object, _branchBarrierFactory, gid);
6271

6372
var req = new { Amount = 30 };
6473

@@ -73,12 +82,10 @@ public async void DoAndSubmitDB_Should_Throw_Exception_When_Transbase_InValid()
7382
public async void DoAndSubmitDB_Should_Not_Call_Barrier_When_Prepare_Fail()
7483
{
7584
var dtmClient = new Mock<IDtmClient>();
76-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, false);
85+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, false);
7786

7887
var gid = "TestMsgNormal";
79-
var msg = new Msg(dtmClient.Object, gid);
80-
81-
var busi = "http://localhost:8081/api/busi";
88+
var msg = new Msg(dtmClient.Object, _branchBarrierFactory, gid);
8289

8390
var req = new { Amount = 30 };
8491

@@ -97,13 +104,11 @@ public async void DoAndSubmitDB_Should_Not_Call_Barrier_When_Prepare_Fail()
97104
public async void DoAndSubmitDB_Should_Succeed()
98105
{
99106
var dtmClient = new Mock<IDtmClient>();
100-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, true);
101-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_SUBMIT, true);
107+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, true);
108+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_SUBMIT, true);
102109

103110
var gid = "TestMsgNormal";
104-
var msg = new Msg(dtmClient.Object, gid);
105-
106-
var busi = "http://localhost:8081/api/busi";
111+
var msg = new Msg(dtmClient.Object, _branchBarrierFactory, gid);
107112

108113
var req = new { Amount = 30 };
109114

@@ -126,13 +131,11 @@ public async void DoAndSubmitDB_Should_Succeed()
126131
public async void DoAndSubmitDB_Should_Abort_When_BusiCall_ThrowExeption_With_ResultFailure()
127132
{
128133
var dtmClient = new Mock<IDtmClient>();
129-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, true);
130-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_ABORT, true);
134+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, true);
135+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_ABORT, true);
131136

132137
var gid = "TestMsgNormal";
133-
var msg = new Msg(dtmClient.Object, gid);
134-
135-
var busi = "http://localhost:8081/api/busi";
138+
var msg = new Msg(dtmClient.Object, _branchBarrierFactory, gid);
136139

137140
var req = new { Amount = 30 };
138141

@@ -155,15 +158,13 @@ public async void DoAndSubmitDB_Should_Abort_When_BusiCall_ThrowExeption_With_Re
155158
public async void DoAndSubmitDB_Should_QueryPrepared_When_BusiCall_ThrowExeption_Without_ResultFailure()
156159
{
157160
var dtmClient = new Mock<IDtmClient>();
158-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, true);
159-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_ABORT, true);
160-
MockTransCallDtm(dtmClient, Constant.Request.OPERATION_SUBMIT, true);
161-
MockTransRequestBranch(dtmClient, System.Net.HttpStatusCode.OK);
161+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_PREPARE, true);
162+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_ABORT, true);
163+
TestHelper.MockTransCallDtm(dtmClient, Constant.Request.OPERATION_SUBMIT, true);
164+
TestHelper.MockTransRequestBranch(dtmClient, System.Net.HttpStatusCode.OK);
162165

163166
var gid = "TestMsgNormal";
164-
var msg = new Msg(dtmClient.Object, gid);
165-
166-
var busi = "http://localhost:8081/api/busi";
167+
var msg = new Msg(dtmClient.Object, _branchBarrierFactory, gid);
167168

168169
var req = new { Amount = 30 };
169170

@@ -181,24 +182,7 @@ public async void DoAndSubmitDB_Should_QueryPrepared_When_BusiCall_ThrowExeption
181182
Assert.False(res);
182183
dtmClient.Verify(x => x.TransRequestBranch(It.IsAny<DtmImp.TransBase>(), It.IsAny<HttpMethod>(), It.IsAny<object>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()), Times.Once);
183184
}
184-
185-
private void MockTransCallDtm(Mock<IDtmClient> mock, string op, bool result)
186-
{
187-
mock
188-
.Setup(x => x.TransCallDtm(It.IsAny<DtmImp.TransBase>(), It.IsAny<object>(), op, It.IsAny<CancellationToken>()))
189-
.Returns(Task.FromResult(result));
190-
}
191-
192-
private void MockTransRequestBranch(Mock<IDtmClient> mock, System.Net.HttpStatusCode statusCode)
193-
{
194-
var httpRspMsg = new HttpResponseMessage(statusCode);
195-
httpRspMsg.Content = new StringContent("content");
196-
197-
mock
198-
.Setup(x => x.TransRequestBranch(It.IsAny<DtmImp.TransBase>(),It.IsAny<HttpMethod>() , It.IsAny<object>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
199-
.Returns(Task.FromResult(httpRspMsg));
200-
}
201-
185+
202186
public class MsgMockHttpMessageHandler : DelegatingHandler
203187
{
204188
public MsgMockHttpMessageHandler()

0 commit comments

Comments
 (0)