package com.cameleer.server.app.outbound;

import com.cameleer.server.app.outbound.dto.OutboundConnectionRequest;
import com.cameleer.server.core.http.TrustMode;
import com.cameleer.server.core.outbound.OutboundAuth;
import com.cameleer.server.core.outbound.OutboundMethod;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

class OutboundConnectionRequestValidationTest {
    private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    @Test
    void validRequestPasses() {
        var r = new OutboundConnectionRequest("slack-ops", "desc",
                "https://hooks.slack.com/x", OutboundMethod.POST,
                Map.of(), null, TrustMode.SYSTEM_DEFAULT, List.of(),
                null, new OutboundAuth.None(), List.of());
        assertThat(validator.validate(r)).isEmpty();
    }

    @Test
    void blankNameFails() {
        var r = new OutboundConnectionRequest("  ", null, "https://x", OutboundMethod.POST,
                Map.of(), null, TrustMode.SYSTEM_DEFAULT, List.of(), null, new OutboundAuth.None(), List.of());
        assertThat(validator.validate(r)).anySatisfy(v -> assertThat(v.getPropertyPath().toString()).isEqualTo("name"));
    }

    @Test
    void nonHttpsUrlFails() {
        var r = new OutboundConnectionRequest("n", null, "http://x", OutboundMethod.POST,
                Map.of(), null, TrustMode.SYSTEM_DEFAULT, List.of(), null, new OutboundAuth.None(), List.of());
        assertThat(validator.validate(r)).anySatisfy(v -> assertThat(v.getPropertyPath().toString()).isEqualTo("url"));
    }

    @Test
    void trustPathsRequiresNonEmptyCaList() {
        assertThatThrownBy(() -> new OutboundConnectionRequest("n", null, "https://x", OutboundMethod.POST,
                Map.of(), null, TrustMode.TRUST_PATHS, List.of(), null, new OutboundAuth.None(), List.of()))
                .isInstanceOf(IllegalArgumentException.class);
    }
}
