Skip to content

Commit 526fabe

Browse files
authored
Merge pull request #15 from Laffini/update-order
Update orders & additional tests
2 parents 166826b + 3681f85 commit 526fabe

7 files changed

Lines changed: 229 additions & 38 deletions

File tree

.project

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
</arguments>
1212
</buildCommand>
1313
<buildCommand>
14-
<name>org.eclipse.m2e.core.maven2Builder</name>
14+
<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
1515
<arguments>
1616
</arguments>
1717
</buildCommand>
1818
<buildCommand>
19-
<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
19+
<name>org.eclipse.m2e.core.maven2Builder</name>
2020
<arguments>
2121
</arguments>
2222
</buildCommand>

src/main/java/net/laffyco/javamatchingengine/OrderController.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import java.util.HashMap;
44
import java.util.List;
55
import java.util.Map;
6+
import java.util.Optional;
67

78
import org.springframework.beans.factory.annotation.Autowired;
89
import org.springframework.web.bind.annotation.DeleteMapping;
910
import org.springframework.web.bind.annotation.GetMapping;
1011
import org.springframework.web.bind.annotation.PathVariable;
1112
import org.springframework.web.bind.annotation.PostMapping;
13+
import org.springframework.web.bind.annotation.PutMapping;
1214
import org.springframework.web.bind.annotation.RequestMapping;
1315
import org.springframework.web.bind.annotation.RequestParam;
1416
import org.springframework.web.bind.annotation.RestController;
@@ -104,5 +106,49 @@ public Map<String, Object> deleteOrder(@PathVariable final String id,
104106
return response;
105107
}
106108

107-
// TODO: PUT update an order
109+
/**
110+
* Update an order.
111+
*
112+
* @param id
113+
* @param side
114+
* @param newAmount
115+
* @param newPrice
116+
* @param newSide
117+
* @return whether an order has been updated or not
118+
*/
119+
@PutMapping("/{id}")
120+
public Map<String, Object> updateOrder(@PathVariable final String id,
121+
@RequestParam("side") final Side side,
122+
@RequestParam("newAmount") final Optional<Double> newAmount,
123+
@RequestParam("newPrice") final Optional<Double> newPrice,
124+
@RequestParam("newSide") final Optional<Side> newSide) {
125+
126+
final Map<String, Object> response = new HashMap<>();
127+
128+
boolean isUpdated = false;
129+
130+
final Order toUpdate = this.orderBook.findOrder(id, side);
131+
132+
if (newAmount.isPresent()) {
133+
// Update amount.
134+
toUpdate.setAmount(newAmount.get());
135+
isUpdated = true;
136+
}
137+
138+
if (newPrice.isPresent()) {
139+
// Update price.
140+
toUpdate.setPrice(newPrice.get());
141+
isUpdated = true;
142+
}
143+
144+
if (newSide.isPresent()) {
145+
// Update side.
146+
toUpdate.setSide(newSide.get());
147+
isUpdated = true;
148+
}
149+
150+
response.put("updated", isUpdated);
151+
152+
return response;
153+
}
108154
}

src/test/java/net/laffyco/javamatchingengine/OrderControllerTests.java

Lines changed: 71 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,29 @@
66
import java.util.ArrayList;
77
import java.util.List;
88
import java.util.Map;
9+
import java.util.Optional;
910

1011
import javax.annotation.Resource;
1112

12-
import org.junit.jupiter.api.BeforeEach;
1313
import org.junit.jupiter.api.DisplayName;
1414
import org.junit.jupiter.api.Test;
1515
import org.mockito.InjectMocks;
1616
import org.mockito.Mock;
1717
import org.mockito.Mockito;
18-
import org.mockito.MockitoAnnotations;
1918

2019
import net.laffyco.javamatchingengine.engine.Order;
2120
import net.laffyco.javamatchingengine.engine.OrderBook;
2221
import net.laffyco.javamatchingengine.engine.Side;
2322
import net.laffyco.javamatchingengine.engine.Trade;
23+
import test.utils.AbstractTest;
2424

