/*
 * Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch das Ministerium für Energiewende, Klimaschutz, Umwelt und Natur
 * Zentrales IT-Management
 *
 * Lizenziert unter der EUPL, Version 1.2 oder - sobald
 * diese von der Europäischen Kommission genehmigt wurden -
 * Folgeversionen der EUPL ("Lizenz");
 * Sie dürfen dieses Werk ausschließlich gemäß
 * dieser Lizenz nutzen.
 * Eine Kopie der Lizenz finden Sie hier:
 *
 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
 *
 * Sofern nicht durch anwendbare Rechtsvorschriften
 * gefordert oder in schriftlicher Form vereinbart, wird
 * die unter der Lizenz verbreitete Software "so wie sie
 * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
 * ausdrücklich oder stillschweigend - verbreitet.
 * Die sprachspezifischen Genehmigungen und Beschränkungen
 * unter der Lizenz sind dem Lizenztext zu entnehmen.
 */
package de.ozgcloud.admin;

import static org.junit.jupiter.api.Assertions.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.rest.RepositoryRestProperties;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;

import de.ozgcloud.admin.common.user.UserRole;
import de.ozgcloud.common.test.ITCase;
import lombok.SneakyThrows;

@ITCase
@AutoConfigureMockMvc
@WithMockUser(roles = UserRole.ADMIN_ADMIN)
class ConfigurationApiITCase {

	@Autowired
	private RepositoryRestProperties restProperties;

	@Autowired
	private MockMvc mockMvc;

	@Nested
	class TestConfigurationRestEndpoint {

		@Test
		void shouldBetSetToApi() {
			var basePath = restProperties.getBasePath();

			assertEquals("/api/configuration", basePath);
		}

		@Test
		@SneakyThrows
		void shouldHaveStatusOk() {
			var result = doPerform();

			result.andExpect(status().isOk());
		}

		@Test
		@SneakyThrows
		void shouldHaveContentType() {
			var result = doPerform();

			result.andExpect(content().contentType("application/hal+json"));
		}

		@Test
		@SneakyThrows
		void shouldHaveStandardProfileLink() {
			var result = doPerform();

			result.andExpect(jsonPath("$._links.profile.href").value("http://localhost" + restProperties.getBasePath() + "/profile"));
		}

		@SneakyThrows
		private ResultActions doPerform() {
			return mockMvc.perform(get(restProperties.getBasePath()));
		}
	}

}