﻿#region License

/*
 * 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.
 */

#endregion

using System;
using System.Threading.Tasks;
using Gremlin.Net.Driver;
using Gremlin.Net.Driver.Exceptions;
using Gremlin.Net.IntegrationTest.Util;
using Xunit;

namespace Gremlin.Net.IntegrationTest.Driver
{
    public class GremlinClientAuthenticationTests
    {
        private static readonly string TestHost = ConfigProvider.Configuration["TestServerIpAddress"];
        private static readonly int TestPort = Convert.ToInt32(ConfigProvider.Configuration["TestSecureServerPort"]);
        private readonly RequestMessageProvider _requestMessageProvider = new RequestMessageProvider();

        [Fact]
        public async Task ShouldThrowForMissingCredentials()
        {
            var gremlinServer = new GremlinServer(TestHost, TestPort);
            using (var gremlinClient = new GremlinClient(gremlinServer))
            {
                var exception = await Assert.ThrowsAsync<InvalidOperationException>(
                    async () => await gremlinClient.SubmitWithSingleResultAsync<string>(_requestMessageProvider
                        .GetDummyMessage()));

                Assert.Contains("authentication", exception.Message);
                Assert.Contains("credentials", exception.Message);
            }
        }

        [Theory]
        [InlineData("unknownUser", "passwordDoesntMatter")]
        [InlineData("stephen", "wrongPassword")]
        public async Task ShouldThrowForWrongCredentials(string username, string password)
        {
            var gremlinServer = new GremlinServer(TestHost, TestPort, username: username, password: password);
            using (var gremlinClient = new GremlinClient(gremlinServer))
            {
                var exception = await Assert.ThrowsAsync<ResponseException>(
                    async () => await gremlinClient.SubmitWithSingleResultAsync<string>(_requestMessageProvider
                        .GetDummyMessage()));

                Assert.Contains("Unauthorized", exception.Message);
            }
        }

        [Theory]
        [InlineData("'Hello' + 'World'", "HelloWorld")]
        public async Task ScriptShouldBeEvaluatedAndResultReturnedForCorrectCredentials(string requestMsg,
            string expectedResponse)
        {
            const string username = "stephen";
            const string password = "password";
            var gremlinServer = new GremlinServer(TestHost, TestPort, username: username, password: password);
            using (var gremlinClient = new GremlinClient(gremlinServer))
            {
                var response = await gremlinClient.SubmitWithSingleResultAsync<string>(requestMsg);

                Assert.Equal(expectedResponse, response);
            }
        }
    }
}