/*
 * ServiceProviderFactoryTest.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.container.provider;

import jp.co.cybec.cb3.container.provider.ServiceProviderFactory;
import jp.co.cybec.cb3.exception.ServiceProviderCreationException;
import jp.co.cybec.cb3.mock.accessor.MockAccessor;
import jp.co.cybec.cb3.mock.accessor.MockDataAccessContext;
import jp.co.cybec.cb3.mock.container.provider.MockServiceProvider;
import jp.co.cybec.cb3.mock.container.service.MockService;
import jp.co.cybec.cb3.util.CB3BeanFactory;
import junit.framework.Assert;

import org.junit.Test;


/**
 * ServiceProviderFactoryのテストケース。
 * @author Naoko Sugimoto
 */
public class ServiceProviderFactoryTest {

	/** アプリケーションコンテキストファイルパス */
	private static String TEST_CONTEXT_PATH = "jp/co/cybec/cb3/container/provider/ServiceProviderFactory/applicationContext.xml";

	/**
	 * {@link jp.co.cybec.cb3.container.provider.ServiceProviderFactory#getInstance()} のためのテスト・メソッド。
	 * シングルトンになっていることを確認する。
	 */
	@Test
	public void testGetInstance() {
		Assert.assertSame(ServiceProviderFactory.getInstance(), ServiceProviderFactory.getInstance());
	}

	/**
	 * {@link jp.co.cybec.cb3.container.provider.ServiceProviderFactory#getServiceProvider(String)} のためのテスト・メソッド。
	 * ファイルに指定したとおりにインスタンスが生成できることを確認する。
	 */
	@Test
	public void testGetServiceProvider() {

		// テスト用のコンテキストファイルパスを使用
		CB3BeanFactory.getInstance().setApplicationContextFilePath(TEST_CONTEXT_PATH);

		// サービスプロバイダを取得。
		ServiceProviderFactory factory = ServiceProviderFactory.getInstance();
		MockServiceProvider serviceProvider = (MockServiceProvider)factory.getServiceProvider("test");
		// サービスを取得。
		MockService service = (MockService)serviceProvider.getService();
		// データアクセスコンテキストを取得。
		MockDataAccessContext dataAccessContext = (MockDataAccessContext)service.getDataAccessContext();
		// アクセッサを取得。
		MockAccessor accessor1 = (MockAccessor)dataAccessContext.lookup("accessor1");
		MockAccessor accessor2 = (MockAccessor)dataAccessContext.lookup("accessor2");
		// アクセッサが別のインスタンスであることを確認。（シングルトンになっていない。）
		Assert.assertNotSame(accessor1, accessor2);
	}

	/**
	 * {@link jp.co.cybec.cb3.container.provider.ServiceProviderFactory} のためのテスト・メソッド。
	 * 設定ファイルが存在しない場合、適切な例外が発生することを確認する。
	 */
	@Test(expected=ServiceProviderCreationException.class)
	public void testGetServiceProviderFileNotFound() {
		// デフォルトのデータソースコンテキストファイルパスを使用
		CB3BeanFactory.getInstance().setApplicationContextFilePath("dummy.xml");

		// サービスプロバイダを取得しようとすると、例外が発生する。
		ServiceProviderFactory.getInstance().getServiceProvider("test");
	}

	/**
	 * {@link jp.co.cybec.cb3.container.provider.ServiceProviderFactory} のためのテスト・メソッド。
	 * 存在しないBean IDを指定した場合、適切な例外が発生することを確認する。
	 */
	@Test(expected=ServiceProviderCreationException.class)
	public void testGetServiceProviderBeanNotFound() {
		// テスト用のコンテキストファイルパスを使用
		CB3BeanFactory.getInstance().setApplicationContextFilePath(TEST_CONTEXT_PATH);

		// 存在しないIDを指定して、サービスプロバイダを取得しようとすると、例外が発生する。
		ServiceProviderFactory.getInstance().getServiceProvider("dummy");
	}
}
