/*******************************************************************************
* Copyright (c) 2016 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 org.jboss.tools.openshift.test.ui.application;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.*;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.jboss.tools.openshift.internal.ui.wizard.common.IResourceLabelsPageModel;
import org.jboss.tools.openshift.internal.ui.wizard.newapp.IApplicationSourceListPageModel;
import org.jboss.tools.openshift.internal.ui.wizard.newapp.fromtemplate.ApplicationSourceFromTemplateModel;
import org.jboss.tools.openshift.internal.ui.wizard.newapp.fromtemplate.TemplateApplicationSource;
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.restclient.ResourceKind;
import com.openshift.restclient.model.template.IParameter;
import com.openshift.restclient.model.template.ITemplate;
@RunWith(MockitoJUnitRunner.class)
public class ApplicationSourceFromTemplateModelTest {
@Mock
private ITemplate template;
private ApplicationSourceFromTemplateModel model;
@Before
public void setUp() throws Exception {
when(template.getKind()).thenReturn(ResourceKind.TEMPLATE);
model = new ApplicationSourceFromTemplateModel();
}
@Test
public void setTemplateShouldCopyParametersAndLabels() {
Map<String, IParameter> parameters = givenTheTemplateHasParameters();
HashMap<String, String> labels = givenTheTemplateHasObjectLabels();
Collection<IResourceLabelsPageModel.Label> modelLabels = new ArrayList<>();
for (Entry<String, String> label : labels.entrySet()) {
modelLabels.add(new IResourceLabelsPageModel.Label(label.getKey(), label.getValue()));
}
whenTemplateIsSelected();
assertArrayEquals(parameters.values().toArray(), model.getParameters().toArray());
assertArrayEquals(modelLabels.toArray(), model.getLabels().toArray());
}
@Test
public void resetParameterShouldSetTheOriginalValue() {
IParameter param = mock(IParameter.class);
when(param.getName()).thenReturn("foo");
when(param.getValue()).thenReturn("abc");
when(param.clone()).thenReturn(param);
IParameter other = mock(IParameter.class);
when(other.getName()).thenReturn("foo");
when(other.getValue()).thenReturn("xyz");
model.setParameters(Arrays.asList(new IParameter[] {param}));
model.resetParameter(other);
verify(other).setValue("abc");
}
@Test
public void updateParameterValueShouldUpdateTheParameterValue() {
IParameter param = mock(IParameter.class);
model.updateParameterValue(param, "abc123");
verify(param).setValue(eq("abc123"));
}
@Test
public void should_return_first_parameter_as_selected_parameter_when_new_parameters_are_set() {
// given
assertThat(model.getSelectedParameter()).isNull();
List<IParameter> parameters = Arrays.asList(
mockParameter("n1", "v1"),
mockParameter("n2", "v2"),
mockParameter("n3", "v3")
);
// when
model.setParameters(parameters);
// then
assertThat(model.getSelectedParameter()).isNotNull();
assertThat(model.getSelectedParameter().getName()).isEqualTo("n1");
}
@Test
public void should_reset_selected_parameter_to_first_parameter_as_selected_parameter_when_new_parameters_are_set() {
// given
List<IParameter> parameters = Arrays.asList(
mockParameter("n1", "v1"),
mockParameter("n2", "v2"),
mockParameter("n3", "v3")
);
model.setParameters(parameters);
model.setSelectedParameter(parameters.get(1));
assertThat(model.getSelectedParameter().getName()).isEqualTo("n2");
// when
model.setParameters(Arrays.asList(
mockParameter("n10", "v10"),
mockParameter("n20", "v20"),
mockParameter("n30", "v30")
));
// then
assertThat(model.getSelectedParameter()).isNotNull();
assertThat(model.getSelectedParameter().getName()).isEqualTo("n10");
}
private IParameter mockParameter(String name, String value) {
IParameter parameter = mock(IParameter.class);
doReturn(name).when(parameter).getName();
doReturn(value).when(parameter).getValue();
return parameter;
}
@Test
public void getParametersShouldReturnAParameterMapWhenTemplateIsNotNull() {
Map<String, IParameter> parameters = givenTheTemplateHasParameters();
whenTemplateIsSelected();
assertArrayEquals(parameters.values().toArray(), model.getParameters().toArray());
}
private void whenTemplateIsSelected() {
whenTemplateIsSelected(template);
}
private void whenTemplateIsSelected(ITemplate template) {
model.propertyChange(
new PropertyChangeEvent(this,
IApplicationSourceListPageModel.PROPERTY_SELECTED_APP_SOURCE,
null,
new TemplateApplicationSource(template)));
}
private HashMap<String, String> givenTheTemplateHasObjectLabels() {
HashMap<String, String> labels = new HashMap<>();
labels.put("abc", "xyz");
when(template.getObjectLabels()).thenReturn(labels);
return labels;
}
private Map<String, IParameter> givenTheTemplateHasParameters() {
IParameter param = mock(IParameter.class);
when(param.getName()).thenReturn("foo");
when(param.clone()).thenReturn(param);
Map<String, IParameter> parameters = new HashMap<>();
parameters.put(param.getName(), param );
when(template.getParameters()).thenReturn(parameters);
return parameters;
}
}