/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sample.user.crud.basic.test;

import junit.framework.Assert;
import sample.user.crud.basic.StatusCode;
import sample.user.crud.basic.CreateResponse;
import sample.user.crud.basic.CreateRequest;
import sample.user.crud.basic.SampleUser;
import java.net.MalformedURLException;
import javax.xml.namespace.QName;
import java.net.URL;
import sample.user.crud.basic.DeletePort;
import sample.user.crud.basic.UpdatePort;
import sample.user.crud.basic.ReadPort;
import sample.user.crud.basic.CreatePort;
import sample.user.crud.basic.WsCRUDUserService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import sample.user.crud.basic.DeleteRequest;
import sample.user.crud.basic.DeleteResponse;
import sample.user.crud.basic.ReadRequest;
import sample.user.crud.basic.ReadResponse;
import sample.user.crud.basic.UpdateRequest;
import sample.user.crud.basic.UpdateResponse;

/**
 *
 * @author ricky
 */
public class WsCRUDUserServiceTest {

    private WsCRUDUserService service = null;
    private CreatePort createPort = null;
    private ReadPort readPort = null;
    private UpdatePort updatePort = null;
    private DeletePort deletePort = null;

    public WsCRUDUserServiceTest() {
    }

    @Before
    public void setUp() throws MalformedURLException {
        service = new WsCRUDUserService(
                new URL("http://localhost:8080/WsCRUDUserService/wsCRUDUserServicePortTypeBindingRead?wsdl"),
                new QName("http://basic.crud.user.sample", "wsCRUDUserService"));
        createPort = service.getWsCRUDUserServicePortTypeBindingCreate();
        readPort = service.getWsCRUDUserServicePortTypeBindingRead();
        updatePort = service.getWsCRUDUserServicePortTypeBindingUpdate();
        deletePort = service.getWsCRUDUserServicePortTypeBindingDelete();
    }

    @After
    public void tearDown() {
        service = null;
        createPort = null;
        readPort = null;
        updatePort = null;
        deletePort = null;
    }

    @Test
    public void test01Create() {
        // create the user
        SampleUser user = new SampleUser();
        user.setId("test");
        user.setFirstName("Test");
        user.setLastName("User");
        user.setEmployeeNumber("11111111");
        user.setActive(true);
        user.setDepartment("test-department");
        user.setMobilePhone("+34609123456");
        user.setLocation("Madrid");
        CreateRequest createRequest = new CreateRequest();
        createRequest.setUser(user);
        System.err.println("Creating user...");
        CreateResponse createResponse = createPort.create(createRequest);
        Assert.assertEquals(createResponse.getStatus().getStatus(), StatusCode.OK);
        // read the user to check
        ReadRequest readRequest = new ReadRequest();
        readRequest.setId(user.getId());
        System.err.println("reading created user...");
        ReadResponse readResponse = readPort.read(readRequest);
        Assert.assertEquals(readResponse.getStatus().getStatus(), StatusCode.OK);
        Assert.assertNotNull(readResponse.getUser());
    }

    @Test
    public void test02Update() {
        // create the user
        SampleUser user = new SampleUser();
        user.setId("test");
        user.setFirstName("Test");
        user.setLastName("User");
        user.setEmployeeNumber("22222222");
        user.setActive(false);
        user.setDepartment("test-department");
        user.setMobilePhone("+34609123456");
        user.setLocation("Madrid");
        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.setUser(user);
        System.err.println("Updating user...");
        UpdateResponse updateResponse = updatePort.update(updateRequest);
        Assert.assertEquals(updateResponse.getStatus().getStatus(), StatusCode.OK);
        // read the user to check
        ReadRequest readRequest = new ReadRequest();
        readRequest.setId(user.getId());
        System.err.println("Reading updated user...");
        ReadResponse readResponse = readPort.read(readRequest);
        Assert.assertEquals(readResponse.getStatus().getStatus(), StatusCode.OK);
        Assert.assertNotNull(readResponse.getUser());
        Assert.assertEquals(user.getEmployeeNumber(), readResponse.getUser().getEmployeeNumber());
        Assert.assertEquals(user.isActive(), readResponse.getUser().isActive());
    }

    @Test
    public void test03Delete() {
        // delete the user
        DeleteRequest deleteRequest = new DeleteRequest();
        deleteRequest.setId("test");
        System.err.println("Deleting user...");
        DeleteResponse deleteResponse = deletePort.delete(deleteRequest);
        Assert.assertEquals(deleteResponse.getStatus().getStatus(), StatusCode.OK);
        // read the user to check
        ReadRequest readRequest = new ReadRequest();
        readRequest.setId("test");
        System.err.println("Reading deleted user...");
        ReadResponse readResponse = readPort.read(readRequest);
        Assert.assertEquals(readResponse.getStatus().getStatus(), StatusCode.OK);
        Assert.assertNull(readResponse.getUser());
    }

    public static void main(String[] args) {
        Result result = JUnitCore.runClasses(WsCRUDUserServiceTest.class);
        for (Failure failure : result.getFailures()) {
            System.out.println(failure.toString());
        }
    }
}

