Skip to content

Commit d6a3f9d

Browse files
committed
Extended IMarketOrderRepository with GetAllByPortfolioEntryId method and covered it with integration tests
Implemented MarketOrderServiceImpl and covered it with unit tests
1 parent 4b6592d commit d6a3f9d

File tree

6 files changed

+270
-6
lines changed

6 files changed

+270
-6
lines changed

Repository/IRepository.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public interface IRepository<T>
2121

2222
public interface IMarketOrderRepository : IRepository<MarketOrder>
2323
{
24+
public List<MarketOrder> GetAllByPortfolioEntryId(int portfolioEntryId);
2425
}
2526

2627
public interface IPortfolioRepository : IRepository<Portfolio>

Repository/SqlKataMarketOrderRepository.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
2+
using System.Collections.Generic;
23
using Database;
34
using Model;
5+
using SqlKata.Execution;
46

57
namespace Repository
68
{
@@ -29,5 +31,8 @@ public override MarketOrder FromRow(dynamic d) =>
2931
new(Decimal.Divide(d.filled_price, 100), Decimal.Divide(d.fee, 100), Decimal.Divide(d.size, 100),
3032
DateTimeOffset.FromUnixTimeSeconds((int) d.date).DateTime.ToLocalTime(), d.buy > 0,
3133
(int) d.id, (int) d.portfolio_entry_id);
34+
35+
public List<MarketOrder> GetAllByPortfolioEntryId(int portfolioEntryId) =>
36+
RowsToObjects(Db.Get().Query(tableName).Where("portfolio_entry_id", portfolioEntryId).Get());
3237
}
3338
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Runtime.CompilerServices;
4+
using Model;
5+
using Repository;
6+
7+
namespace Services
8+
{
9+
public interface IMarketOrderService
10+
{
11+
MarketOrder CreateMarketOrder(decimal filledPrice, decimal fee, decimal size,
12+
DateTime date, bool buy, int portfolioEntryId);
13+
14+
bool DeleteMarketOrder(MarketOrder order);
15+
16+
bool UpdateMarketOrder(MarketOrder order);
17+
18+
MarketOrder GetMarketOrder(int id);
19+
20+
List<MarketOrder> GetPortfolioEntryOrders(int portfolioEntryId);
21+
}
22+
23+
public class MarketOrderServiceImpl : IMarketOrderService
24+
{
25+
private IMarketOrderRepository _marketOrderRepository;
26+
27+
public MarketOrderServiceImpl(IMarketOrderRepository marketOrderRepository)
28+
{
29+
_marketOrderRepository = marketOrderRepository;
30+
}
31+
32+
public MarketOrder CreateMarketOrder(decimal filledPrice, decimal fee, decimal size, DateTime date, bool buy,
33+
int portfolioEntryId)
34+
{
35+
var order = new MarketOrder(filledPrice, fee, size, date, buy, PortfolioEntryId: portfolioEntryId);
36+
var id = _marketOrderRepository.Add(order);
37+
return order with {Id = id};
38+
}
39+
40+
public bool DeleteMarketOrder(MarketOrder order) => _marketOrderRepository.Delete(order);
41+
42+
public bool UpdateMarketOrder(MarketOrder order) => _marketOrderRepository.Update(order);
43+
44+
public MarketOrder GetMarketOrder(int id) => _marketOrderRepository.Get(id);
45+
46+
public List<MarketOrder> GetPortfolioEntryOrders(int portfolioEntryId) =>
47+
_marketOrderRepository.GetAllByPortfolioEntryId(portfolioEntryId);
48+
}
49+
}

Tests/Integration/Repository/MarketOrderTest.cs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class SqlKataMarketOrderRepositoryFixture : IDisposable
1414
public SqlKataMarketOrderRepository MarketOrderRepository;
1515
private SqliteConnection _dbConnection;
1616
public int DefaultPortfolioEntryId;
17+
public int SecondaryPortfolioEntryId;
1718

1819
public SqlKataMarketOrderRepositoryFixture()
1920
{
@@ -25,6 +26,7 @@ public SqlKataMarketOrderRepositoryFixture()
2526
this.MarketOrderRepository = new(db);
2627
var defaultPortfolioId = portfolioRepository.Add(new("Foo", "Bar", Currency.Eur));
2728
DefaultPortfolioEntryId = portfolioEntryRepository.Add(new("btc", defaultPortfolioId));
29+
SecondaryPortfolioEntryId = portfolioEntryRepository.Add(new("ltc", defaultPortfolioId));
2830
}
2931

