/*
 * 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.sling.testing.clients;

import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.entity.StringEntity;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpRequestHandler;
import org.codehaus.jackson.JsonNode;
import org.junit.ClassRule;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;

import static org.junit.Assert.assertEquals;

public class SlingClientConstructorTest {

    @Test
    public void testConstructorUrlHttp() throws Exception {
        URI url = URI.create("http://example.com/");
        SlingClient c = new SlingClient(url, "user", "pass");
        assertEquals(url, c.getUrl());
    }

    @Test
    public void testConstructorUrlHttps() throws Exception {
        URI url = URI.create("https://example.com/");
        SlingClient c = new SlingClient(url, "user", "pass");
        assertEquals(url, c.getUrl());
    }

    @Test
    public void testConstructorUrlBasePath() throws Exception {
        URI url = URI.create("https://example.com/mypath/");
        SlingClient c = new SlingClient(url, "user", "pass");
        assertEquals(url, c.getUrl());
    }

    @Test
    public void testConstructorAnonymous() throws Exception {
        URI url = URI.create("https://example.com/");
        SlingClient c = new SlingClient(url, null, null);
        assertEquals(url, c.getUrl());
    }

    @Test(expected = ClientException.class)
    public void testConstructorUrlNoProtocol() throws Exception {
        URI url = URI.create("example.com/");
        SlingClient c = new SlingClient(url, "user", "pass");
        assertEquals(url, c.getUrl());
    }
}
