package com.pingcap.community.blogserver.acl;

import static com.pingcap.community.blogserver.testutils.RequestPostProcessors.user;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;

import javax.servlet.http.Cookie;
import org.junit.jupiter.api.Test;
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.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.web.servlet.MockMvc;

@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class AclTest {

  @Autowired private MockMvc mockMvc;

  @Test
  void testAclResource() throws Exception {
    mockMvc
        .perform(get("/api/demo/1").cookie(new Cookie("dev_sid", "0")).with(user("name1")))
        .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(200));
    mockMvc
        .perform(get("/api/demo/1").cookie(new Cookie("dev_sid", "0")).with(user("name2")))
        .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(403));
  }

  @Test
  void testAclCollection() throws Exception {
    mockMvc
        .perform(
            post("/api/demo")
                .cookie(new Cookie("dev_sid", "0"))
                .content("{\"id\": \"3\", \"name\": \"?\"}")
                .with(user("POST")))
        .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(201));
    mockMvc
        .perform(
            post("/api/demo")
                .cookie(new Cookie("dev_sid", "0"))
                .content("{\"id\": \"3\", \"name\": \"?\"}")
                .with(user("GET")))
        .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(403));
  }
}