3032
public void Dispose()
@@ -137,5 +139,76 @@ public void AddUpdate_Updates()
137139
// assert
138140
Assert.Equal(marketOrder, _marketOrderRepositoryFixture.MarketOrderRepository.Get(id));
139141
}
142+
143+
[Fact]
144+
public void GetAllByPortfolioEntry_Returns_Correct_Orders()
145+
{
146+
// fixture unique to this test
147+
var marketOrderRepositoryFixture = new SqlKataMarketOrderRepositoryFixture();
148+
149+
// arrange
150+
var marketOrder1 = new MarketOrder(new Decimal(10000.39), 10, new Decimal(1.1), DateTime.Now, true,
151+
PortfolioEntryId: marketOrderRepositoryFixture.DefaultPortfolioEntryId);
152+
var marketOrder2 = new MarketOrder(new Decimal(11000.39), 11, new Decimal(1.2),
153+
DateTime.Now.Subtract(TimeSpan.FromSeconds(3600)), true,
154+
PortfolioEntryId: marketOrderRepositoryFixture.DefaultPortfolioEntryId);
155+
var marketOrder3 = new MarketOrder(new Decimal(12000.39), 12, new Decimal(1.3),
156+
DateTime.Now.Subtract(TimeSpan.FromDays(30)), false,
157+
PortfolioEntryId: marketOrderRepositoryFixture.DefaultPortfolioEntryId);
158+
159+
var marketOrder4 = new MarketOrder(new Decimal(12005.39), 15, new Decimal(12),
160+
DateTime.Now.Subtract(TimeSpan.FromDays(11)), false,
161+
PortfolioEntryId: marketOrderRepositoryFixture.SecondaryPortfolioEntryId);
162+
163+
var marketOrder5 = new MarketOrder(new Decimal(12006.39), 16, new Decimal(1.5),
164+
DateTime.Now.Subtract(TimeSpan.FromDays(39)), false,
165+
PortfolioEntryId: marketOrderRepositoryFixture.SecondaryPortfolioEntryId);
166+
167+
// act
168+
var presumablyEmptyList =
169+
marketOrderRepositoryFixture.MarketOrderRepository.GetAllByPortfolioEntryId(marketOrderRepositoryFixture
170+
.DefaultPortfolioEntryId);
171+
var presumablyEmptyList2 =
172+
marketOrderRepositoryFixture.MarketOrderRepository.GetAllByPortfolioEntryId(
173+
marketOrderRepositoryFixture.SecondaryPortfolioEntryId);
174+
175+
marketOrder1 = marketOrder1 with
176+
{
177+
Id = marketOrderRepositoryFixture.MarketOrderRepository.Add(marketOrder1)
178+
};
179+
marketOrder2 = marketOrder2 with
180+
{
181+
Id = marketOrderRepositoryFixture.MarketOrderRepository.Add(marketOrder2)
182+
};
183+
marketOrder3 = marketOrder3 with
184+
{
185+
Id = marketOrderRepositoryFixture.MarketOrderRepository.Add(marketOrder3)
186+
};
187+
188+
marketOrder4 = marketOrder4 with
189+
{
190+
Id = marketOrderRepositoryFixture.MarketOrderRepository.Add(marketOrder4)
191+
};
192+
marketOrder5 = marketOrder5 with
193+
{
194+
Id = marketOrderRepositoryFixture.MarketOrderRepository.Add(marketOrder5)
195+
};
196+
197+
// assert
198+
var loadedPortfolios =
199+
marketOrderRepositoryFixture.MarketOrderRepository.GetAllByPortfolioEntryId(marketOrderRepositoryFixture
200+
.DefaultPortfolioEntryId);
201+
Assert.Empty(presumablyEmptyList);
202+
Assert.Empty(presumablyEmptyList2);
203+
204+
Assert.Equal(3, loadedPortfolios.Count);
205+
Assert.Equal(new List<MarketOrder> {marketOrder1, marketOrder2, marketOrder3}, loadedPortfolios);
206+
207+
var loadedPortfoliosSecondary =
208+
marketOrderRepositoryFixture.MarketOrderRepository.GetAllByPortfolioEntryId(marketOrderRepositoryFixture
209+
.SecondaryPortfolioEntryId);
210+
Assert.Equal(2, loadedPortfoliosSecondary.Count);
211+
Assert.Equal(new List<MarketOrder> {marketOrder4, marketOrder5}, loadedPortfoliosSecondary);
212+
}
140213
}
141214
}

