/*
 *************************************************************************
 * The contents of this file are subject to the Openbravo  Public  License
 * Version  1.1  (the  "License"),  being   the  Mozilla   Public  License
 * Version 1.1  with a permitted attribution clause; you may not  use this
 * file except in compliance with the License. You  may  obtain  a copy of
 * the License at http://www.openbravo.com/legal/license.html 
 * Software distributed under the License  is  distributed  on  an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific  language  governing  rights  and  limitations
 * under the License. 
 * The Original Code is Openbravo ERP. 
 * The Initial Developer of the Original Code is Openbravo SLU 
 * All portions are Copyright (C) 2008-2014 Openbravo SLU 
 * All Rights Reserved. 
 * Contributor(s):
 *   Martin Taal <martin.taal@openbravo.com>,
 *   Ivan Perdomo <ivan.perdomo@openbravo.com>,
 *   Leo Arias <leo.arias@openbravo.com>.
 ************************************************************************
 */

package org.openbravo.test.dal;

import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.MatcherAssert.assertThat;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;
import org.openbravo.dal.core.OBContext;
import org.openbravo.dal.service.OBCriteria;
import org.openbravo.dal.service.OBDal;
import org.openbravo.dal.service.OBQuery;
import org.openbravo.model.ad.system.Client;
import org.openbravo.model.common.enterprise.Organization;
import org.openbravo.test.base.OBBaseTest;

public class DalReadableClientOrganizationsTest extends OBBaseTest {

  @Test
  public void testObQueryFilterByReadableOrganizations() {
    OBContext.setOBContext(TEST_USER_ID, TEST_SPANISH_ROLE_ID, TEST_CLIENT_ID, TEST_ORG_ID);

    List<String> readableOrganizations = Arrays.asList(OBContext.getOBContext()
        .getReadableOrganizations());

    OBCriteria<Organization> obCriteriaOrg = OBDal.getInstance().createCriteria(Organization.class);
    obCriteriaOrg.setFilterOnReadableOrganization(true);
    List<Organization> organizationsFromCriteria = obCriteriaOrg.list();

    for (Organization organization : organizationsFromCriteria) {
      assertThat(readableOrganizations, hasItem(organization.getId()));
    }

    OBQuery<Organization> obQueryOrg = OBDal.getInstance().createQuery(Organization.class, "");
    obQueryOrg.setFilterOnReadableOrganization(true);
    List<Organization> organizationsFromQuery = obQueryOrg.list();

    for (Organization organization : organizationsFromQuery) {
      assertThat(readableOrganizations, hasItem(organization.getId()));
    }

    List<String> readableClients = Arrays.asList(OBContext.getOBContext().getReadableClients());

    OBCriteria<Client> obCriteriaClient = OBDal.getInstance().createCriteria(Client.class);
    obCriteriaClient.setFilterOnReadableOrganization(true);
    List<Client> clientsFromCriteria = obCriteriaClient.list();

    for (Client client : clientsFromCriteria) {
      assertThat(readableClients, hasItem(client.getId()));
    }

    OBQuery<Client> obQueryClient = OBDal.getInstance().createQuery(Client.class, "");
    obQueryClient.setFilterOnReadableClients(true);
    List<Client> clientsFromQuery = obQueryClient.list();

    for (Client client : clientsFromQuery) {
      assertThat(readableClients, hasItem(client.getId()));
    }

  }
}

