/*
 * 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.dubbo.samples.basic;

import org.apache.dubbo.common.URL;
import org.apache.dubbo.samples.basic.api.DemoService;
import org.apache.dubbo.samples.basic.spi.CompatibleFilter;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;
import java.util.stream.Collectors;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring/dubbo-demo-consumer.xml"})
public class DemoServiceIT {
    @Autowired
    private DemoService demoService;

    @Test
    public void testRegisteredProviders() throws Exception {
        List<String> urls = ZkUtil.getChildren(ZkUtil.toUrlPath("providers"));
        List<String> decodedUrls = urls.stream().map(URL::decode).collect(Collectors.toList());
        Assert.assertEquals(1, decodedUrls.size());
        String url = decodedUrls.get(0);
        Assert.assertTrue(url.startsWith("compatible://") || url.startsWith("dubbo://"));
    }

    @Test
    public void testRegisteredConsumers() throws Exception {
        List<String> urls = ZkUtil.getChildren(ZkUtil.toUrlPath("consumers"));
        List<String> decodedUrls = urls.stream().map(URL::decode).collect(Collectors.toList());
        Assert.assertFalse(decodedUrls.isEmpty());
        String url = decodedUrls.get(0);
        Assert.assertTrue(url.startsWith("consumer://") || url.startsWith("dubbo://"));
    }

    @Test
    public void testInvoke() throws Exception {
        String result = demoService.sayHello("world");
        Assert.assertEquals("hello", result);
        Assert.assertTrue(CompatibleFilter.invoked);
    }
}
