Skip to content

Commit

Permalink
✨ : add server-side validation for modules
Browse files Browse the repository at this point in the history
  • Loading branch information
juwit committed Aug 30, 2019
1 parent d814b76 commit 48b5969
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 4 deletions.
6 changes: 6 additions & 0 deletions src/main/java/io/codeka/gaia/modules/bo/TerraformModule.java
Expand Up @@ -4,6 +4,8 @@
import io.codeka.gaia.teams.bo.User;
import org.springframework.data.mongodb.core.mapping.DBRef;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -12,18 +14,22 @@ public class TerraformModule {

private String id;

@NotBlank
private String gitRepositoryUrl;

private String gitBranch;

private String directory;

@Valid
private List<TerraformVariable> variables = new ArrayList<>();

@NotBlank
private String name;

private String description;

@NotBlank
private String cliVersion;

@DBRef
Expand Down
@@ -1,10 +1,13 @@
package io.codeka.gaia.modules.bo;

import javax.validation.constraints.NotBlank;

/**
* Represents a module variable
*/
public class TerraformVariable {

@NotBlank
private String name;

private String description;
Expand Down
Expand Up @@ -7,6 +7,7 @@
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
Expand All @@ -23,7 +24,7 @@ public ModuleRestController(TerraformModuleRepository moduleRepository) {
this.moduleRepository = moduleRepository;
}

@GetMapping("")
@GetMapping
public List<TerraformModule> findAllModules(User user){
if(user.isAdmin()){
return moduleRepository.findAll();
Expand All @@ -41,7 +42,7 @@ public TerraformModule findModule(@PathVariable String id, User user){

@Secured("ROLE_ADMIN")
@PutMapping("/{id}")
public TerraformModule saveModule(@PathVariable String id, @RequestBody TerraformModule module){
public TerraformModule saveModule(@PathVariable String id, @RequestBody @Valid TerraformModule module){
return moduleRepository.save(module);
}

Expand Down
Expand Up @@ -96,18 +96,40 @@ void findModule_shouldReturnModulesOfOtherTeams_forAdmin() throws Exception {
void saveModule_shouldNotBeAccessible_forStandardUsers() throws Exception {
mockMvc.perform(put("/api/modules/test")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"module-test\"}"))
.content("{\"name\":\"module-test\", \"cliVersion\": \"0.12.0\", \"gitRepositoryUrl\": \"https://github.com/juwit/terraform-docker-mongo.git\"}"))
.andExpect(status().isForbidden());
}

@Test
void saveModule_shouldBeAccessible_forAdmin() throws Exception {
mockMvc.perform(put("/api/modules/test")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"module-test\"}"))
.content("{\"name\":\"module-test\", \"cliVersion\": \"0.12.0\", \"gitRepositoryUrl\": \"https://github.com/juwit/terraform-docker-mongo.git\"}"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id", notNullValue()))
.andExpect(jsonPath("$.name", is("module-test")));
}

@Test
void saveModule_shouldValidateModuleContent_forBlankFields() throws Exception {
mockMvc.perform(put("/api/modules/stacks")
.contentType(MediaType.APPLICATION_JSON)
// empty module
.content("{}"))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message", containsString("name must not be blank")))
.andExpect(jsonPath("$.message", containsString("cliVersion must not be blank")))
.andExpect(jsonPath("$.message", containsString("gitRepositoryUrl must not be blank")));
}

@Test
void saveModule_shouldValidateModuleVariables_forBlankFields() throws Exception {
mockMvc.perform(put("/api/modules/stacks")
.contentType(MediaType.APPLICATION_JSON)
// empty variable name
.content("{\"variables\":[{\"name\":\" \"}]}"))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message", containsString("variables[0].name must not be blank")));
}

}

0 comments on commit 48b5969

Please sign in to comment.