package de.ozgcloud.admin;

import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.info.BuildProperties;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import lombok.SneakyThrows;

@ExtendWith(MockitoExtension.class)
class RootControllerTest {

	@Spy
	@InjectMocks
	private RootController rootController;

	@Mock
	private BuildProperties buildProperties;

	private MockMvc mockMvc;

	@BeforeEach
	void mock() {
		mockMvc = MockMvcBuilders.standaloneSetup(rootController).build();
	}

	@DisplayName("Root")
	@Nested
	class TestInfo {

		@Test
		@SneakyThrows
		void shouldHaveJavaVersion() {
			System.setProperty("java.version", RootTestFactory.JAVA_VERSION);

			ResultActions result = doRequest();

			result.andExpect(jsonPath("$.javaVersion").value(RootTestFactory.JAVA_VERSION));
		}

		@Test
		@SneakyThrows
		void shouldHaveVersion() {
			when(buildProperties.getVersion()).thenReturn(RootTestFactory.BUILD_VERSION);

			ResultActions result = doRequest();

			result.andExpect(jsonPath("$.buildVersion").value(RootTestFactory.BUILD_VERSION));
		}

		@Test
		@SneakyThrows
		void shouldHaveBuildTime() {
			when(buildProperties.getTime()).thenReturn(RootTestFactory.BUILD_TIME);

			ResultActions result = doRequest();

			result.andExpect(jsonPath("$.buildTime").value(RootTestFactory.BUILD_TIME.getEpochSecond()));
		}

		@Test
		@SneakyThrows
		void shouldHaveBuildNumber() {
			when(buildProperties.get("number")).thenReturn(RootTestFactory.BUILD_NUMBER);

			ResultActions result = doRequest();

			result.andExpect(jsonPath("$.buildNumber").value(RootTestFactory.BUILD_NUMBER));
		}

		@SneakyThrows
		private ResultActions doRequest() {
			return mockMvc.perform(get(RootController.PATH)).andExpect(status().isOk());
		}

	}

}