Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Badge settings #372

Merged
merged 9 commits into from
Nov 25, 2021
2 changes: 1 addition & 1 deletion build-monitor-acceptance/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@
</environmentVariables>
<forkCount>2</forkCount>
<reuseForks>false</reuseForks>
<rerunFailingTestsCount>${surefire.rerunFailingTestsCount}</rerunFailingTestsCount>
<rerunFailingTestsCount>2</rerunFailingTestsCount>
<redirectTestOutputToFile>false</redirectTestOutputToFile>
<reportNameSuffix>${jenkins.version}</reportNameSuffix>
</configuration>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.configuration;

import net.serenitybdd.screenplay.Actor;
import net.serenitybdd.screenplay.Task;
import net.serenitybdd.screenplay.actions.SelectFromOptions;
import net.serenitybdd.screenplay.jenkins.user_interface.ViewConfigurationPage;
import net.serenitybdd.screenplayx.actions.Scroll;
import net.thucydides.core.annotations.Step;

import static net.serenitybdd.screenplay.Tasks.instrumented;

public class DisplayBadges implements Task {
public static DisplayBadges asAUserSetting() {
return instrumented(DisplayBadges.class, "User Setting");
}

public static DisplayBadges always() {
return instrumented(DisplayBadges.class, "Always");
}

public static DisplayBadges never() {
return instrumented(DisplayBadges.class, "Never");
}

@Step("{0} selects #text as the option to display badges")
@Override
public <T extends Actor> void performAs(T actor) {
actor.attemptsTo(
Scroll.to(ViewConfigurationPage.Display_Badges),
SelectFromOptions.byVisibleText(text).from(ViewConfigurationPage.Display_Badges)
);
}

public DisplayBadges(String text) {
this.text = text;
}

private final String text;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.configuration;

import net.serenitybdd.screenplay.Actor;
import net.serenitybdd.screenplay.Task;
import net.serenitybdd.screenplay.actions.SelectFromOptions;
import net.serenitybdd.screenplay.jenkins.user_interface.ViewConfigurationPage;
import net.serenitybdd.screenplayx.actions.Scroll;
import net.thucydides.core.annotations.Step;

import static net.serenitybdd.screenplay.Tasks.instrumented;

public class DisplayBadgesFrom implements Task {
public static DisplayBadgesFrom theLastBuild() {
return instrumented(DisplayBadgesFrom.class, "Last Build");
}

public static DisplayBadgesFrom theLastCompletedBuild() {
return instrumented(DisplayBadgesFrom.class, "Last Completed Build");
}

@Step("{0} selects to display badges from #text")
@Override
public <T extends Actor> void performAs(T actor) {
actor.attemptsTo(
Scroll.to(ViewConfigurationPage.Display_Badges_From),
SelectFromOptions.byVisibleText(text).from(ViewConfigurationPage.Display_Badges_From)
);
}

public DisplayBadgesFrom(String text) {
this.text = text;
}

private final String text;
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ public static Task fromSubfolders() {
public <T extends Actor> void performAs(T actor) {
actor.attemptsTo(
Scroll.to(ViewConfigurationPage.Recurse_In_Subfolders),
// In case we scroll up and field is under the breadcrumb overlay
Scroll.to(ViewConfigurationPage.Status_Filter),
Choose.the(ViewConfigurationPage.Recurse_In_Subfolders)
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
import net.serenitybdd.screenplay.targets.Target;

public class ViewConfigurationPage {
public static final Target Status_Filter = Setting.defining("Status Filter");
public static final Target Recurse_In_Subfolders = Target.the("the 'Recurse in subfolders' option").locatedBy("#recurse");
public static final Target Status_Filter = Setting.defining("Status Filter");
public static final Target Recurse_In_Subfolders = Target.the("the 'Recurse in subfolders' option").locatedBy("#recurse");
public static final Target Use_Regular_Expression = Checkbox.withLabel("Use a regular expression to include jobs into the view");
public static final Target Regular_Expression = Target.the("the 'Regular expression' field").located(By.name("includeRegex"));
public static final Target Display_Badges = Target.the("the 'Display badges' field").located(By.name("displayBadges"));
public static final Target Display_Badges_From = Target.the("the 'Display badges from' field").located(By.name("displayBadgesFrom"));
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,67 @@
import net.serenitybdd.screenplay.Action;
import net.serenitybdd.screenplay.Actor;
import net.serenitybdd.screenplay.targets.Target;

import java.util.HashMap;
import java.util.Map;

import org.openqa.selenium.WebElement;

public class ScrollToTarget implements Action {

private static final Map<String, String> centerAlignOptions;

static {
centerAlignOptions = new HashMap<>();
centerAlignOptions.put("behavior", "auto");
centerAlignOptions.put("block", "center");
centerAlignOptions.put("inline", "center");
}

private final Target target;
private boolean alignToTop = true;
private String alignTo = "middle";

public ScrollToTarget(Target target) {
this.target = target;
}

public ScrollToTarget andAlignToTop() {
this.alignToTop = true;
this.alignTo = "top";

return this;
}

public ScrollToTarget andAlignToBottom() {
this.alignToTop = false;
this.alignTo = "bottom";

return this;
}

public ScrollToTarget andAlignInMiddle() {
this.alignTo = "middle";

return this;
}

public <T extends Actor> void performAs(T actor) {
actor.attemptsTo(
scrollTo(target.resolveFor(actor), alignToTop)
actor.attemptsTo(scrollTo(target.resolveFor(actor), alignTo)
);
}

private Evaluate scrollTo(WebElement element, boolean alignToTop) {
return Evaluate.javascript("arguments[0].scrollIntoView(arguments[1]);", element, alignToTop);
private Evaluate scrollTo(WebElement element, String alignTo) {
Object args;
switch (alignTo) {
case "top":
args = Boolean.TRUE;
break;
case "bottom":
args = Boolean.FALSE;
break;
default:
args = centerAlignOptions;
break;
}

return Evaluate.javascript("arguments[0].scrollIntoView(arguments[1]);", element, args);
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package features;

import com.smartcodeltd.jenkinsci.plugins.build_monitor.questions.ProjectWidget;
import com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.HaveABuildMonitorViewCreated;
import com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.CreateABuildMonitorView;
import com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.ModifyControlPanelOptions;
import com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.ShowBadges;
import com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.configuration.DisplayAllProjects;
import com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.configuration.DisplayBadges;
import com.smartcodeltd.jenkinsci.plugins.build_monitor.tasks.configuration.DisplayBadgesFrom;
import net.serenitybdd.integration.jenkins.JenkinsInstance;
import net.serenitybdd.integration.jenkins.environment.rules.ApplicativeTestRule;
import net.serenitybdd.integration.jenkins.environment.rules.InstallPlugins;
import net.serenitybdd.screenplay.Actor;
import net.serenitybdd.screenplay.abilities.BrowseTheWeb;
import net.serenitybdd.screenplay.jenkins.HaveAPipelineProjectCreated;
import net.serenitybdd.screenplay.jenkins.tasks.ScheduleABuild;
import net.serenitybdd.screenplay.jenkins.tasks.configuration.build_steps.GroovyScriptThat;
import net.serenitybdd.screenplay.jenkins.tasks.configuration.build_steps.SetPipelineDefinition;
import net.serenitybdd.screenplayx.actions.Navigate;
import net.thucydides.junit.annotations.TestData;
Expand All @@ -23,7 +25,9 @@
import static net.serenitybdd.screenplay.GivenWhenThen.seeThat;
import static net.serenitybdd.screenplay.GivenWhenThen.then;
import static net.serenitybdd.screenplay.GivenWhenThen.when;
import static net.serenitybdd.screenplay.jenkins.tasks.configuration.build_steps.GroovyScriptThat.Adds_A_Badge;
import static net.serenitybdd.screenplay.matchers.WebElementStateMatchers.isCurrentlyVisible;
import static net.serenitybdd.screenplay.matchers.WebElementStateMatchers.isNotCurrentlyVisible;

import java.util.Collection;
import java.util.Collections;
Expand Down Expand Up @@ -52,21 +56,68 @@ public void actorCanBrowseTheWeb() {
}

@Test
public void displaying_build_badges() {
public void user_displaying_build_badges() {
givenThat(paul).wasAbleTo(
Navigate.to(jenkins.url()),
HaveAPipelineProjectCreated.called("My App").andConfiguredTo(
SetPipelineDefinition.asFollows(GroovyScriptThat.Adds_A_Badge.code())
SetPipelineDefinition.asFollows(Adds_A_Badge.code())
),

ScheduleABuild.of("My App"),
HaveABuildMonitorViewCreated.showingAllTheProjects()
CreateABuildMonitorView.called("Build Monitor").andConfigureItTo(
DisplayAllProjects.usingARegularExpression(),
DisplayBadges.asAUserSetting(),
DisplayBadgesFrom.theLastBuild()
)
);

when(paul).attemptsTo(ModifyControlPanelOptions.to(ShowBadges.onTheDashboard()));

then(paul).should(seeThat(ProjectWidget.of("My App").badges(),
isCurrentlyVisible()
isCurrentlyVisible()
));
}

@Test
public void always_displaying_build_badges() {
givenThat(paul).wasAbleTo(
Navigate.to(jenkins.url()),
HaveAPipelineProjectCreated.called("My App").andConfiguredTo(
SetPipelineDefinition.asFollows(Adds_A_Badge.code())
),
ScheduleABuild.of("My App")
);

when(paul).attemptsTo(CreateABuildMonitorView.called("Build Monitor").andConfigureItTo(
DisplayAllProjects.usingARegularExpression(),
DisplayBadges.always(),
DisplayBadgesFrom.theLastBuild()
));

then(paul).should(seeThat(ProjectWidget.of("My App").badges(),
isCurrentlyVisible()
));
}

@Test
public void never_displaying_build_badges() {
givenThat(paul).wasAbleTo(
Navigate.to(jenkins.url()),
HaveAPipelineProjectCreated.called("My App").andConfiguredTo(
SetPipelineDefinition.asFollows(Adds_A_Badge.code())
),
ScheduleABuild.of("My App"),
CreateABuildMonitorView.called("Build Monitor").andConfigureItTo(
DisplayAllProjects.usingARegularExpression(),
DisplayBadges.never(),
DisplayBadgesFrom.theLastBuild()
)
);

when(paul).attemptsTo(ModifyControlPanelOptions.to(ShowBadges.onTheDashboard()));

then(paul).should(seeThat(ProjectWidget.of("My App").badges(),
isNotCurrentlyVisible()
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.api.Respond;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.build.GetBuildViewModel;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.facade.StaticJenkinsAPIs;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.installation.BuildMonitorInstallation;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.JobView;
Expand Down Expand Up @@ -95,6 +96,16 @@ public boolean isDisplayCommitters() {
return currentConfig().shouldDisplayCommitters();
}

@SuppressWarnings("unused") // used in the configure-entries.jelly form
public String currentDisplayBadges() {
return currentConfig().getDisplayBadges().name();
}

@SuppressWarnings("unused") // used in the configure-entries.jelly form
public String currentDisplayBadgesFrom() {
return currentConfig().getDisplayBadgesFrom().getClass().getSimpleName();
}

private static final BuildMonitorInstallation installation = new BuildMonitorInstallation();

@SuppressWarnings("unused") // used in index.jelly
Expand All @@ -120,8 +131,10 @@ protected void submit(StaplerRequest req) throws ServletException, IOException,
synchronized (this) {

String requestedOrdering = req.getParameter("order");
String displayBadgesFrom = req.getParameter("displayBadgesFrom");
title = req.getParameter("title");

currentConfig().setDisplayBadges(req.getParameter("displayBadges"));
currentConfig().setDisplayCommitters(json.optBoolean("displayCommitters", true));
currentConfig().setBuildFailureAnalyzerDisplayedField(req.getParameter("buildFailureAnalyzerDisplayedField"));

Expand All @@ -130,6 +143,12 @@ protected void submit(StaplerRequest req) throws ServletException, IOException,
} catch (Exception e) {
throw new FormException("Can't order projects by " + requestedOrdering, "order");
}

try {
currentConfig().setDisplayBadgesFrom(getBuildViewModelIn(displayBadgesFrom));
} catch (Exception e) {
throw new FormException("Can't display badges from " + displayBadgesFrom, "displayBadgesFrom");
}
}
}

Expand Down Expand Up @@ -212,6 +231,12 @@ private void migrateFromOldToNewConfigFormat() {
return (Comparator<Job<?, ?>>) Class.forName(packageName + requestedOrdering).newInstance();
}

private GetBuildViewModel getBuildViewModelIn(String requestedBuild) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
String packageName = this.getClass().getPackage().getName() + ".build.";

return (GetBuildViewModel) Class.forName(packageName + requestedBuild).newInstance();
}

private Config config;

@Deprecated // use Config instead
Expand Down
Loading