/**
 * 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.pulsar.broker.admin;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;

import javax.ws.rs.core.Response.Status;
import org.apache.pulsar.broker.service.BrokerTestBase;
import org.apache.pulsar.broker.web.RestException;
import org.apache.pulsar.common.util.Codec;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

/**
 * Unit test {@link AdminResource}.
 */
@Test(groups = "broker")
public class AdminResourceTest extends BrokerTestBase {

    @BeforeClass
    @Override
    public void setup() throws Exception {
        super.baseSetup();
    }

    @AfterClass(alwaysRun = true)
    @Override
    protected void cleanup() throws Exception {
        super.internalCleanup();
    }

    private static AdminResource mockResource() {
        return new AdminResource() {

            @Override
            protected String domain() {
                return "persistent";
            }
        };
    }

    @Test
    public void testValidatePartitionedTopicNameSuccess() {
        String tenant = "test-tenant";
        String namespace = "test-namespace";
        String topic = Codec.encode("test-topic");

        AdminResource resource = mockResource();
        resource.validatePartitionedTopicName(tenant, namespace, topic);
    }

    @Test
    public void testValidatePartitionedTopicNameInvalid() {
        String tenant = "test-tenant";
        String namespace = "test-namespace";
        String topic = Codec.encode("test-topic-partition-0");

        AdminResource resource = mockResource();
        try {
            resource.validatePartitionedTopicName(tenant, namespace, topic);
            fail("Should fail validation on invalid partitioned topic");
        } catch (RestException re) {
            assertEquals(Status.PRECONDITION_FAILED.getStatusCode(), re.getResponse().getStatus());
        }
    }

    @Test
    public void testValidatePartitionedTopicMetadata() throws Exception {
        String tenant = "prop";
        String namespace = "ns-abc";
        String partitionedTopic = "partitionedTopic";
        String nonPartitionedTopic = "notPartitionedTopic";
        int partitions = 3;

        String completePartitionedTopic = tenant + "/" + namespace + "/" + partitionedTopic;
        String completeNonPartitionedTopic = tenant + "/" + namespace + "/" + nonPartitionedTopic;

        admin.topics().createNonPartitionedTopic(completeNonPartitionedTopic);
        admin.topics().createPartitionedTopic(completePartitionedTopic, partitions);

        AdminResource resource = mockResource();
        resource.setPulsar(pulsar);
        // validate should pass when topic is partitioned topic
        resource.validatePartitionedTopicName(tenant, namespace, Codec.encode(partitionedTopic));
        resource.validatePartitionedTopicMetadata(tenant, namespace, Codec.encode(partitionedTopic));
        // validate should failed when topic is non-partitioned topic
        resource.validatePartitionedTopicName(tenant, namespace, Codec.encode(nonPartitionedTopic));
        try {
            resource.validatePartitionedTopicMetadata(tenant, namespace, Codec.encode(nonPartitionedTopic));
            fail("Should fail validation on non-partitioned topic");
        } catch (RestException re) {
            assertEquals(Status.CONFLICT.getStatusCode(), re.getResponse().getStatus());
        }
    }
}