2525
/**
2626
* Tests for the OrderController class.
2727
*
2828
* @author Laffini
2929
*
3030
*/
31-
public class OrderControllerTests {
31+
public class OrderControllerTests extends AbstractTest {
3232

3333
/**
3434
* Mock order book.
@@ -44,12 +44,27 @@ public class OrderControllerTests {
4444
private OrderController controller;
4545

4646
/**
47-
* Setup.
47+
* Test data id.
4848
*/
49-
@BeforeEach
50-
public void setUp() {
51-
// Initialise mocks created above
52-
MockitoAnnotations.openMocks(this);
49+
private final String id = "id";
50+
51+
/**
52+
* Test data side.
53+
*/
54+
private final Side side = Side.BUY;
55+
56+
/** Create a mock order to return. */
57+
private final Order mockOrder = Mockito.mock(Order.class);
58+
59+
/**
60+
* Test data amount.
61+
*/
62+
private final double amt = 25.0;
63+
64+
@Override
65+
public final void init() {
66+
Mockito.when(this.orderBook.findOrder(this.id, this.side))
67+
.thenReturn(this.mockOrder);
5368
}
5469

5570
/**
@@ -73,13 +88,10 @@ public void getOrders() {
7388
@Test
7489
@DisplayName("Get an order by ID")
7590
public void getOrderById() {
76-
final Order found = Mockito.mock(Order.class);
77-
final String id = "testId";
78-
final Side side = Side.BUY;
79-
Mockito.when(this.orderBook.findOrder(id, side)).thenReturn(found);
80-
final Map<String, Order> result = this.controller.getOrder(id, side);
91+
final Map<String, Order> result = this.controller.getOrder(this.id,
92+
this.side);
8193
assertTrue(result.containsKey("order"));
82-
assertEquals(result.get("order"), found);
94+
assertEquals(result.get("order"), this.mockOrder);
8395
}
8496

8597
/**
@@ -88,17 +100,15 @@ public void getOrderById() {
88100
@Test
89101
@DisplayName("Add an order")
90102
public void addOrder() {
91-
final Side side = Side.BUY;
92-
final double amt = 10;
93103
final double price = 25;
94104

95105
final List<Trade> trades = new ArrayList<Trade>();
96106
Mockito.when(this.orderBook.process(Mockito.any())).thenReturn(trades);
97107

98-
final Map<String, Object> result = this.controller.addOrder(side, amt,
99-
price);
108+
final Map<String, Object> result = this.controller.addOrder(this.side,
109+
this.amt, price);
100110

101-
assertTrue(result.containsKey("id"));
111+
assertTrue(result.containsKey(this.id));
102112
assertTrue(result.containsKey("trades"));
103113
assertEquals(result.get("trades"), trades);
104114
}
@@ -109,17 +119,53 @@ public void addOrder() {
109119
@Test
110120
@DisplayName("Delete an order")
111121
public void deleteOrder() {
112-
final String id = "id";
113-
final Side side = Side.BUY;
114122

115-
Mockito.when(this.orderBook.cancelOrder(id, side)).thenReturn(true);
123+
Mockito.when(this.orderBook.cancelOrder(this.id, this.side))
124+
.thenReturn(true);
116125

117-
final Map<String, Object> result = this.controller.deleteOrder(id,
118-
side);
126+
final Map<String, Object> result = this.controller.deleteOrder(this.id,
127+
this.side);
119128

120129
assertTrue((boolean) result.get("order_deleted"));
121130

122-
Mockito.verify(this.orderBook).cancelOrder(id, side);
131+
Mockito.verify(this.orderBook).cancelOrder(this.id, this.side);
123132
}
124133

134+
/**
135+
* Update an order.
136+
*/
137+
@Test
138+
@DisplayName("Update an order")
139+
public void updateOrder() {
140+
final double price = 35.0;
141+
final Side newSide = Side.SELL;
142+
143+
final Map<String, Object> result = this.controller.updateOrder(this.id,
144+
this.side, Optional.of(this.amt), Optional.of(price),
145+
Optional.of(newSide));
146+
147+
assertTrue((boolean) result.get("updated"));
148+
Mockito.verify(this.mockOrder).setAmount(this.amt);
149+
Mockito.verify(this.mockOrder).setPrice(price);
150+
Mockito.verify(this.mockOrder).setSide(newSide);
151+
}
152+
153+
/**
154+
* Update an order with one parameter.
155+
*/
156+
@Test
157+
@DisplayName("Update an order with one parameter")
158+
public void updateOrder1Param() {
159+
160+
final Map<String, Object> result = this.controller.updateOrder(this.id,
161+
this.side, Optional.of(this.amt), Optional.empty(),
162+
Optional.empty());
163+
164+
assertTrue((boolean) result.get("updated"));
165+
Mockito.verify(this.mockOrder).setAmount(this.amt);
166+
Mockito.verify(this.mockOrder, Mockito.times(0))
167+
.setPrice(Mockito.anyDouble());
168+
Mockito.verify(this.mockOrder, Mockito.times(0))
169+
.setSide(Mockito.any(Side.class));
170+
}
125171
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package net.laffyco.javamatchingengine;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.Map;
6+
7+
import javax.annotation.Resource;
8+
9+
import org.junit.jupiter.api.DisplayName;
10+
import org.junit.jupiter.api.Test;
11+
import org.mockito.InjectMocks;
12+
import org.mockito.Mock;
13+
import org.mockito.Mockito;
14+
15+
import net.laffyco.javamatchingengine.engine.OrderBook;
16+
import test.utils.AbstractTest;
17+
18+
/**
19+
* @author Laffini
20+
*
21+
*/
22+
public class SpreadControllerTests extends AbstractTest {
23+
24+
/**
25+
* Mock order book.
26+
*/
27+
@Mock
28+
private OrderBook orderBook;
29+
30+
/**
31+
* Controller under test.
32+
*/
33+
@InjectMocks
34+
@Resource
35+
private SpreadController controller;
36+
37+
@Override
38+
public void init() {
39+
// Left blank intentionally.
40+
}
41+
42+
/**
43+
* Get spread.
44+
*/
45+
@Test
46+
@DisplayName("Get the spread")
47+
public void getSpread() {
48+
final double spread = 3.0;
49+
Mockito.when(this.orderBook.getSpread()).thenReturn(spread);
50+
final Map<String, Double> result = this.controller.getSpread();
51+
assertEquals(spread, result.get("spread"));
52+
}
53+
54+
}

src/test/java/net/laffyco/javamatchingengine/engine/OrderBookTests.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertFalse;
55
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
67
import java.util.List;
8+
79
import javax.annotation.Resource;
8-
import org.junit.jupiter.api.BeforeEach;
10+
911
import org.junit.jupiter.api.DisplayName;
1012
import org.junit.jupiter.api.Test;
1113
import org.mockito.InjectMocks;
@@ -21,8 +23,8 @@ public class OrderBookTests extends MatchingEngineTest {
2123
/**
2224
* Array of orders.
2325
*/
24-
private final Order[] orders = { new Order(3, 2, Side.BUY),
25-
new Order(3, 2, Side.SELL) };
26+
private final Order[] orders = {new Order(3, 2, Side.BUY),
27+
new Order(3, 2, Side.SELL)};
2628

2729
/**
2830
* Test OrderBook.
@@ -31,7 +33,6 @@ public class OrderBookTests extends MatchingEngineTest {
3133
@Resource
3234
private OrderBook orderBook;
3335

34-
3536
/**
3637
* Add a buy order, then add a matching sell order.
3738
*/
@@ -134,7 +135,7 @@ public void findOrder() {
134135
* Test that no orders are cancelled when an invalid side is provided.
135136
*/
136137
@Test
137-
@DisplayName("No orders are cancelled when an invalid side is provided")
138+
@DisplayName("No orders are cancelled when an invalid side is provided")
138139
public void cancelTestInvalidSide() {
139140

140141
final String orderId = "";
@@ -143,7 +144,7 @@ public void cancelTestInvalidSide() {
143144
assertFalse(result);
144145
}
145146

146-
/**
147+
/**
147148
* A buy order that fills two sell orders.
148149
*/
149150
@Test

src/test/java/net/laffyco/javamatchingengine/engine/OrderTests.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,34 @@
11
package net.laffyco.javamatchingengine.engine;
22

33
import static org.junit.jupiter.api.Assertions.assertTrue;
4+
45
import java.util.Date;
6+
57
import org.junit.jupiter.api.DisplayName;
68
import org.junit.jupiter.api.Test;
79

810
/**
11+
* Order tests.
12+
*
913
* @author Laffini
1014
*
1115
*/
1216
public class OrderTests extends MatchingEngineTest {
1317

14-
final int amt = 1;
15-
final double price = 2;
16-
final Side side = Side.BUY;
18+
/**
19+
* Order amount.
20+
*/
21+
private final int amt = 1;
22+
23+
/**
24+
* Order price.
25+
*/
26+
private final double price = 2;
27+
28+
/**
29+
* Order side.
30+
*/
31+
private final Side side = Side.BUY;
1732

1833
/**
1934
* Compare two orders with different prices.
@@ -47,4 +62,4 @@ public void compareSamePrice() {
4762
assertTrue(order1.compareTo(order2) > 0);
4863
assertTrue(order2.compareTo(order1) < 0);
4964
}
50-
}
65+
}

0 commit comments

Comments
 (0)