package com.zd.laboratory.base;

import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.TestInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.util.Assert;
import org.springframework.web.client.RestTemplate;

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

/**
 * 测试controller 基类
 *
 * @Author: zhoupan
 * @Date: 2021/09/08/8:39
 * @Description:
 */
//@ActiveProfiles("junittest")
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class BaseControllerTest extends AbstractTransactionalJUnit4SpringContextTests {

    protected final Logger log = LoggerFactory.getLogger(this.getClass());
    @Autowired
    public MockMvc mockMvc;


    private String bearer = "Bearer ";

    public static HttpHeaders httpHeaders = new HttpHeaders();

    /**
     * 登录
     *
     * @param username
     * @param password
     * @throws Exception
     */
    public void beforeAll(String username, String password, boolean f) throws Exception {
//mockMve 没办法指定主机地址，所以这里改成手动请求
//        MvcResult mvcResult = mockMvc
//                .perform(MockMvcRequestBuilders.get("http://localhost:8080/code"))
//                .andReturn();
        //不再重复登录
        if (!f && httpHeaders.containsKey("Authorization")) {
            return;
        }
        RestTemplate restTemplate = new RestTemplate();
        //创建请求头

        String url = "http://localhost:8080/auth/login";
        Map<String, String> map = new HashMap<>(2);
        map.put("username", username);
        map.put("password", password);
        String body = restTemplate.postForEntity(url, map, String.class).getBody();
        Map<String, Object> parse = (Map<String, Object>) JSON.parse(body);
        Assert.isTrue(parse.get("code").toString().equals("200"), "登录失败：" + parse.get("msg"));
        //拿到token
        Map<String, String> data = (Map<String, String>) JSON.parse(parse.get("data").toString());
        httpHeaders.put("Authorization", Collections.singletonList(bearer + data.get("access_token")));
        //采用模拟方式-即不走网关
        httpHeaders.put("user_id", Collections.singletonList(data.get("user_id")));
        httpHeaders.put("username", Collections.singletonList(data.get("username")));

    }

    public void beforeAll(String username, String password) throws Exception {
        beforeAll(username, password, false);

    }
}
