/*
 *******************************************************************************
 * Copyright (c) 2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************
 */
package org.eclipse.openk.contactbasedata.service;

import org.eclipse.openk.contactbasedata.config.TestConfiguration;
import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
import org.eclipse.openk.contactbasedata.repository.DetailedContactRepository;
import org.eclipse.openk.contactbasedata.service.util.SearchContactsFilterParams;
import org.eclipse.openk.contactbasedata.support.MockDataHelper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.test.context.ContextConfiguration;

import java.util.Date;
import java.util.Optional;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.when;

//@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(classes = {TestConfiguration.class})

public class ContactServiceTest {
    @Qualifier("myContactService")
    @Autowired
    private ContactService contactService;

    @MockBean
    private DetailedContactRepository detailedContactRepository;

    @Test
    public void shouldFindDetailedContactsProperly() {
        Page<VwDetailedContact> mockPaged = MockDataHelper.mockVDetailedContactPage();
        when(detailedContactRepository.findByFilter(isNull(), isNull(), isNull(), isNull(),
                anyBoolean(), any( Date.class), anyBoolean(), anyBoolean(), anyBoolean(), any(Pageable.class))).thenReturn(mockPaged);
        SearchContactsFilterParams filter = new SearchContactsFilterParams();
        Page<VwDetailedContact> retPage = contactService.findDetailedContacts(
                filter, PageRequest.of(0, 20));

        assertEquals(mockPaged.getTotalElements(), retPage.getTotalElements());
    }

    @Test
    public void shouldFindSingleDetailedContactProperly() {
        VwDetailedContact mockContact = MockDataHelper.mockVDetailedContact();
        when(detailedContactRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(mockContact));

        VwDetailedContact detailedContact = contactService.findDetailedContactByUuid(UUID.randomUUID());

        assertEquals(detailedContact.getUuid(), mockContact.getUuid());
    }
}
