/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.cassandra.sidecar.utils;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import io.netty.handler.codec.http.HttpResponseStatus;
import io.vertx.ext.web.handler.HttpException;

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

/**
 * Test validation methods.
 */
public class CassandraInputValidatorTest
{
    CassandraInputValidator instance;

    @BeforeEach
    void setup()
    {
        instance = new CassandraInputValidator();
    }

    @ParameterizedTest(name = "[{0}]")
    @ValueSource(strings = { "test_table_name", "\"test_table_name\"", "testTableName", "\"testTableName\"", "a_",
                             "\"cycling\"", "\"Helmets\"", "\"mIxEd_cAsE\"", "a8", "a", "\"8a\"",
                             "\"_must_begin_with_alphabetic_unless_quoted_p\"" })
    public void testValidTableNameValidation(String tableName)
    {
        instance.validateTableName(tableName);
    }

    @ParameterizedTest(name = "[{0}]")
    @ValueSource(strings = { "", "test table", "_must_begin_with_alphabetic", "dash-is-not-allowed", "\"\"", "\"",
                             "\"inv@lid_chars\"", "test:table_name", "test-table$name", "8a", "testTable/Name" })
    public void failsWithInvalidTableName(String tableName)
    {
        HttpException httpEx = Assertions.assertThrows(HttpException.class,
                                                       () -> instance.validateTableName(tableName));
        assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
        assertThat(httpEx.getPayload()).isEqualTo("Invalid characters in table name: " + tableName);
    }

    @ParameterizedTest(name = "[{0}]")
    @ValueSource(strings = { "SystemViews", "system_views_test", "\"keyspace\"", "\"cycling\"", "\"Cycling\"",
                             "\"mIxEd_cAsE\"", "a8", "a", "a_", "\"_a\"" })
    public void testValidKeyspaceValidation(String keyspace)
    {
        instance.validateKeyspaceName(keyspace);
    }

    @ParameterizedTest(name = "[{0}]")
    @ValueSource(strings = { "system_schema",
                             "system_traces",
                             "system_distributed",
                             "system",
                             "system_auth",
                             "system_views",
                             "system_virtual_schema" })
    public void failsWithForbiddenKeyspace(String keyspace)
    {
        HttpException httpEx = Assertions.assertThrows(HttpException.class,
                                                       () -> instance.validateKeyspaceName(keyspace));
        assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.FORBIDDEN.code());
        assertThat(httpEx.getPayload()).isEqualTo("Forbidden keyspace: " + keyspace);
    }

    @ParameterizedTest(name = "[{0}]")
    @ValueSource(strings = { "", "test keyspace", "_cycling", "dash-is-not-allowed", "\"\"", "\"",
                             "\"inv@lid_chars\"", "8a" })
    public void failsWithInvalidKeyspaceName(String keyspace)
    {
        HttpException httpEx = Assertions.assertThrows(HttpException.class,
                                                       () -> instance.validateKeyspaceName(keyspace));
        assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
        assertThat(httpEx.getPayload()).isEqualTo("Invalid characters in keyspace: " + keyspace);
    }

    @Test
    public void testValidateFileName_validFileNames_expectNoException()
    {
        instance.validateComponentName("test-file-name.db");
        instance.validateComponentName("test_file_name.json");
        instance.validateComponentName("testFileName.cql");
        instance.validateComponentName("t_TOC.txt");
        instance.validateComponentName("crcfile.crc32");
    }

    private void testCommon_testInvalidFileName(String testFileName)
    {
        HttpException httpEx = Assertions.assertThrows(HttpException.class,
                                                       () -> instance.validateComponentName(testFileName));
        assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
        assertThat(httpEx.getPayload()).isEqualTo("Invalid component name: " + testFileName);
    }

    @Test
    public void testValidateFileName_withoutExtension_expectException()
    {
        testCommon_testInvalidFileName("test-file-name");
    }

    @Test
    public void testValidateFileName_incorrectExtension_expectException()
    {
        testCommon_testInvalidFileName("test-file-name.db1");
    }

    @Test
    public void testValidateFileName_incorrectCrcExtension_expectException()
    {
        testCommon_testInvalidFileName("crcfile.crc64");
    }

    @Test
    public void testValidateFileName_withoutFileName_expectException()
    {
        testCommon_testInvalidFileName("TOC.txt");
    }


    @Test
    public void testValidateSnapshotName_validSnapshotNames_expectNoException()
    {
        instance.validateSnapshotName("valid-snapshot-name");
        instance.validateSnapshotName("valid\\snapshot\\name");
        instance.validateSnapshotName("valid:snapshot:name");
        instance.validateSnapshotName("valid$snapshot$name");
        instance.validateSnapshotName("valid snapshot name");
    }

    @Test
    public void testValidateSnapshotName_snapshotNameWithSlash_expectException()
    {
        String testSnapName = "valid" + '/' + "snapshotname";
        HttpException httpEx = Assertions.assertThrows(HttpException.class,
                                                       () -> instance.validateSnapshotName(testSnapName));
        assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
        assertThat(httpEx.getPayload()).isEqualTo("Invalid characters in snapshot name: " + testSnapName);
    }

    @Test
    public void testValidateSnapshotName_snapshotNameWithNullChar_expectException()
    {
        String testSnapName = "valid" + '\0' + "snapshotname";
        HttpException httpEx = Assertions.assertThrows(HttpException.class,
                                                       () -> instance.validateSnapshotName(testSnapName));
        assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
        assertThat(httpEx.getPayload()).isEqualTo("Invalid characters in snapshot name: " + testSnapName);
    }
}
