package org.richfaces.testng;

import org.ajax4jsf.bean.A4JActionParam;
import org.ajax4jsf.template.Template;
import org.richfaces.RichSeleniumTest;
import org.richfaces.SeleniumTestBase;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class AjaxActionParameterTest extends SeleniumTestBase implements
		RichSeleniumTest {

	public AjaxActionParameterTest() {
		super("http", "localhost", serverPort);
	}

	/**
	 * This method are invoking before selenium tests started
	 */
	@BeforeMethod
	@Parameters( { "browser", "filterPrefix" })
	public void startSelenium(String browser, String filterPrefix) {
		super.startSelenium(browser, filterPrefix);
	}

	@BeforeMethod
	@Parameters( { "loadStyleStrategy", "loadScriptStrategy" })
	protected void loadConfiguration(String loadStyleStrategy,
			String loadScriptStrategy) throws Exception {
		super.loadConfiguration(loadStyleStrategy, loadScriptStrategy);
	}

	/**
	 * This method are invoking after selenium tests completed
	 */
	@AfterMethod(alwaysRun = true)
	public void stopSelenium() {
		super.stopSelenium();
	}

	@Test
	public void testAjaxCommandLinkComponent() throws Exception {
		_testAjaxCommandLinkComponent(Template.SIMPLE);
		_testAjaxCommandLinkComponent(Template.DATA_TABLE);
	}
	
	/**
	 * Tests ajax action parameter component
	 * @param template
	 */
	private void _testAjaxCommandLinkComponent(Template template) {
		renderPage(template);
		String parentId = getParentId();
		String parameter = null;
		
		String paramID = parentId + "_parameter";
		String ajaxButttonID = parentId + "_form1:ajaxSubmit";
		String htmlButttonID = parentId + "_form2:htmlSubmit";
		
		// test ajax submit
		clickById(ajaxButttonID);
		waitForAjaxCompletion();
		parameter = getTextById(paramID);
		checkParameter(parameter);
		
		
		// test html submit
		clickCommandAndWait(htmlButttonID);
		parameter = getTextById(paramID);
		checkParameter(parameter);
	}
	
	/**
	 * Checks action parameter
	 * @param parameter - Action Parameter value 
	 */
	private void checkParameter (String parameter) {
		if ("".equals(parameter)) {
			writeStatus("<a4j:actionParameter> failed. ActionListener skipped.", true);
			Assert.fail("<a4j:actionParameter> failed. ActionListener skipped.");
		} else if (parameter.equals(A4JActionParam.ERRORS.NO_PARAM)) {
			writeStatus("<a4j:actionParameter> failed. Parameter has been not sent with ajax request.", true);
			Assert.fail("<a4j:actionParameter> failed. Parameter has been not sent with ajax request.");
		} else if (parameter.equals(A4JActionParam.ERRORS.NOT_ASSIGNED)) {
			writeStatus("<a4j:actionParameter> failed. Parameter value has been not assigned to bean", true);
			Assert.fail("<a4j:actionParameter> failed. Parameter value has been not assigned to bean");
		} else if (parameter.equals(A4JActionParam.ERRORS.INVALID_VALUE)) {
			writeStatus("<a4j:actionParameter> failed. Parameter value is incorrect", true);
			Assert.fail("<a4j:actionParameter> failed. Parameter value is incorrect");
		} else {
			writeStatus("<a4j:actionParameter> passed successfully");
		}
	}

	@Override
	public String getTestUrl() {
		return "pages/actionParam/actionParam.xhtml";
	}

}
