diff --git a/src/main/java/edu/tamu/app/model/AbstractIdea.java b/src/main/java/edu/tamu/app/model/AbstractIdea.java index 2e3a97b..1f38eaf 100644 --- a/src/main/java/edu/tamu/app/model/AbstractIdea.java +++ b/src/main/java/edu/tamu/app/model/AbstractIdea.java @@ -38,7 +38,6 @@ public abstract class AbstractIdea extends ValidatingBaseEntity { public AbstractIdea() { super(); - this.modelValidator = new IdeaValidator(); } public AbstractIdea(String title, String description) { diff --git a/src/main/java/edu/tamu/app/model/FeatureProposal.java b/src/main/java/edu/tamu/app/model/FeatureProposal.java index 6fd9169..cb1bece 100644 --- a/src/main/java/edu/tamu/app/model/FeatureProposal.java +++ b/src/main/java/edu/tamu/app/model/FeatureProposal.java @@ -4,6 +4,7 @@ import static org.hibernate.annotations.FetchMode.SELECT; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import javax.persistence.CascadeType; @@ -20,6 +21,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import edu.tamu.app.model.validation.FeatureProposalValidator; + @Entity @JsonIgnoreProperties(value = { "voters" }, allowGetters = true) public class FeatureProposal extends AbstractIdea { @@ -41,6 +44,7 @@ public class FeatureProposal extends AbstractIdea { public FeatureProposal() { super(); + this.modelValidator = new FeatureProposalValidator(); setup(); } @@ -79,15 +83,20 @@ public void setIdeas(List ideas) { this.ideas.forEach(idea -> { removeVoter(idea.getAuthor()); }); - this.ideas = ideas; + HashSet ideaSet = new HashSet(); + ideaSet.addAll(ideas); + this.ideas.clear(); + this.ideas.addAll(ideaSet); this.ideas.forEach(idea -> { addVoter(idea.getAuthor()); }); } public void addIdea(Idea idea) { - this.ideas.add(idea); - addVoter(idea.getAuthor()); + if (!this.ideas.contains(idea)) { + this.ideas.add(idea); + addVoter(idea.getAuthor()); + } } public void removeIdea(Idea idea) { diff --git a/src/main/java/edu/tamu/app/model/Idea.java b/src/main/java/edu/tamu/app/model/Idea.java index 066c896..fa8e98c 100644 --- a/src/main/java/edu/tamu/app/model/Idea.java +++ b/src/main/java/edu/tamu/app/model/Idea.java @@ -4,6 +4,7 @@ import javax.persistence.Entity; import edu.tamu.app.model.request.ServiceRequest; +import edu.tamu.app.model.validation.IdeaValidator; @Entity public class Idea extends AbstractIdea { @@ -13,6 +14,7 @@ public class Idea extends AbstractIdea { public Idea() { super(); + this.modelValidator = new IdeaValidator(); this.elevated = false; } diff --git a/src/main/java/edu/tamu/app/model/validation/FeatureProposalValidator.java b/src/main/java/edu/tamu/app/model/validation/FeatureProposalValidator.java new file mode 100644 index 0000000..c612f4b --- /dev/null +++ b/src/main/java/edu/tamu/app/model/validation/FeatureProposalValidator.java @@ -0,0 +1,16 @@ +package edu.tamu.app.model.validation; + +import edu.tamu.weaver.validation.model.InputValidationType; +import edu.tamu.weaver.validation.validators.BaseModelValidator; +import edu.tamu.weaver.validation.validators.InputValidator; + +public class FeatureProposalValidator extends BaseModelValidator { + + public FeatureProposalValidator() { + String titleProperty = "title"; + this.addInputValidator(new InputValidator(InputValidationType.required, "Feature Proposals require a title", titleProperty, true)); + + String serviceProperty = "service"; + this.addInputValidator(new InputValidator(InputValidationType.required, "Feature Proposals require a Service", serviceProperty, true)); + } +} diff --git a/src/main/java/edu/tamu/app/model/validation/IdeaValidator.java b/src/main/java/edu/tamu/app/model/validation/IdeaValidator.java index d0e786a..2e741ba 100644 --- a/src/main/java/edu/tamu/app/model/validation/IdeaValidator.java +++ b/src/main/java/edu/tamu/app/model/validation/IdeaValidator.java @@ -1,11 +1,17 @@ package edu.tamu.app.model.validation; +import edu.tamu.weaver.validation.model.InputValidationType; import edu.tamu.weaver.validation.validators.BaseModelValidator; +import edu.tamu.weaver.validation.validators.InputValidator; public class IdeaValidator extends BaseModelValidator { public IdeaValidator() { - + String titleProperty = "title"; + this.addInputValidator(new InputValidator(InputValidationType.required, "Ideas require a title", titleProperty, true)); + + String serviceProperty = "service"; + this.addInputValidator(new InputValidator(InputValidationType.required, "Ideas require a Service", serviceProperty, true)); } } diff --git a/src/test/java/edu/tamu/app/model/FeatureProposalTest.java b/src/test/java/edu/tamu/app/model/FeatureProposalTest.java index b86b3df..d9315b3 100644 --- a/src/test/java/edu/tamu/app/model/FeatureProposalTest.java +++ b/src/test/java/edu/tamu/app/model/FeatureProposalTest.java @@ -146,14 +146,16 @@ public void testElevateIdea() throws UserNotFoundException { assertEquals("The number of FeatureProposals did not increase by one", initialCount + 1, featureProposalRepo.count()); } - @Test(expected = InvalidDataAccessApiUsageException.class) + @Test public void testDuplicateIdea() throws UserNotFoundException { long initialCount = featureProposalRepo.count(); Idea testIdea = ideaRepo.create(new Idea(TEST_ALTERNATIVE_FEATURE_PROPOSAL_TITLE, TEST_ALTERNATIVE_FEATURE_PROPOSAL_DESCRIPTION, testUser, service1), TEST_CREDENTIALS); FeatureProposal featureProposal = featureProposalRepo.create(testIdea); assertEquals("The number of FeatureProposals did not increase by one", initialCount + 1, featureProposalRepo.count()); + long ideaCount = featureProposal.getIdeas().size(); featureProposal.addIdea(testIdea); featureProposalRepo.save(featureProposal); + assertEquals("The number of Ideas on the FeatureProposal did not increase", ideaCount, featureProposal.getIdeas().size()); } @Test(expected = DataIntegrityViolationException.class)