Tests/Integration/Repository/PortfolioEntryTest.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,18 @@ public void GetAllByPortfolioId_Returns_Correct_Entries()
119119
var portfolioEntry1 = new PortfolioEntry("btc", portfolioEntryRepositoryFixture.DefaultPortfolioId);
120120
var portfolioEntry2 = new PortfolioEntry("ada", portfolioEntryRepositoryFixture.DefaultPortfolioId);
121121
var portfolioEntry3 = new PortfolioEntry("ltc", portfolioEntryRepositoryFixture.DefaultPortfolioId);
122-
122+
123123
var portfolioEntry4 = new PortfolioEntry("btc", portfolioEntryRepositoryFixture.SecondaryPortfolioId);
124124
var portfolioEntry5 = new PortfolioEntry("eth", portfolioEntryRepositoryFixture.SecondaryPortfolioId);
125125

126126
// act
127+
var presumablyEmptyList =
128+
portfolioEntryRepositoryFixture.PortfolioEntryRepository.GetAllByPortfolioId(
129+
portfolioEntryRepositoryFixture.DefaultPortfolioId);
130+
var presumablyEmptyList2 =
131+
portfolioEntryRepositoryFixture.PortfolioEntryRepository.GetAllByPortfolioId(
132+
portfolioEntryRepositoryFixture.SecondaryPortfolioId);
133+
127134
portfolioEntry1 = portfolioEntry1 with
128135
{
129136
Id = portfolioEntryRepositoryFixture.PortfolioEntryRepository.Add(portfolioEntry1)
@@ -136,7 +143,7 @@ public void GetAllByPortfolioId_Returns_Correct_Entries()
136143
{
137144
Id = portfolioEntryRepositoryFixture.PortfolioEntryRepository.Add(portfolioEntry3)
138145
};
139-
146+
140147
portfolioEntry4 = portfolioEntry4 with
141148
{
142149
Id = portfolioEntryRepositoryFixture.PortfolioEntryRepository.Add(portfolioEntry4)
@@ -147,12 +154,19 @@ public void GetAllByPortfolioId_Returns_Correct_Entries()
147154
};
148155

149156
// assert
150-
var loadedPortfolios = portfolioEntryRepositoryFixture.PortfolioEntryRepository.GetAllByPortfolioId(portfolioEntryRepositoryFixture.DefaultPortfolioId);
151-
Assert.Equal(3, loadedPortfolios.Count);
157+
var loadedPortfolios =
158+
portfolioEntryRepositoryFixture.PortfolioEntryRepository.GetAllByPortfolioId(
159+
portfolioEntryRepositoryFixture.DefaultPortfolioId);
160+
161+
Assert.Empty(presumablyEmptyList);
162+
Assert.Empty(presumablyEmptyList2);
163+
152164
Assert.Equal(new List<PortfolioEntry> {portfolioEntry1, portfolioEntry2, portfolioEntry3},
153165
loadedPortfolios);
154-
155-
var loadedPortfoliosSecondaryPortfolio = portfolioEntryRepositoryFixture.PortfolioEntryRepository.GetAllByPortfolioId(portfolioEntryRepositoryFixture.SecondaryPortfolioId);
166+
167+
var loadedPortfoliosSecondaryPortfolio =
168+
portfolioEntryRepositoryFixture.PortfolioEntryRepository.GetAllByPortfolioId(
169+
portfolioEntryRepositoryFixture.SecondaryPortfolioId);
156170
Assert.Equal(2, loadedPortfoliosSecondaryPortfolio.Count);
157171
Assert.Equal(new List<PortfolioEntry> {portfolioEntry4, portfolioEntry5},
158172
loadedPortfoliosSecondaryPortfolio);
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Model;
4+
using Moq;
5+
using Repository;
6+
using Services;
7+
using Xunit;
8+
9+
namespace Tests.Unit.Service
10+
{
11+
public class MarketOrderServiceTest
12+
{
13+
[Fact]
14+
public void Create_CallsRepository()
15+
{
16+
// arrange
17+
var marketOrderToBeAdded = new MarketOrder(new decimal(12000.39), 12, new decimal(1.3),
18+
DateTime.Now.Subtract(TimeSpan.FromDays(30)), false,
19+
PortfolioEntryId: 1);
20+
21+
var repositoryMock = new Mock<IMarketOrderRepository>();
22+
repositoryMock.Setup(x =>
23+
x.Add(It.Is<MarketOrder>(marketOrder => marketOrder == marketOrderToBeAdded))).Returns(1);
24+
var service = new MarketOrderServiceImpl(repositoryMock.Object);
25+
26+
// act
27+
var marketOrder = service.CreateMarketOrder(new decimal(12000.39), 12, new decimal(1.3),
28+
DateTime.Now.Subtract(TimeSpan.FromDays(30)), false, 1);
29+
30+
// assert
31+
Assert.Equal(marketOrderToBeAdded with {Id = 1}, marketOrder);
32+
}
33+
34+
[Fact]
35+
public void Get_CallsRepository()
36+
{
37+
// arrange
38+
var marketOrderPresentInRepository = new MarketOrder(new decimal(12000.39), 12, new decimal(1.3),
39+
DateTime.Now.Subtract(TimeSpan.FromDays(30)), false,
40+
PortfolioEntryId: 1);
41+
var repositoryMock = new Mock<IMarketOrderRepository>();
42+
repositoryMock.Setup(x => x.Get(It.Is<int>(id => id == 1))).Returns(marketOrderPresentInRepository);
43+
var service = new MarketOrderServiceImpl(repositoryMock.Object);
44+
45+
// act
46+
var marketOrder = service.GetMarketOrder(1);
47+
48+
// assert
49+
Assert.Equal(marketOrderPresentInRepository, marketOrder);
50+
}
51+
52+
[Fact]
53+
public void GetPortfolioEntries_CallsRepository()
54+
{
55+
// arrange
56+
var entriesList = new List<MarketOrder>
57+
{
58+
new(new Decimal(10000.39), 11, new Decimal(1.1), DateTime.Now, true,
59+
PortfolioEntryId: 1),
60+
new(new Decimal(10000.39), 12, new Decimal(1.1), DateTime.Now, true,
61+
PortfolioEntryId: 1),
62+
new(new Decimal(10000.39), 13, new Decimal(1.1), DateTime.Now, true,
63+
PortfolioEntryId: 2),
64+
new(new Decimal(10000.11), 14, new Decimal(1.1), DateTime.Now, false,
65+
PortfolioEntryId: 1),
66+
};
67+
68+
var repositoryMock = new Mock<IMarketOrderRepository>();
69+
repositoryMock.Setup(x => x.GetAllByPortfolioEntryId(It.Is<int>(id => id == 1))).Returns(
70+
new List<MarketOrder>()
71+
{
72+
entriesList[0], entriesList[1], entriesList[3]
73+
});
74+
var service = new MarketOrderServiceImpl(repositoryMock.Object);
75+
76+
// act
77+
var entriesFetched = service.GetPortfolioEntryOrders(1);
78+
79+
// assert
80+
Assert.Equal(new List<MarketOrder>
81+
{
82+
entriesList[0], entriesList[1], entriesList[3]
83+
}, entriesFetched);
84+
}
85+
86+
[Fact]
87+
public void Update_CallsRepository()
88+
{
89+
// arrange
90+
var marketOrderToBeUpdated = new MarketOrder(new decimal(12000.39), 12, new decimal(1.3),
91+
DateTime.Now.Subtract(TimeSpan.FromDays(30)), false,
92+
PortfolioEntryId: 1);
93+
var repositoryMock = new Mock<IMarketOrderRepository>();
94+
repositoryMock.Setup(x => x.Update(It.IsAny<MarketOrder>())).Returns(true);
95+
var service = new MarketOrderServiceImpl(repositoryMock.Object);
96+
97+
// act
98+
var updated = service.UpdateMarketOrder(marketOrderToBeUpdated);
99+
100+
// assert
101+
Assert.True(updated);
102+
}
103+
104+
[Fact]
105+
public void Delete_CallsRepository()
106+
{
107+
// arrange
108+
var marketOrderToBeDeleted = new MarketOrder(new decimal(12000.39), 12, new decimal(1.3),
109+
DateTime.Now.Subtract(TimeSpan.FromDays(30)), false,
110+
PortfolioEntryId: 1);
111+
var repositoryMock = new Mock<IMarketOrderRepository>();
112+
repositoryMock.Setup(x => x.Delete(It.IsAny<MarketOrder>())).Returns(true);
113+
var service = new MarketOrderServiceImpl(repositoryMock.Object);
114+
115+
// act
116+
var delete = service.DeleteMarketOrder(marketOrderToBeDeleted);
117+
118+
// assert
119+
Assert.True(delete);
120+
}
121+
}
122+
}

0 commit comments

Comments
 (0)