Skip to content

Commit

Permalink
Merge pull request #74 from companieshouse/lp-457-handle-jurisdiction
Browse files Browse the repository at this point in the history
LP-457 Handle the new Jurisdiction field
  • Loading branch information
mwestacott authored Feb 4, 2025
2 parents 2a68a5e + 0b9b759 commit 8459af5
Show file tree
Hide file tree
Showing 14 changed files with 260 additions and 50 deletions.
31 changes: 12 additions & 19 deletions spec/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/LimitedPartnershipSubmissionUpdate"
"$ref": "#/definitions/PartnershipData"
}
}
],
Expand All @@ -225,7 +225,7 @@
}
}
},
"/transactions/{transaction_id}/limited-partnership/limited-partner" : {
"/transactions/{transaction_id}/limited-partnership/limited-partner": {
"post": {
"tags": [
"Limited Partner"
Expand Down Expand Up @@ -284,7 +284,7 @@
}
},
"definitions": {
"Data": {
"PartnershipData": {
"type": "object",
"properties": {
"partnership_name": {
Expand All @@ -309,6 +309,14 @@
"SLP",
"SPFLP"
]
},
"jurisdiction": {
"type": "string",
"enum": [
"England and Wales",
"Northern Ireland",
"Scotland"
]
}
}
},
Expand Down Expand Up @@ -355,22 +363,7 @@
],
"properties": {
"data": {
"$ref": "#/definitions/Data"
}
}
},
"LimitedPartnershipSubmissionUpdate": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"type": {
"type": "string"
},
"data": {
"type": "object"
"$ref": "#/definitions/PartnershipData"
}
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
@SpringBootApplication
public class LimitedPartnershipsApiApplication {
public static final String APP_NAMESPACE = "limited-partnerships-api";

public static void main(String[] args) {
ApiLogger.debug("Starting Limited Partnerships API");
SpringApplication.run(LimitedPartnershipsApiApplication.class, args);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import org.springframework.stereotype.Component;
import uk.gov.companieshouse.limitedpartnershipsapi.model.Jurisdiction;
import uk.gov.companieshouse.limitedpartnershipsapi.model.PartnershipNameEnding;
import uk.gov.companieshouse.limitedpartnershipsapi.model.dao.LimitedPartnershipSubmissionDao;
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
Expand All @@ -11,18 +12,25 @@
@Mapper(componentModel = "spring")
public interface LimitedPartnershipMapper {

LimitedPartnershipMapper INSTANCE = Mappers.getMapper(LimitedPartnershipMapper.class);
LimitedPartnershipMapper INSTANCE = Mappers.getMapper(LimitedPartnershipMapper.class);

LimitedPartnershipSubmissionDao dtoToDao(LimitedPartnershipSubmissionDto dto);
LimitedPartnershipSubmissionDao dtoToDao(LimitedPartnershipSubmissionDto dto);

LimitedPartnershipSubmissionDto daoToDto(LimitedPartnershipSubmissionDao dao);
LimitedPartnershipSubmissionDto daoToDto(LimitedPartnershipSubmissionDao dao);

default String mapPartnershipNameEndingToString(PartnershipNameEnding nameEnding){
return nameEnding.getDescription();
}
default String mapPartnershipNameEndingToString(PartnershipNameEnding nameEnding) {
return nameEnding.getDescription();
}

default PartnershipNameEnding mapPartnershipNameEndingToEnum(String nameEnding){
return nameEnding != null ? PartnershipNameEnding.fromDescription(nameEnding) : null;
}
default PartnershipNameEnding mapPartnershipNameEndingToEnum(String nameEnding) {
return nameEnding != null ? PartnershipNameEnding.fromDescription(nameEnding) : null;
}

default String mapJurisdictionToString(Jurisdiction jurisdiction) {
return jurisdiction.getDescription();
}

default Jurisdiction mapJurisdictionToEnum(String jurisdiction) {
return jurisdiction != null ? Jurisdiction.fromDescription(jurisdiction) : null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package uk.gov.companieshouse.limitedpartnershipsapi.model;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;

public enum Jurisdiction {
ENGLAND_AND_WALES("England and Wales"),
NORTHERN_IRELAND("Northern Ireland"),
SCOTLAND("Scotland"),
@JsonEnumDefaultValue
UNKNOWN("Unknown");

private final String description;

Jurisdiction(String description) {
this.description = description;
}

public String getDescription() {
return description;
}

@JsonCreator
public static Jurisdiction fromDescription(String description) {
for (Jurisdiction jurisdiction : Jurisdiction.values()) {
if (jurisdiction.getDescription().equalsIgnoreCase(description)) {
return jurisdiction;
}
}

return Jurisdiction.UNKNOWN;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ public class DataDao {
@Field("partnership_type")
private PartnershipType partnershipType;

@Field("jurisdiction")
private String jurisdiction;


public String getPartnershipName() {
return partnershipName;
}
Expand Down Expand Up @@ -48,4 +52,12 @@ public PartnershipType getPartnershipType() {
public void setPartnershipType(PartnershipType partnershipType) {
this.partnershipType = partnershipType;
}

public String getJurisdiction() {
return jurisdiction;
}

public void setJurisdiction(String jurisdiction) {
this.jurisdiction = jurisdiction;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Size;
import uk.gov.companieshouse.limitedpartnershipsapi.model.Jurisdiction;
import uk.gov.companieshouse.limitedpartnershipsapi.model.PartnershipNameEnding;
import uk.gov.companieshouse.limitedpartnershipsapi.model.PartnershipType;
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.validator.NameSize;
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.validator.ValidJurisdiction;

import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;

Expand Down Expand Up @@ -35,6 +37,12 @@ public class DataDto {
@JsonProperty("partnership_type")
private PartnershipType partnershipType;

@JsonInclude(NON_NULL)
@JsonProperty("jurisdiction")
@ValidJurisdiction
private Jurisdiction jurisdiction;


public String getPartnershipName() {
return partnershipName;
}
Expand Down Expand Up @@ -66,4 +74,12 @@ public PartnershipType getPartnershipType() {
public void setPartnershipType(PartnershipType partnershipType) {
this.partnershipType = partnershipType;
}

public String getJurisdiction() {
return jurisdiction != null ? jurisdiction.getDescription() : null;
}

public void setJurisdiction(Jurisdiction jurisdiction) {
this.jurisdiction = jurisdiction;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Size;
import uk.gov.companieshouse.limitedpartnershipsapi.model.Jurisdiction;
import uk.gov.companieshouse.limitedpartnershipsapi.model.PartnershipNameEnding;
import uk.gov.companieshouse.limitedpartnershipsapi.model.PartnershipType;
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.validator.NameSize;
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.validator.ValidJurisdiction;

@NameSize
public class LimitedPartnershipPatchDto {
Expand All @@ -24,6 +26,11 @@ public class LimitedPartnershipPatchDto {
@JsonProperty("partnership_type")
private PartnershipType partnershipType;

@JsonProperty("jurisdiction")
@ValidJurisdiction
private Jurisdiction jurisdiction;


public String getPartnershipName() {
return partnershipName;
}
Expand Down Expand Up @@ -55,4 +62,12 @@ public PartnershipType getPartnershipType() {
public void setPartnershipType(PartnershipType partnershipType) {
this.partnershipType = partnershipType;
}

public Jurisdiction getJurisdiction() {
return jurisdiction;
}

public void setJurisdiction(Jurisdiction jurisdiction) {
this.jurisdiction = jurisdiction;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package uk.gov.companieshouse.limitedpartnershipsapi.model.dto.validator;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import uk.gov.companieshouse.limitedpartnershipsapi.model.Jurisdiction;

import static uk.gov.companieshouse.limitedpartnershipsapi.model.Jurisdiction.UNKNOWN;

public class JurisdictionValidator implements ConstraintValidator<ValidJurisdiction, Jurisdiction> {
public boolean isValid(Jurisdiction jurisdiction, ConstraintValidatorContext context) {
if (jurisdiction == null) {
return true;
}

return !UNKNOWN.equals(jurisdiction);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package uk.gov.companieshouse.limitedpartnershipsapi.model.dto.validator;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = JurisdictionValidator.class)
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidJurisdiction {
String message() default "Jurisdiction must be valid";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
Expand All @@ -25,14 +27,18 @@

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {PartnershipController.class})
@WebMvcTest(controllers = {PartnershipController.class})
class PartnershipControllerValidationTest {

private static final String JSON_WITH_VALID_EMAIL_ADDRESS = "{\"email\":\"test@email.com\"}";
private static final String JSON_WITH_VALID_PARTNERSHIP_NAME = "{\"partnership_name\":\"Correct name size\",\"name_ending\":\"Limited Partnership\"}";
private static final String JSON_WITH_VALID_JURISDICTION = "{\"jurisdiction\":\"Scotland\"}";
private static final String JSON_WITH_VALID_NULL_JURISDICTION = "{\"jurisdiction\":null}";

private HttpHeaders httpHeaders;
private Transaction transaction;

Expand Down Expand Up @@ -110,17 +116,23 @@ void testCreatePartnershipShouldReturnBadRequestErrorIfPartnershipNameIsLessThan
.andExpect(status().isBadRequest());
}

@Test
void testUpdatePartnershipShouldReturn200() throws Exception {
String body = "{\"email\":\"test@email.com\"}";
@ParameterizedTest
@ValueSource(strings = {
JSON_WITH_VALID_EMAIL_ADDRESS,
JSON_WITH_VALID_PARTNERSHIP_NAME,
JSON_WITH_VALID_JURISDICTION,
JSON_WITH_VALID_NULL_JURISDICTION
})
void testUpdatePartnershipShouldReturn200(String body) throws Exception {

mockMvc.perform(patch("/transactions/863851-951242-143528/limited-partnership/partnership/93702824-9062-4c63-a694-716acffccdd5")
.contentType(MediaType.APPLICATION_JSON)
.characterEncoding("utf-8")
.headers(httpHeaders)
.requestAttr("transaction", transaction)
.content(body))
.andDo(print())
// Uncomment the following line and also use in other tests if wishing to debug responses and behaviour
// .andDo(print())
.andExpect(status().isOk());
}

Expand All @@ -134,36 +146,33 @@ void testUpdatePartnershipShouldReturnBadRequestErrorIfEmailBadlyFormated() thro
.headers(httpHeaders)
.requestAttr("transaction", transaction)
.content(body))
.andDo(print())
.andExpect(status().isBadRequest());
}

@Test
void testUpdatePartnershipShouldReturn200IfNameSizeIsCorrect() throws Exception {
String body = "{\"partnership_name\":\"Correct name size\",\"name_ending\":\"Limited Partnership\"}";
void testUpdatePartnershipShouldReturnBadRequestErrorIfNameSizeIsTooLong() throws Exception {
String longName = StringUtils.repeat("A", 160);
String body = "{\"partnership_name\":\"" + longName + "\",\"name_ending\":\"Limited Partnership\"}";

mockMvc.perform(patch("/transactions/863851-951242-143528/limited-partnership/partnership/93702824-9062-4c63-a694-716acffccdd5")
.contentType(MediaType.APPLICATION_JSON)
.characterEncoding("utf-8")
.headers(httpHeaders)
.requestAttr("transaction", transaction)
.content(body))
.andDo(print())
.andExpect(status().isOk());
.andExpect(status().isBadRequest());
}

@Test
void testUpdatePartnershipShouldReturnBadRequestErrorIfNameSizeIsTooLong() throws Exception {
String longName = StringUtils.repeat("A", 160);
String body = "{\"partnership_name\":\"" + longName + "\",\"name_ending\":\"Limited Partnership\"}";
void testUpdatePartnershipWithAnInvalidJurisdictionShouldReturn400() throws Exception {
String body = "{\"jurisdiction\":\"Croatia\"}";

mockMvc.perform(patch("/transactions/863851-951242-143528/limited-partnership/partnership/93702824-9062-4c63-a694-716acffccdd5")
.contentType(MediaType.APPLICATION_JSON)
.characterEncoding("utf-8")
.headers(httpHeaders)
.requestAttr("transaction", transaction)
.content(body))
.andDo(print())
.andExpect(status().isBadRequest());
}
}
Loading

0 comments on commit 8459af5

Please sign in to comment.