/*
 * 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.eventmesh.dashboard.console.health;

import org.apache.eventmesh.dashboard.console.health.callback.HealthCheckCallback;
import org.apache.eventmesh.dashboard.console.health.check.AbstractHealthCheckService;
import org.apache.eventmesh.dashboard.console.health.check.config.HealthCheckObjectConfig;
import org.apache.eventmesh.dashboard.console.service.health.HealthDataService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
class HealthServiceTest {

    HealthService healthService = new HealthService();

    @Mock
    private HealthDataService healthDataService;

    @Mock
    private CheckResultCache checkResultCache;

    @BeforeEach
    void init() {
        healthService.createExecutor(healthDataService, checkResultCache);
    }

    @Test
    void testInsertCheckServiceWithAnnotation() {
        HealthCheckObjectConfig config = new HealthCheckObjectConfig();
        config.setInstanceId(2L);
        config.setHealthCheckResourceType("storage");
        config.setHealthCheckResourceSubType("redis");
        config.setConnectUrl("redis://localhost:6379");
        healthService.insertCheckService(config);
    }

    @Test
    void testInsertCheckServiceWithSimpleClassName() {
        HealthCheckObjectConfig config = new HealthCheckObjectConfig();
        config.setInstanceId(1L);
        config.setSimpleClassName("StorageRedisCheck");
        config.setHealthCheckResourceType("storage");
        config.setHealthCheckResourceSubType("redis");
        config.setClusterId(1L);
        config.setConnectUrl("redis://localhost:6379");
        healthService.insertCheckService(config);
    }

    @Test
    void testInsertCheckServiceWithClass() {
        HealthCheckObjectConfig config = new HealthCheckObjectConfig();
        config.setInstanceId(1L);
        config.setHealthCheckResourceType("storage");
        config.setHealthCheckResourceSubType("redis");
        config.setClusterId(1L);
        config.setCheckClass(TestHealthCheckService.class);
        healthService.insertCheckService(config);
    }

    @Test
    void testDeleteCheckService() {
        HealthCheckObjectConfig config = new HealthCheckObjectConfig();
        config.setInstanceId(1L);
        config.setHealthCheckResourceType("storage");
        config.setClusterId(1L);
        config.setCheckClass(TestHealthCheckService.class);
        healthService.insertCheckService(config);
        healthService.deleteCheckService("storage", 1L);
    }

    @Test
    void testExecuteAll(){
        HealthCheckObjectConfig config = new HealthCheckObjectConfig();
        config.setInstanceId(1L);
        config.setHealthCheckResourceType("storage");
        config.setClusterId(1L);
        config.setCheckClass(TestHealthCheckService.class);
        healthService.insertCheckService(config);
        healthService.executeAll();
    }

    public static class TestHealthCheckService extends AbstractHealthCheckService {


        public TestHealthCheckService(HealthCheckObjectConfig healthCheckObjectConfig) {
            super(healthCheckObjectConfig);
        }

        @Override
        public void doCheck(HealthCheckCallback callback) {
            callback.onSuccess();
        }

        @Override
        public void init() {

        }
    }
}