/*******************************************************************************
* 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.
******************************************************************************/
package com.openshift.internal.restclient.model.v1;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.jboss.dmr.ModelNode;
import org.junit.BeforeClass;
import org.junit.Test;
import com.openshift.internal.restclient.ResourceFactory;
import com.openshift.internal.restclient.model.BuildConfig;
import com.openshift.internal.restclient.model.ModelNodeBuilder;
import com.openshift.internal.restclient.model.build.GitBuildSource;
import com.openshift.internal.restclient.model.build.ImageChangeTrigger;
import com.openshift.internal.restclient.model.build.SourceBuildStrategy;
import com.openshift.internal.restclient.model.build.WebhookTrigger;
import com.openshift.restclient.IClient;
import com.openshift.restclient.ResourceKind;
import com.openshift.restclient.images.DockerImageURI;
import com.openshift.restclient.model.IBuildConfig;
import com.openshift.restclient.model.IEnvironmentVariable;
import com.openshift.restclient.model.build.BuildSourceType;
import com.openshift.restclient.model.build.BuildStrategyType;
import com.openshift.restclient.model.build.BuildTriggerType;
import com.openshift.restclient.model.build.IBuildSource;
import com.openshift.restclient.model.build.IBuildStrategy;
import com.openshift.restclient.model.build.IBuildTrigger;
import com.openshift.restclient.model.build.IGitBuildSource;
import com.openshift.restclient.model.build.ISourceBuildStrategy;
import com.openshift.restclient.utils.Samples;
/**
* @author Jeff Cantrill
*/
public class BuildConfigTest {
private static final String VERSION = "v1";
private static IBuildConfig config;
private static IClient client;
@BeforeClass
public static void setup() throws Exception{
client = mock(IClient.class);
when(client.getBaseURL()).thenReturn(new URL("https://localhost:8443"));
when(client.getOpenShiftAPIVersion()).thenReturn(VERSION);
ModelNode node = ModelNode.fromJSONString(Samples.V1_BUILD_CONFIG.getContentAsString());
config = new BuildConfig(node, client, null);
}
@Test
public void getBuildTriggers(){
assertBuildTriggers(config.getBuildTriggers().toArray(new IBuildTrigger[]{}));
}
@Test
public void addBuildTriggers() {
BuildConfig writeConfig = new ResourceFactory(client){}.create(VERSION, ResourceKind.BUILD_CONFIG);
writeConfig.addBuildTrigger(new WebhookTrigger(BuildTriggerType.GITHUB, "secret101", "https://localhost:8443"));
writeConfig.addBuildTrigger(new WebhookTrigger(BuildTriggerType.GENERIC, "secret101", "https://localhost:8443"));
writeConfig.addBuildTrigger(new ImageChangeTrigger("", "", ""));
assertBuildTriggers(reCreateBuildConfig(writeConfig).getBuildTriggers().toArray(new IBuildTrigger[]{}));
}
@Test
public void getOutputRespositoryName(){
assertEquals("origin-ruby-sample:latest", config.getOutputRepositoryName());
}
@Test
public void getSourceURI(){
assertEquals("git://github.com/openshift/ruby-hello-world.git", config.getSourceURI());
}
@Test
public void getGitBuildSource(){
IBuildSource source = config.getBuildSource();
assertGitBuildSource(source);
}
@Test
public void setGitBuildSource() {
BuildConfig writeConfig = new ResourceFactory(client){}.create(VERSION, ResourceKind.BUILD_CONFIG);
Map<String, String> env = new HashMap<String, String>();
env.put("foo", "bar");
writeConfig.setBuildSource(new GitBuildSource("git://github.com/openshift/ruby-hello-world.git", "", "foobar"));
assertGitBuildSource(reCreateBuildConfig(writeConfig).getBuildSource());
}
@Test
public void getSourceBuildStrategy() {
IBuildStrategy strategy = config.getBuildStrategy();
assertSourceBuildStrategy(strategy);
}
@Test
public void setSourceBuildStrategy() {
BuildConfig writeConfig = new ResourceFactory(client){}.create(VERSION, ResourceKind.BUILD_CONFIG);
ModelNode node = new ModelNodeBuilder()
.set("type", BuildStrategyType.SOURCE)
.set(SourceBuildStrategy.FROM_IMAGE, "ruby-20-centos7:latest")
.set(SourceBuildStrategy.SCRIPTS, "alocation")
.set(SourceBuildStrategy.INCREMENTAL, true)
.add(SourceBuildStrategy.ENV, new ModelNodeBuilder()
.set("name", "foo")
.set("value", "bar"))
.build();
writeConfig.setBuildStrategy(new SourceBuildStrategy(node, new HashMap<>()));
assertSourceBuildStrategy(reCreateBuildConfig(writeConfig).getBuildStrategy());
}
private void assertBuildTriggers(IBuildTrigger[] triggers) {
IBuildTrigger [] exp = new IBuildTrigger[]{
new WebhookTrigger(BuildTriggerType.GITHUB, "secret101","https://localhost:8443"),
new WebhookTrigger(BuildTriggerType.GENERIC, "secret101","https://localhost:8443"),
new ImageChangeTrigger("", "", "")
};
assertArrayEquals(exp, triggers);
}
private void assertGitBuildSource(IBuildSource source) {
assertEquals(BuildSourceType.GIT, source.getType());
assertEquals("git://github.com/openshift/ruby-hello-world.git", source.getURI());
assertEquals("foobar", source.getContextDir());
assertTrue(source instanceof IGitBuildSource);
IGitBuildSource git = (IGitBuildSource)source;
assertEquals("Exp. to get the source ref","", git.getRef());
}
private void assertSourceBuildStrategy(IBuildStrategy strategy) {
assertEquals(BuildStrategyType.SOURCE, strategy.getType());
assertTrue(strategy instanceof ISourceBuildStrategy);
ISourceBuildStrategy source = (ISourceBuildStrategy)strategy;
assertEquals(new DockerImageURI("ruby-20-centos7:latest"), source.getImage());
assertEquals("alocation", source.getScriptsLocation());
assertEquals(true, source.incremental());
Map<String, String> envVars = source.getEnvironmentVariables();
assertEquals(1, envVars.size());
assertTrue("Exp. to find the environment variable",envVars.containsKey("foo"));
assertEquals("bar",envVars.get("foo"));
envVars.put("newKey", "newValue");
source.setEnvironmentVariables(envVars);
envVars = source.getEnvironmentVariables();
assertEquals(2, envVars.size());
assertTrue("Exp. to find the environment variable",envVars.containsKey("newKey"));
assertEquals("newValue",envVars.get("newKey"));
Collection<IEnvironmentVariable> vars = source.getEnvVars();
assertTrue(vars.stream().filter(e->"newKey".equals(e.getName())).findFirst().isPresent());
vars.remove(vars.toArray()[0]);
source.setEnvVars(vars);
vars = source.getEnvVars();
assertEquals(1, vars.size());
}
private BuildConfig reCreateBuildConfig(BuildConfig config) {
return new BuildConfig(config.getNode(), client, null);
}
}