Skip to content

Commit acccd85

Browse files
authored
Merge pull request #6 from companieshouse/PCI-707-return-bad-request
return 400 bad request when posting to /basket/checkout and added userId
2 parents 825ebb5 + 1a07e26 commit acccd85

File tree

9 files changed

+63
-44
lines changed

9 files changed

+63
-44
lines changed

src/main/java/uk/gov/companieshouse/orders/api/controller/BasketController.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,15 @@ public ResponseEntity<AddToBasketResponseDTO> addItemToBasket(final @Valid @Requ
8383
}
8484

8585
@PostMapping("${uk.gov.companieshouse.orders.api.basket.checkout}")
86-
public ResponseEntity<?> checkoutBasket(HttpServletRequest request,
86+
public ResponseEntity<?> checkoutBasket(@RequestBody(required = false) String json,
87+
HttpServletRequest request,
8788
final @RequestHeader(REQUEST_ID_HEADER_NAME) String requestId) {
8889
trace("Entering checkoutBasket", requestId);
8990

91+
if(json!=null) {
92+
return ResponseEntity.status(BAD_REQUEST).body(new ApiError(BAD_REQUEST, "The body must be empty"));
93+
}
94+
9095
final Basket retrievedBasket = basketService.getBasketById(EricHeaderHelper.getIdentity(request))
9196
.orElseThrow(ConflictException::new);
9297

@@ -105,7 +110,7 @@ public ResponseEntity<?> checkoutBasket(HttpServletRequest request,
105110
return ResponseEntity.status(BAD_REQUEST).body(new ApiError(BAD_REQUEST, "Failed to retrieve item"));
106111
}
107112

108-
Checkout checkout = checkoutService.createCheckout(item);
113+
Checkout checkout = checkoutService.createCheckout(item, EricHeaderHelper.getIdentity(request));
109114
trace("Successfully created checkout with id "+checkout.getId(), requestId);
110115

111116
return ResponseEntity.status(HttpStatus.OK).body(null);

src/main/java/uk/gov/companieshouse/orders/api/model/BasketData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class BasketData {
1010

1111
private String etag;
1212

13-
private List<BasketItem> items = new ArrayList<BasketItem>();
13+
private List<BasketItem> items = new ArrayList<>();
1414

1515
private String kind;
1616

src/main/java/uk/gov/companieshouse/orders/api/model/Checkout.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public class Checkout {
1616

1717
private CheckoutData data = new CheckoutData();
1818

19+
private String userId;
20+
1921
public String getId() {
2022
return id;
2123
}
@@ -47,4 +49,12 @@ public CheckoutData getData() {
4749
public void setData(CheckoutData data) {
4850
this.data = data;
4951
}
52+
53+
public String getUserId() {
54+
return userId;
55+
}
56+
57+
public void setUserId(String userId) {
58+
this.userId = userId;
59+
}
5060
}

src/main/java/uk/gov/companieshouse/orders/api/model/CheckoutData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class CheckoutData {
1313

1414
private DeliveryDetails deliveryDetails = new DeliveryDetails();
1515

16-
private List<Item> items = new ArrayList<Item>();
16+
private List<Item> items = new ArrayList<>();
1717

1818
private String kind;
1919

src/main/java/uk/gov/companieshouse/orders/api/model/DirectorOrSecretaryDetails.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import com.google.gson.Gson;
44

5-
import java.util.Objects;
6-
75
public class DirectorOrSecretaryDetails {
86
private Boolean includeAddress;
97
private Boolean includeAppointmentDate;

src/main/java/uk/gov/companieshouse/orders/api/model/RegisteredOfficeAddressDetails.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import com.google.gson.Gson;
44

5-
import java.util.Objects;
6-
75
public class RegisteredOfficeAddressDetails {
86
private IncludeAddressRecordsType includeAddressRecordsType;
97

src/main/java/uk/gov/companieshouse/orders/api/service/CheckoutService.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package uk.gov.companieshouse.orders.api.service;
22

33
import org.springframework.stereotype.Service;
4-
import uk.gov.companieshouse.orders.api.mapper.ApiToCertificateMapper;
54
import uk.gov.companieshouse.orders.api.model.Checkout;
65
import uk.gov.companieshouse.orders.api.model.Item;
76
import uk.gov.companieshouse.orders.api.repository.CheckoutRepository;
@@ -11,24 +10,16 @@
1110
@Service
1211
public class CheckoutService {
1312

14-
private final BasketService basketService;
15-
1613
private final CheckoutRepository checkoutRepository;
1714

18-
private final ApiClientService apiClientService;
19-
20-
private final ApiToCertificateMapper apiToCertificateMapper;
21-
22-
public CheckoutService(BasketService basketService, CheckoutRepository checkoutRepository, ApiClientService apiClientService, ApiToCertificateMapper apiToCertificateMapper) {
23-
this.basketService = basketService;
15+
public CheckoutService(CheckoutRepository checkoutRepository) {
2416
this.checkoutRepository = checkoutRepository;
25-
this.apiClientService = apiClientService;
26-
this.apiToCertificateMapper = apiToCertificateMapper;
2717
}
2818

29-
public Checkout createCheckout(Item item) {
19+
public Checkout createCheckout(Item item, String userId) {
3020
final LocalDateTime now = LocalDateTime.now();
3121
Checkout checkout = new Checkout();
22+
checkout.setUserId(userId);
3223
checkout.setCreatedAt(now);
3324
checkout.setUpdatedAt(now);
3425
checkout.getData().getItems().add(item);

src/test/java/uk/gov/companieshouse/orders/api/controller/BasketControllerIntegrationTest.java

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ void tearDown() {
6868
}
6969

7070
@Test
71-
@DisplayName("Successfully adds an item to the basket if it does not exist")
72-
public void successfullyAddsItemToBasketIfItDoesNotExists() throws Exception {
71+
@DisplayName("Add Item successfully adds an item to the basket, if the basket does not exist")
72+
public void addItemSuccessfullyAddsItemToBasketIfBasketDoesNotExist() throws Exception {
7373
AddToBasketRequestDTO addToBasketRequestDTO = new AddToBasketRequestDTO();
7474
addToBasketRequestDTO.setItemUri(ITEM_URI);
7575

@@ -81,13 +81,13 @@ public void successfullyAddsItemToBasketIfItDoesNotExists() throws Exception {
8181
.andExpect(status().isOk());
8282

8383
final Optional<Basket> retrievedBasket = basketRepository.findById(ERIC_IDENTITY_VALUE);
84-
assertEquals(retrievedBasket.get().getData().getItems().get(0).getItemUri(), ITEM_URI);
85-
assertEquals(retrievedBasket.get().getData().getItems().size(), 1);
84+
assertEquals(ITEM_URI, retrievedBasket.get().getData().getItems().get(0).getItemUri());
85+
assertEquals(1, retrievedBasket.get().getData().getItems().size());
8686
}
8787

8888
@Test
89-
@DisplayName("Successfully adds an item to the basket if it exists")
90-
public void successfullyAddsAnItemToBasketIfItAlreadyExists() throws Exception {
89+
@DisplayName("Add item successfully adds an item to the basket, if the basket exists")
90+
public void addItemSuccessfullyAddsAnItemToBasketIfBasketAlreadyExists() throws Exception {
9191
Basket basket = new Basket();
9292
basketRepository.save(basket);
9393

@@ -102,13 +102,13 @@ public void successfullyAddsAnItemToBasketIfItAlreadyExists() throws Exception {
102102
.andExpect(status().isOk());
103103

104104
final Optional<Basket> retrievedBasket = basketRepository.findById(ERIC_IDENTITY_VALUE);
105-
assertEquals(retrievedBasket.get().getData().getItems().get(0).getItemUri(), ITEM_URI);
105+
assertEquals(ITEM_URI, retrievedBasket.get().getData().getItems().get(0).getItemUri());
106106

107107
}
108108

109109
@Test
110-
@DisplayName("Successfully replaces an item in the basket")
111-
public void successfullyReplacesAnItemInTheBasket() throws Exception {
110+
@DisplayName("Add item successfully replaces an item in the basket")
111+
public void addItemSuccessfullyReplacesAnItemInTheBasket() throws Exception {
112112
BasketItem item = new BasketItem();
113113
item.setItemUri(ITEM_URI_OLD);
114114
BasketData basketData = new BasketData();
@@ -128,13 +128,13 @@ public void successfullyReplacesAnItemInTheBasket() throws Exception {
128128
.andExpect(status().isOk());
129129

130130
final Optional<Basket> retrievedBasket = basketRepository.findById(ERIC_IDENTITY_VALUE);
131-
assertEquals(retrievedBasket.get().getData().getItems().get(0).getItemUri(), ITEM_URI);
131+
assertEquals(ITEM_URI, retrievedBasket.get().getData().getItems().get(0).getItemUri());
132132

133133
}
134134

135135
@Test
136-
@DisplayName("Fails to add item to basket that fails validation")
137-
public void failsToAddItemToBasketIfFailsValidation() throws Exception {
136+
@DisplayName("Add item fails to add item to basket that fails validation")
137+
public void addItemFailsToAddItemToBasketIfFailsValidation() throws Exception {
138138
mockMvc.perform(post("/basket/items")
139139
.header(REQUEST_ID_HEADER_NAME, TOKEN_REQUEST_ID_VALUE)
140140
.header(ERIC_IDENTITY_HEADER_NAME, ERIC_IDENTITY_VALUE)
@@ -147,8 +147,8 @@ public void failsToAddItemToBasketIfFailsValidation() throws Exception {
147147
}
148148

149149
@Test
150-
@DisplayName("Successfully creates checkout when basket contains a valid certificate uri")
151-
public void successfullyCreatesCheckoutWhenBasketIsValid() throws Exception {
150+
@DisplayName("Checkout basket successfully creates checkout, when basket contains a valid certificate uri")
151+
public void checkoutBasketSuccessfullyCreatesCheckoutWhenBasketIsValid() throws Exception {
152152
Basket basket = new Basket();
153153
basket.setId(ERIC_IDENTITY_VALUE);
154154
BasketItem basketItem = new BasketItem();
@@ -161,7 +161,7 @@ public void successfullyCreatesCheckoutWhenBasketIsValid() throws Exception {
161161
when(apiClientService.getItem(ITEM_URI)).thenReturn(certificate);
162162

163163
ResultCaptor<Checkout> resultCaptor = new ResultCaptor<>();
164-
doAnswer(resultCaptor).when(checkoutService).createCheckout(any(Certificate.class));
164+
doAnswer(resultCaptor).when(checkoutService).createCheckout(any(Certificate.class), any(String.class));
165165

166166
mockMvc.perform(post("/basket/checkout")
167167
.header(REQUEST_ID_HEADER_NAME, TOKEN_REQUEST_ID_VALUE)
@@ -170,13 +170,14 @@ public void successfullyCreatesCheckoutWhenBasketIsValid() throws Exception {
170170

171171
final Optional<Checkout> retrievedCheckout = checkoutRepository.findById(resultCaptor.getResult().getId());
172172
assertTrue(retrievedCheckout.isPresent());
173+
assertEquals(ERIC_IDENTITY_VALUE, retrievedCheckout.get().getUserId());
173174
final Item item = retrievedCheckout.get().getData().getItems().get(0);
174175
assertEquals(COMPANY_NUMBER, item.getCompanyNumber());
175176
}
176177

177178
@Test
178-
@DisplayName("Fails to create checkout and returns 409 conflict, when basket is empty")
179-
public void failsToCreateCheckoutIfBasketIsEmpty() throws Exception {
179+
@DisplayName("Checkout basket fails to create checkout and returns 409 conflict, when basket is empty")
180+
public void checkoutBasketfFailsToCreateCheckoutIfBasketIsEmpty() throws Exception {
180181
Basket basket = new Basket();
181182
basket.setId(ERIC_IDENTITY_VALUE);
182183
basketRepository.save(basket);
@@ -190,8 +191,8 @@ public void failsToCreateCheckoutIfBasketIsEmpty() throws Exception {
190191
}
191192

192193
@Test
193-
@DisplayName("Fails to create checkout and returns 409, when basket does not exist")
194-
public void failsToCreateCheckoutIfBasketDoesNotExist() throws Exception {
194+
@DisplayName("Checkout Basket fails to create checkout and returns 409, when basket does not exist")
195+
public void checkoutBasketFailsToCreateCheckoutIfBasketDoesNotExist() throws Exception {
195196

196197
mockMvc.perform(post("/basket/checkout")
197198
.header(REQUEST_ID_HEADER_NAME, TOKEN_REQUEST_ID_VALUE)
@@ -202,8 +203,8 @@ public void failsToCreateCheckoutIfBasketDoesNotExist() throws Exception {
202203
}
203204

204205
@Test
205-
@DisplayName("Fails to create checkout and returns 400, when there is a failure getting the item")
206-
public void failsToCreateCheckoutWhenItFailsToGetAnItem() throws Exception {
206+
@DisplayName("Checkout Basket fails to create checkout and returns 400, when there is a failure getting the item")
207+
public void checkoutBasketFailsToCreateCheckoutWhenItFailsToGetAnItem() throws Exception {
207208
Basket basket = new Basket();
208209
basket.setId(ERIC_IDENTITY_VALUE);
209210
BasketItem basketItem = new BasketItem();
@@ -220,5 +221,19 @@ public void failsToCreateCheckoutWhenItFailsToGetAnItem() throws Exception {
220221

221222
assertEquals(0, checkoutRepository.count());
222223
}
223-
}
224224

225+
@Test
226+
@DisplayName("Check out basket returns 403 if body is present")
227+
public void checkoutBasketReturnsBadRequestIfBodyIsPresent() throws Exception {
228+
229+
mockMvc.perform(post("/basket/checkout")
230+
.header(REQUEST_ID_HEADER_NAME, TOKEN_REQUEST_ID_VALUE)
231+
.header(ERIC_IDENTITY_HEADER_NAME, ERIC_IDENTITY_VALUE)
232+
.contentType(MediaType.APPLICATION_JSON)
233+
.content("{\"gibberish\":\"gibberish\"}"))
234+
.andExpect(status().isBadRequest());
235+
236+
assertEquals(0, checkoutRepository.count());
237+
}
238+
239+
}

src/test/java/uk/gov/companieshouse/orders/api/service/CheckoutServiceTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static org.mockito.ArgumentMatchers.any;
2020
import static org.mockito.Mockito.verify;
2121
import static org.mockito.Mockito.when;
22+
import static uk.gov.companieshouse.orders.api.util.TestConstants.ERIC_IDENTITY_VALUE;
2223

2324
@ExtendWith(MockitoExtension.class)
2425
public class CheckoutServiceTest {
@@ -42,7 +43,7 @@ void createCheckoutPopulatesCreatedAndUpdated() {
4243

4344
final LocalDateTime intervalStart = LocalDateTime.now();
4445

45-
serviceUnderTest.createCheckout(certificate);
46+
serviceUnderTest.createCheckout(certificate, ERIC_IDENTITY_VALUE);
4647
verify(checkoutRepository).save(argCaptor.capture());
4748

4849
final LocalDateTime intervalEnd = LocalDateTime.now();
@@ -56,10 +57,11 @@ void createCheckoutPopulatesAndSavesItem() {
5657
certificate.setCompanyNumber(COMPANY_NUMBER);
5758
when(checkoutRepository.save(any(Checkout.class))).thenReturn(new Checkout());
5859

59-
serviceUnderTest.createCheckout(certificate);
60+
serviceUnderTest.createCheckout(certificate, ERIC_IDENTITY_VALUE);
6061
verify(checkoutRepository).save(argCaptor.capture());
6162

6263
assertEquals(1, argCaptor.getValue().getData().getItems().size());
64+
assertEquals(ERIC_IDENTITY_VALUE, argCaptor.getValue().getUserId());
6365
assertEquals(COMPANY_NUMBER, argCaptor.getValue().getData().getItems().get(0).getCompanyNumber());
6466
}
6567

0 commit comments

Comments
 (0)