Package hudson.plugins.im.bot

Source Code of hudson.plugins.im.bot.BuildCommandTest

package hudson.plugins.im.bot;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;

import java.util.List;

import hudson.model.Item;
import hudson.model.ParameterValue;
import hudson.model.AbstractProject;
import hudson.model.BooleanParameterValue;
import hudson.model.Cause;
import hudson.model.FreeStyleProject;
import hudson.model.ParameterDefinition;
import hudson.model.ParametersAction;
import hudson.model.ParametersDefinitionProperty;
import hudson.model.BooleanParameterDefinition;
import hudson.model.RunParameterDefinition;
import hudson.model.RunParameterValue;
import hudson.model.StringParameterDefinition;
import hudson.model.StringParameterValue;
import hudson.plugins.im.Sender;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;

public class BuildCommandTest {

    private FreeStyleProject project;
    private List<ParameterValue> parsedParameters;

    @Test
    public void testDelay() {
        Bot bot = mock(Bot.class);
        when(bot.getImId()).thenReturn("hudsonbot");

        BuildCommand cmd = new BuildCommand();
        JobProvider jobProvider = mock(JobProvider.class);
        cmd.setJobProvider(jobProvider);
       
        AbstractProject<?, ?> project = mockProject(jobProvider);
       
        Sender sender = new Sender("sender");
       
        cmd.getReply(bot, sender, new String[]{ "build", "project", "5s" });
        verify(project).hasPermission(Item.BUILD);
        verify(project).scheduleBuild(eq(5), Mockito.any(Cause.class));
       
        project = mockProject(jobProvider);
        cmd.getReply(bot, sender, new String[]{ "build", "project", "5" });
        verify(project).hasPermission(Item.BUILD);
        verify(project).scheduleBuild(eq(5), Mockito.any(Cause.class));
       
        project = mockProject(jobProvider);
        cmd.getReply(bot, sender, new String[]{ "build", "project", "1m" });
        verify(project).hasPermission(Item.BUILD);
        verify(project).scheduleBuild(eq(60), Mockito.any(Cause.class));
       
        project = mockProject(jobProvider);
        cmd.getReply(bot, sender, new String[]{ "build", "project", "1min" });
        verify(project).hasPermission(Item.BUILD);
        verify(project).scheduleBuild(eq(60), Mockito.any(Cause.class));
       
        project = mockProject(jobProvider);
        cmd.getReply(bot, sender, new String[]{ "build", "project", "2h" });
        verify(project).hasPermission(Item.BUILD);
        verify(project).scheduleBuild(eq(7200), Mockito.any(Cause.class));
       
        // TODO kutzi: this doesn't work, yet. Catch typo before 's'
        //Mockito.reset(project);
        //when(project.getQuietPeriod()).thenReturn(42);
        //cmd.getReply("sender", new String[]{ "build", "project", "1as" });
        //verify(project).scheduleBuild(eq(42), (Cause) Mockito.any());
    }

    @SuppressWarnings("unchecked")
    private AbstractProject<?, ?> mockProject(JobProvider jobProvider) {
        @SuppressWarnings("rawtypes")
        AbstractProject project = mock(FreeStyleProject.class);
        when(jobProvider.getJobByNameOrDisplayName(Mockito.anyString())).thenReturn(project);
        when(project.hasPermission(Item.BUILD)).thenReturn(Boolean.TRUE);
        when(project.isBuildable()).thenReturn(true);
        return project;
    }
   
    @Test
    public void parametersFromCommandShouldBePassedToBuild() {
        Bot bot = mock(Bot.class);
        when(bot.getImId()).thenReturn("hudsonbot");

        BuildCommand cmd = new BuildCommand();
        JobProvider jobProvider = mock(JobProvider.class);
        cmd.setJobProvider(jobProvider);
       
        AbstractProject<?, ?> project = mockProject(jobProvider);
        project = mockProject(jobProvider);
        when(project.isParameterized()).thenReturn(Boolean.TRUE);
        when(project.getProperty(ParametersDefinitionProperty.class)).thenReturn(
                new ParametersDefinitionProperty(
                        new StringParameterDefinition("key", "default value", ""),
                        new BooleanParameterDefinition("key2", false, "")));
       
        Sender sender = new Sender("sender");
        cmd.getReply(bot, sender, new String[]{ "build", "project", "3s", "key=value", "key2=true" });
       
        ArgumentCaptor<ParametersAction> captor = ArgumentCaptor.forClass(ParametersAction.class);
        verify(project).scheduleBuild(anyInt(), any(Cause.class),
                captor.capture());
       
        Assert.assertEquals(2, captor.getValue().getParameters().size());
        Assert.assertEquals(new StringParameterValue("key", "value"),
                captor.getValue().getParameters().get(0));
        Assert.assertEquals(new BooleanParameterValue("key2", true),
                captor.getValue().getParameters().get(1));
    }
   
