package org.richfaces.ui.drag;

import static org.jboss.arquillian.graphene.Graphene.guardAjax;

import java.io.File;
import java.net.URL;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.drone.api.annotation.Drone;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.richfaces.deployment.FrameworkDeployment;

import category.Smoke;

@RunAsClient
@RunWith(Arquillian.class)
public class ITDnd {

    @Drone
    private WebDriver browser;

    @ArquillianResource
    private URL contextPath;

    @FindBy(id = "form:ind")
    private WebElement indicator;

    @FindBy(id = "form:php")
    private WebElement phpTarget;

    @FindBy(id = "form:dnet")
    private WebElement dnetTarget;

    @FindBy(id = "form:cf")
    private WebElement cfTarget;

    @Deployment
    public static WebArchive createDeployment() {
        FrameworkDeployment deployment = new FrameworkDeployment(ITDnd.class);
        deployment.archive().addAsWebResource(new File("src/test/resources/org/richfaces/ui/drag/dnd.xhtml"));
        deployment.archive().addAsWebResource(new File("src/test/resources/images/dnd/accept.gif"), "/resources/images/dnd/accept.gif");
        deployment.archive().addAsWebResource(new File("src/test/resources/images/dnd/default.gif"), "/resources/images/dnd/default.gif");
        deployment.archive().addAsWebResource(new File("src/test/resources/images/dnd/reject.gif"), "/resources/images/dnd/reject.gif");
        deployment.archive().addClass(DragDropBean.class);
        deployment.archive().addClass(DragDropEventBean.class);
        deployment.archive().addClass(Framework.class);

        return deployment.getFinalArchive();
    }

    @Test
    @Category(Smoke.class)
    public void test_dnd() throws InterruptedException {
        // given
        browser.get(contextPath.toExternalForm() + "dnd.jsf");

        WebElement framework = browser.findElements(By.cssSelector(".ui-draggable")).get(0);

        Actions builder = new Actions(browser);
        final Action dragAndDrop = builder.dragAndDrop(framework, phpTarget).build();
        guardAjax(dragAndDrop).perform();

        Assert.assertEquals(1, phpTarget.findElements(By.cssSelector("td")).size());
    }

}
