/*******************************************************************************
 * Copyright (c) 2015 Red Hat, Inc. Distributed under license by Red Hat, Inc.
 * All rights reserved. This program is 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: Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package com.openshift.internal.restclient.capability.resources;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import java.util.Collection;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import com.openshift.internal.restclient.ResourceFactory;
import com.openshift.restclient.IClient;
import com.openshift.restclient.capability.resources.IProjectTemplateProcessing;
import com.openshift.restclient.capability.server.ITemplateProcessing;
import com.openshift.restclient.model.IList;
import com.openshift.restclient.model.IProject;
import com.openshift.restclient.model.IResource;
import com.openshift.restclient.model.template.ITemplate;
import com.openshift.restclient.utils.Samples;

@RunWith(MockitoJUnitRunner.class)
public class ProjectTemplateProcessingTest {
	
	private static final String NAMESPACE = "aProjectNamespace";
	private IProjectTemplateProcessing capability;
	@Mock
	private ITemplate template;
	@Mock
	private IClient client;
	@Mock
	private ITemplateProcessing serverCapability;
	@Mock
	private IProject project;
	
	@Before
	public void setUp() throws Exception {
		when(project.getNamespace()).thenReturn(NAMESPACE);
		when(client.supports(eq(ITemplateProcessing.class))).thenReturn(true);
		when(client.getCapability(eq(ITemplateProcessing.class))).thenReturn(serverCapability);
		
		capability = new ProjectTemplateProcessing(project, client);
	}
	
	@Test
	public void isSupportedShouldBeFalseForNullClient() {
		capability = new ProjectTemplateProcessing(project, null);
		assertFalse(capability.isSupported());
	}
	
	@Test
	public void isSupportedShouldBeFalseIfTheClientDoesntSupportTemplates() {
		when(client.supports(eq(ITemplateProcessing.class))).thenReturn(false);
		capability = new ProjectTemplateProcessing(project, client);
		assertFalse(capability.isSupported());
	}

	@Test
	public void isSupportedShouldBeTrueIfTheClientSupportTemplates() {
		assertTrue(capability.isSupported());
	}
	
	@Test
	public void processTemplateShouldUseTheClientsCapability() {
		when(serverCapability.process(any(ITemplate.class), anyString())).thenReturn(template);
		
		assertEquals(template, capability.process(template));
		verify(serverCapability).process(eq(template), eq(NAMESPACE));
	}

	@Test
	public void applyTemplateShouldUseTheClientToCreateTheResources() {
		@SuppressWarnings("unchecked")
		Collection<IResource> resources = mock(Collection.class);
		when(client.create(any(IList.class), anyString())).thenReturn(resources);
		when(client.getResourceFactory()).thenReturn(new ResourceFactory(client) {});
		ITemplate template = new ResourceFactory(client) {}.create(Samples.V1_TEMPLATE.getContentAsString());
		
		assertEquals(resources, capability.apply(template));
		verify(client).create(any(IList.class), eq(NAMESPACE));
	}
	
}