    @Test
    public void unknownParametersShouldBeIgnored() {
        // TODO: really? Shouldn't we better raise an error?
        Bot bot = mock(Bot.class);
        when(bot.getImId()).thenReturn("hudsonbot");

        BuildCommand cmd = new BuildCommand();
        JobProvider jobProvider = mock(JobProvider.class);
        cmd.setJobProvider(jobProvider);
       
        AbstractProject<?, ?> project = mockProject(jobProvider);
        when(project.isParameterized()).thenReturn(Boolean.TRUE);
        when(project.getProperty(ParametersDefinitionProperty.class)).thenReturn(
                new ParametersDefinitionProperty(new StringParameterDefinition("key", "default value", "")));
       
        Sender sender = new Sender("sender");
        cmd.getReply(bot, sender, new String[]{ "build", "project", "key=value", "unexisting_key=value" });
       
        ArgumentCaptor<ParametersAction> captor = ArgumentCaptor.forClass(ParametersAction.class);
        verify(project).scheduleBuild(anyInt(), any(Cause.class),
                captor.capture());
       
        assertEquals(1, captor.getValue().getParameters().size());
        assertEquals(new StringParameterValue("key", "value"),
                captor.getValue().getParameters().get(0));
    }
   
    @Test
    public void shouldParseRunParameter() {
        givenAParametrizedProject().withParameterDefinitions(
                new RunParameterDefinition("run", "projectName", "description")
        );
       
        whenParametersAreParsed("run=job#123");
       
        assertEquals(1, parsedParameters.size());
        ParameterValue parameter = parsedParameters.get(0);
        assertTrue(parameter instanceof RunParameterValue);
        RunParameterValue passwordParameter = (RunParameterValue) parameter;
        assertEquals("123", passwordParameter.getNumber());
        assertEquals("job", passwordParameter.getJobName());
    }
   
    @Test
    public void shouldTakeDefaultValueOfParameter() {
        givenAParametrizedProject().withParameterDefinitions(
                new StringParameterDefinition("stringParam", "defaultValue", "description")
        );
       
        whenParametersAreParsed();
       
        assertEquals(1, parsedParameters.size());
        assertEquals(new StringParameterValue("stringParam", "defaultValue"), parsedParameters.get(0));
    }
   
    private BuildCommandTest givenAParametrizedProject() {
        this.project = mock(FreeStyleProject.class);
        when(project.isParameterized()).thenReturn(true);
        return this;
    }
   
    private void withParameterDefinitions(ParameterDefinition... definitions) {
        when(project.getProperty(ParametersDefinitionProperty.class)).thenReturn(
                new ParametersDefinitionProperty(definitions));
    }
   
    private void whenParametersAreParsed(String... parameters) {
        BuildCommand cmd = new BuildCommand();
        this.parsedParameters = cmd.parseBuildParameters(parameters, project, new StringBuilder());
    }
   
    @Test
    public void disabledProjectShouldNotBeScheduled() {
        Bot bot = mock(Bot.class);
        when(bot.getImId()).thenReturn("hudsonbot");

        BuildCommand cmd = new BuildCommand();
        JobProvider jobProvider = mock(JobProvider.class);
        cmd.setJobProvider(jobProvider);
       
        AbstractProject<?, ?> project = mockProject(jobProvider);
        when(project.isBuildable()).thenReturn(false);
       
        Sender sender = new Sender("sender");
        cmd.getReply(bot, sender, new String[]{"build", "project"});
       
        verify(project, times(0)).scheduleBuild(anyInt(), any(Cause.class));
    }
}
TOP

Related Classes of hudson.plugins.im.bot.BuildCommandTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.