/*
 *******************************************************************************
 * 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.assertj.core.util.Lists;
import org.eclipse.openk.contactbasedata.api.AuthNAuthApi;
import org.eclipse.openk.contactbasedata.config.TestConfiguration;
import org.eclipse.openk.contactbasedata.model.JwtToken;
import org.eclipse.openk.contactbasedata.model.LoginCredentials;
import org.eclipse.openk.contactbasedata.repository.CommunicationTypeRepository;
import org.eclipse.openk.contactbasedata.repository.InternalPersonRepository;
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.test.context.ContextConfiguration;

import java.util.List;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;

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

public class AuthNAuthServiceTest {
    private static final long MAIL_ID = 1L;
    private static final long TEL_ID = 2L;

    @Qualifier("myAuthNAuthService")
    @Autowired
    private AuthNAuthService authNAuthService ;

    @MockBean
    private InternalPersonService internalPersonService;

    @MockBean
    private InternalPersonRepository internalPersonRepository;

    @MockBean
    private CommunicationTypeRepository communicationTypeRepository;

    @MockBean
    private AuthNAuthApi authNAuthApi;


    @Test
    public void shouldSynchronizeAuthnAuthRunThrou1() {

        when(internalPersonRepository.saveAll(any( List.class ))).thenReturn(Lists.emptyList());
        when( internalPersonRepository.findByUserRefNotNull() ).thenReturn(MockDataHelper.mockTblInternalPersonPage().getContent());

        JwtToken jwtToken = new JwtToken();
        jwtToken.setAccessToken("ds2ds2d23ad3242");
        when( authNAuthApi.login(any(LoginCredentials.class))).thenReturn(jwtToken);
        when( authNAuthApi.logout(jwtToken.getAccessToken())).thenReturn(null);
        when( authNAuthApi.getKeycloakUsers(jwtToken.getAccessToken())).thenReturn(MockDataHelper.mockKeycloakUsers());

        authNAuthService.synchronizeAuthNAuth();

        verify( authNAuthApi, times(1)).logout(anyString());
        verify( internalPersonRepository, times(1 )).saveAll(any(List.class));
    }

}
