using System;
using NUnit.Framework;
using Rhino.Mocks;
using TINK.Model.Connector;
using TINK.Repository;

namespace TestTINKLib.Fixtures.ObjectTests.Connector
{
	[TestFixture]
	public class TestConnectorCache
	{
		/// <summary>
		/// Verifies that factory method returns correcty type depending on session cookie.
		/// </summary>
		[Test]
		public void TestCommandFactory()
		{
			var l_oCopri = MockRepository.GenerateStub<ICopriServer>();

			// Construct not logged in version of connector.
			var l_oCommand = new ConnectorCache(
				new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)),
				null /*UI language */,
				"", // Not logged in
				"",
				l_oCopri).Command;

			Assert.AreEqual(typeof(Command), l_oCommand.GetType());
		}

		/// <summary>
		/// Verifies that factory method returns correcty type depending on session cookie.
		/// </summary>
		[Test]
		public void TestCommandFactory_LoggedIn()
		{
			var l_oCopri = MockRepository.GenerateStub<ICopriServer>();

			var l_oCommand = new ConnectorCache(
				new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)),
				null /*UI language */,
				"123",      // Logged in
				"a@b",
				l_oCopri).Command;

			Assert.AreEqual(typeof(CommandLoggedIn), l_oCommand.GetType());
		}

		/// <summary>
		/// Verifies that factory method returns correcty type depending on session cookie.
		/// </summary>
		[Test]
		public void TestQueryFactory_CachedServer()
		{
			var l_oCopri = MockRepository.GenerateStub<ICopriServer>();

			var l_oQuery = new ConnectorCache(
				new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)),
				null /*UI language */,
				"",
				"",
				l_oCopri).Query;

			Assert.AreEqual(typeof(TINK.Model.Connector.Query), l_oQuery.GetType());
		}

		/// <summary>
		/// Verifies that factory method returns correcty type depending on session cookie.
		/// </summary>
		[Test]
		public void TestQueryFactory_LoggedIn()
		{
			var l_oCopri = MockRepository.GenerateStub<ICopriServer>();

			var l_oQuery = new ConnectorCache(
				new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)),
				null /*UI language */,
				"123",
				"a@b",
				l_oCopri).Query;

			Assert.AreEqual(typeof(QueryLoggedIn), l_oQuery.GetType());
		}
	}
}