/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.api.factory.server.impl;

import org.eclipse.che.api.core.ApiException;
import org.eclipse.che.api.core.ForbiddenException;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.factory.server.FactoryEditValidator;
import org.eclipse.che.api.factory.shared.dto.AuthorDto;
import org.eclipse.che.api.factory.shared.dto.FactoryDto;
import org.eclipse.che.commons.env.EnvironmentContext;
import org.eclipse.che.commons.subject.Subject;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

/**
 * Tests for {@link FactoryEditValidator}
 * @author Florent Benoit
 */
@Listeners(value = {MockitoTestNGListener.class})
public class FactoryEditValidatorImplTest {

    @Mock
    private FactoryDto factory;

    @InjectMocks
    private FactoryEditValidator factoryEditValidator = new FactoryEditValidatorImpl();

    /**
     * Check missing author data
     * @throws ApiException
     */
    @Test(expectedExceptions = ServerException.class)
    public void testNoAuthor() throws ApiException {
        setCurrentUser("");
        factoryEditValidator.validate(factory);
    }

    /**
     * Check when user is not  same than the one than create the factory
     * @throws ApiException
     */
    @Test(expectedExceptions = ForbiddenException.class)
    public void testUserIsNotTheAuthor() throws ApiException {
        String userId = "florent";
        setCurrentUser(userId);

        AuthorDto author = mock(AuthorDto.class);
        doReturn(author).when(factory)
                        .getCreator();
        doReturn("john").when(author)
                        .getUserId();

        factoryEditValidator.validate(factory);
    }

    /**
     * Check when user is the same than the one than create the factory
     * @throws ApiException
     */
    @Test
    public void testUserIsTheAuthor() throws ApiException {
        String userId = "florent";
        setCurrentUser(userId);
        AuthorDto author = mock(AuthorDto.class);
        doReturn(author).when(factory)
                        .getCreator();
        doReturn(userId).when(author)
                        .getUserId();

        factoryEditValidator.validate(factory);
    }

    private void setCurrentUser(String userId) {
        Subject subject = mock(Subject.class);
        when(subject.getUserId()).thenReturn(userId);
        EnvironmentContext.getCurrent().setSubject(subject);
    }
}
