diff --git a/src/main/java/au/com/telstra/simcardactivator/ActuateServiceApplication.java b/src/main/java/au/com/telstra/simcardactivator/ActuateServiceApplication.java new file mode 100644 index 00000000..6bf46e67 --- /dev/null +++ b/src/main/java/au/com/telstra/simcardactivator/ActuateServiceApplication.java @@ -0,0 +1,12 @@ +package au.com.telstra.simcardactivator; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ActuateServiceApplication { + public static void main(String[] args){ + SpringApplication.run(ActuateServiceApplication.class, args); + } + +} diff --git a/src/main/java/au/com/telstra/simcardactivator/Config/AppConfig.java b/src/main/java/au/com/telstra/simcardactivator/Config/AppConfig.java new file mode 100644 index 00000000..94b4ef79 --- /dev/null +++ b/src/main/java/au/com/telstra/simcardactivator/Config/AppConfig.java @@ -0,0 +1,14 @@ +package au.com.telstra.simcardactivator.Config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class AppConfig { + + @Bean + public RestTemplate restTemplate(){ + return new RestTemplate(); + } +} diff --git a/src/main/java/au/com/telstra/simcardactivator/Controller/ActuateController.java b/src/main/java/au/com/telstra/simcardactivator/Controller/ActuateController.java new file mode 100644 index 00000000..3cf67c83 --- /dev/null +++ b/src/main/java/au/com/telstra/simcardactivator/Controller/ActuateController.java @@ -0,0 +1,50 @@ +package au.com.telstra.simcardactivator.Controller; + + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/actuate") +public class ActuateController { + +// @Autowired +// private IccidRepository iccidRepository; +// +// @Autowired +// private Iccid iccid; + + + @PostMapping + public ResponseEntity> handleActuateRequest(@RequestBody Map iccidData) { + String iccidString = iccidData.get("iccid"); + + boolean success = iccidString != null && !iccidString.isEmpty(); +// boolean success; +// if (iccidString != null && !iccidString.isEmpty()){ +// success = true; +// } else { +// success = false; +// } + HttpStatus status = success ? HttpStatus.OK : HttpStatus.BAD_REQUEST; + + + // new code for task 2 +// if (success){ +// iccid.setIccid(iccidString); +// iccidRepository.save(iccid); +// } + + return new ResponseEntity<>(Map.of("success", success), status); + + + } +} + diff --git a/src/main/java/au/com/telstra/simcardactivator/Controller/IccidController.java b/src/main/java/au/com/telstra/simcardactivator/Controller/IccidController.java new file mode 100644 index 00000000..95556848 --- /dev/null +++ b/src/main/java/au/com/telstra/simcardactivator/Controller/IccidController.java @@ -0,0 +1,92 @@ +package au.com.telstra.simcardactivator.Controller; + +import au.com.telstra.simcardactivator.Model.Iccid; +import au.com.telstra.simcardactivator.Repository.IccidRepository; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@RestController +@RequestMapping() +public class IccidController { + @Autowired + IccidRepository iccidRepository; + + + @Autowired + RestTemplate restTemplate; + + + @PostMapping("activate") + public ResponseEntity postToOtherService(@RequestBody Iccid iccid) { + final String url = "http://localhost:8444/actuate"; + + final String iccid_new = iccid.getIccid(); + + System.out.println(iccid_new+ " : iccid_new"); + + if (iccid_new == null || iccid_new.isEmpty()){ + return ResponseEntity.badRequest().body("ICCID cannot be null or empty"); + } +// System.out.println(iccid_new instanceof String); + + Map iccidData = new HashMap<>(); + iccidData.put("iccid", iccid_new); +// System.out.println(iccidData.getClass() + " : get class"); +// System.out.println(iccidData.values()); +// System.out.println((iccidData)); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(iccidData, headers); + try { + ResponseEntity response = restTemplate.postForEntity(url, requestEntity, String.class); + + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.readTree(response.getBody()); + + boolean success = jsonNode.get("success").asBoolean(); + iccid.setActive(success); + +// System.out.println(response.getBody()); +// System.out.println(iccid.getId()); +// System.out.println(iccid.getIccid()); +// System.out.println(iccid.getCustomerEmail()); +// System.out.println(iccid.isActive()); + iccidRepository.save(iccid); + return response; + } catch (ResourceAccessException e) { + return new ResponseEntity<>("Could not connect to the external service", HttpStatus.SERVICE_UNAVAILABLE); + } catch (Exception e) { + return new ResponseEntity<>("An unexpected error occurred", HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + // new code for task 2 + @GetMapping("query/{id}") + public ResponseEntity getIccid(@PathVariable Long id){ + Optional iccid = iccidRepository.findById(id); + return iccid.map(ResponseEntity::ok) + .orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND)); +// return iccidRepository.findById(id); + } + + @GetMapping("query") + public List getAllIccid(){ + return iccidRepository.findAll(); + } + + + + +} diff --git a/src/main/java/au/com/telstra/simcardactivator/Model/Iccid.java b/src/main/java/au/com/telstra/simcardactivator/Model/Iccid.java new file mode 100644 index 00000000..7d37b409 --- /dev/null +++ b/src/main/java/au/com/telstra/simcardactivator/Model/Iccid.java @@ -0,0 +1,53 @@ +package au.com.telstra.simcardactivator.Model; + +import org.springframework.stereotype.Component; + +import javax.persistence.*; + +//@Component +@Entity +public class Iccid { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(unique = true) + private String iccid; + + private String customerEmail; + + private boolean active; + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getIccid() { + return iccid; + } + + public void setIccid(String iccid) { + this.iccid = iccid; + } + + public String getCustomerEmail() { + return customerEmail; + } + + public void setCustomerEmail(String customerEmail) { + this.customerEmail = customerEmail; + } +} diff --git a/src/main/java/au/com/telstra/simcardactivator/Repository/IccidRepository.java b/src/main/java/au/com/telstra/simcardactivator/Repository/IccidRepository.java new file mode 100644 index 00000000..bda5c11e --- /dev/null +++ b/src/main/java/au/com/telstra/simcardactivator/Repository/IccidRepository.java @@ -0,0 +1,12 @@ +package au.com.telstra.simcardactivator.Repository; + +import au.com.telstra.simcardactivator.Model.Iccid; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface IccidRepository extends JpaRepository { + Optional findByIccid(String iccid); +} diff --git a/src/main/java/au/com/telstra/simcardactivator/SimCardActivator.java b/src/main/java/au/com/telstra/simcardactivator/SimCardActivator.java index e5363ec3..9106e104 100644 --- a/src/main/java/au/com/telstra/simcardactivator/SimCardActivator.java +++ b/src/main/java/au/com/telstra/simcardactivator/SimCardActivator.java @@ -2,12 +2,20 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class SimCardActivator { - public static void main(String[] args) { - SpringApplication.run(SimCardActivator.class, args); +// public static void main(String[] args) { +// SpringApplication.run(SimCardActivator.class, args); +// } + + public static void main(String[] args){ + ConfigurableApplicationContext iccidContext = SpringApplication.run(SimCardActivator.class, "--spring.config.name=application-simcardactivator"); + + ConfigurableApplicationContext actuateContext = SpringApplication.run(ActuateServiceApplication.class, "--spring.config.name= application-actuate"); } + } diff --git a/src/main/resources/application-actuate.properties b/src/main/resources/application-actuate.properties new file mode 100644 index 00000000..e465acc4 --- /dev/null +++ b/src/main/resources/application-actuate.properties @@ -0,0 +1,8 @@ +server.port = 8444 +spring.application.name = ActuateService + +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect diff --git a/src/main/resources/application-simcardactivator.properties b/src/main/resources/application-simcardactivator.properties new file mode 100644 index 00000000..b2d53eda --- /dev/null +++ b/src/main/resources/application-simcardactivator.properties @@ -0,0 +1,2 @@ +server.port = 8080 +spring.application.name = SimCardActivator \ No newline at end of file diff --git a/src/test/java/stepDefinitions/RunCucumberTest.java b/src/test/java/stepDefinitions/RunCucumberTest.java new file mode 100644 index 00000000..30f73819 --- /dev/null +++ b/src/test/java/stepDefinitions/RunCucumberTest.java @@ -0,0 +1,18 @@ +package stepDefinitions;//public class stepDefinitions.RunCucumberTest { +//} + +import org.junit.Test; +import org.junit.runner.RunWith; +import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; + +@RunWith(Cucumber.class) +@CucumberOptions( + features = "src/test/resources/features/sim_card_activator.feature", + glue = "stepDefinitions", +// plugin = {"pretty", "html:target/cucumber-reports"} + plugin = {"pretty", "json:target/cucumber-report.json"} +) +public class RunCucumberTest { + +} diff --git a/src/test/java/stepDefinitions/SimCardActivatorStepDefinitions.java b/src/test/java/stepDefinitions/SimCardActivatorStepDefinitions.java index eaa796f9..415a64a9 100644 --- a/src/test/java/stepDefinitions/SimCardActivatorStepDefinitions.java +++ b/src/test/java/stepDefinitions/SimCardActivatorStepDefinitions.java @@ -1,6 +1,9 @@ package stepDefinitions; import au.com.telstra.simcardactivator.SimCardActivator; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import io.cucumber.spring.CucumberContextConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootContextLoader; @@ -8,11 +11,52 @@ import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.test.context.ContextConfiguration; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + @CucumberContextConfiguration -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @ContextConfiguration(classes = SimCardActivator.class, loader = SpringBootContextLoader.class) public class SimCardActivatorStepDefinitions { + @Autowired private TestRestTemplate restTemplate; -} \ No newline at end of file + public static String iccidNumber(String iccidString){ + return "1255789453849037777".equals(iccidString) ? "activated" : "not activated"; + } + + private String iccid; + private String actualAnswer; + + + @Given("Iccid is {string}") + public void iccid_is(String iccid) { + this.iccid = iccid; + } + + @When("I check the activation status of {string}") + public void i_check_the_activation_status_of(String iccid) { + // Fetch ID from the database uing the ICCID + actualAnswer = checkIccidActivation(iccid); + } + + + @Then("I should be told {string}") + public void i_should_be_told(String expectedAnswer){ + assertThat(actualAnswer).isEqualTo(expectedAnswer); + } + + // Method to check the ICCID status based on the business logic + private String checkIccidActivation(String iccidString) { + // Check the ICCID against the expected values + if ("1255789453849037777".equals(iccidString)) { + return "activated"; + } else { + return "not activated"; + } + } + + +} + diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties new file mode 100644 index 00000000..bafddced --- /dev/null +++ b/src/test/resources/application.properties @@ -0,0 +1 @@ +server.port=8081 \ No newline at end of file diff --git a/src/test/resources/features/sim_card_activator.feature b/src/test/resources/features/sim_card_activator.feature index e69de29b..4fb1e5f7 100644 --- a/src/test/resources/features/sim_card_activator.feature +++ b/src/test/resources/features/sim_card_activator.feature @@ -0,0 +1,23 @@ +Feature: Is it activated or not? + Checking whether it is activated or not + +# Scenario: Activation +# Given Iccid is 1255789453849037777 +# When I ask the iccid number +# Then I should be told "activated" +# +# Scenario: Not Activation +# Given Iccid is 8944500102198304826 +# When I ask the iccid number +# Then I should be told "not activated" + + Scenario Outline: Iccid activated or not + Given Iccid is "" + When I check the activation status of "" + Then I should be told "" + + Examples: + | iccid | answer | + | 1255789453849037777 | activated | + | 8944500102198304826 | not activated | + | 0000000000000000000 | not activated | \ No newline at end of file