package de.rwth.swc.sqa;


import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;

import java.util.HashMap;
import java.util.Map;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;

import io.restassured.RestAssured;

@SpringBootTest(webEnvironment = RANDOM_PORT)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class TicketTest {

    @LocalServerPort
    int serverPort;

    @BeforeEach
    public void setup() {
        RestAssured.port = serverPort;
    }


    @Test
    @Order(1)
    public void buyTicketTest() {
    	 //400//no birthdate
        Map<String, Object> parms1 = new HashMap<String, Object>();
        parms1.put("validFor", "1h");//
        parms1.put("zone", "A");
        parms1.put("student", true);
        parms1.put("discountCard", true);
        parms1.put("disabled", true);
        parms1.put("validFrom", "2022-05-20 10:00:00");
        RestAssured.given().header("content-Type", "application/json").and()
        .body(parms1).when().post("/tickets").then().statusCode(400);
        
    	//200
        parms1.clear();
        parms1.put("birthdate", "1992-01-01");
        parms1.put("validFor", "1d");
        parms1.put("zone", "A");
        parms1.put("student", true);
        parms1.put("discountCard", true);
        parms1.put("disabled", true);
        parms1.put("validFrom", "2022-05-20 10:00:00");
        RestAssured.given().header("content-Type", "application/json").and()
        .body(parms1).when().post("/tickets").then().statusCode(200);
        
        parms1.clear();
        parms1.put("birthdate", "1992-01-01");
        parms1.put("validFor", "30d");
        parms1.put("zone", "A");
        parms1.put("student", true);
        parms1.put("discountCard", true);
        parms1.put("disabled", true);
        parms1.put("validFrom", "2022-05-20 10:00:00");
        RestAssured.given().header("content-Type", "application/json").and()
        .body(parms1).when().post("/tickets").then().statusCode(200);
        
       

    }

    @Test
    @Order(2)
    public void validateTicketTest() {
    	String path = "/tickets/validate";
    	Long ticketId =0L;
    	Map<String, Object> parms = new HashMap<String, Object>();
        //400 //格式不对,缺少必要信息
    	parms.clear();
    	parms.put("ticketId", ticketId);
        RestAssured.given().header("content-Type", "application/json").and()
        .body(parms).when().post(path).then().statusCode(400);
    	
      //403 //ticketid不对
    	parms.clear();
    	parms.put("ticketId", ticketId);
    	parms.put("birthdate", "1992-01-01");
    	parms.put("zone", "A");
    	parms.put("student", true);
    	parms.put("disabled", true);
    	parms.put("date", "2022-05-22 10:00:00");
        RestAssured.given().header("content-Type", "application/json").and()
        .body(parms).when().post(path).then().statusCode(403);
        
    	//403//时间过期
        ticketId = DataService.ticketList.get(0).getId();
        parms.clear();
    	parms.put("ticketId", ticketId);
    	parms.put("birthdate", "1992-01-01");
    	parms.put("zone", "A");
    	parms.put("student", true);
    	parms.put("disabled", true);
    	parms.put("date", "2022-05-22 10:00:00");
        RestAssured.given().header("content-Type", "application/json").and()
        .body(parms).when().post(path).then().statusCode(403);
        
        
      //200//信息一致,且有效期内
        ticketId = DataService.ticketList.get(0).getId();
        parms.clear();
    	parms.put("ticketId", ticketId);
    	parms.put("birthdate", "1992-01-01");
    	parms.put("zone", "A");
    	parms.put("student", true);
    	parms.put("disabled", true);
    	parms.put("date", "2022-05-20 12:00:00");
        RestAssured.given().header("content-Type", "application/json").and()
        .body(parms).when().post(path).then().statusCode(200);
        


    }

}