Skip to content

Commit

Permalink
Gracefully handle empty icon for summaries
Browse files Browse the repository at this point in the history
  • Loading branch information
strangelookingnerd committed Nov 19, 2024
1 parent d9f8ec7 commit 40d0c0d
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
package com.jenkinsci.plugins.badge.action;

import java.io.Serial;
import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.Whitelisted;
Expand All @@ -36,10 +39,25 @@ public class BadgeSummaryAction extends AbstractBadgeAction {
@Serial
private static final long serialVersionUID = 1L;

private static final Logger LOGGER = Logger.getLogger(BadgeSummaryAction.class.getName());

public BadgeSummaryAction(String id, String icon, String text, String cssClass, String style, String link) {
super(id, icon, text, cssClass, style, link);
}

@Whitelisted
@Override
public String getIcon() {
String icon = super.getIcon();

if (StringUtils.isBlank(icon)) {
LOGGER.log(Level.WARNING, () -> "Invalid icon value: '" + icon + "' - using empty icon instead");
return Jenkins.RESOURCE_PATH + "/images/16x16/empty.png";
}

return icon;
}

@Override
public String getDisplayName() {
return "Badge Summary Action";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,9 @@ THE SOFTWARE.

<?jelly escape-by-default='false'?>
<j:jelly xmlns:j="jelly:core" xmlns:t="/lib/hudson">
<j:if test="${it.icon != null &amp;&amp; it.icon != ''}">
<t:summary icon="${it.icon}" href="${it.link}">
<span class="${it.cssClass}" style="${it.style}">
${it.text}
</span>
</t:summary>
</j:if>
<t:summary icon="${it.icon}" href="${it.link}">
<span class="${it.cssClass}" style="${it.style}">
${it.text}
</span>
</t:summary>
</j:jelly>
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,76 @@
*/
package com.jenkinsci.plugins.badge.action;

import static org.junit.jupiter.api.Assertions.assertEquals;

import io.jenkins.plugins.emoji.symbols.Emojis;
import io.jenkins.plugins.ionicons.Ionicons;
import jenkins.model.Jenkins;
import org.junit.jupiter.api.Test;
import org.jvnet.hudson.test.JenkinsRule;

class BadgeSummaryActionTest extends AbstractBadgeActionTest {

@Override
@Test
void icon(@SuppressWarnings("unused") JenkinsRule r) {
AbstractBadgeAction action = createAction("id", null, "text", "cssClass", "style", "link");
assertEquals(Jenkins.RESOURCE_PATH + "/images/16x16/empty.png", action.getIcon());

action.setIcon("");
assertEquals(Jenkins.RESOURCE_PATH + "/images/16x16/empty.png", action.getIcon());

action.setIcon("icon.png");
assertEquals(Jenkins.RESOURCE_PATH + "/images/16x16/icon.png", action.getIcon());

action.setIcon("/relative/url/icon.png");
assertEquals("/relative/url/icon.png", action.getIcon());

action.setIcon("symbol-rocket plugin-ionicons-api");
assertEquals("symbol-rocket plugin-ionicons-api", action.getIcon());

action.setIcon("symbol-cube");
assertEquals("symbol-cube", action.getIcon());

action.setIcon("icon-gear");
assertEquals("icon-gear", action.getIcon());

action.setIcon("https://host.domain/icon.png");
assertEquals("https://host.domain/icon.png", action.getIcon());

action.setIcon("completed.gif");
assertEquals("symbol-status-blue", action.getIcon());
action.setIcon("db_in.gif");
assertEquals(Ionicons.getIconClassName("cloud-upload-outline"), action.getIcon());
action.setIcon("db_out.gif");
assertEquals(Ionicons.getIconClassName("cloud-download-outline"), action.getIcon());
action.setIcon("delete.gif");
assertEquals("symbol-trash", action.getIcon());
action.setIcon("error.gif");
assertEquals("symbol-status-red", action.getIcon());
action.setIcon("folder.gif");
assertEquals("symbol-folder", action.getIcon());
action.setIcon("green.gif");
assertEquals(Emojis.getIconClassName("green_square"), action.getIcon());
action.setIcon("info.gif");
assertEquals("symbol-information-circle", action.getIcon());
action.setIcon("red.gif");
assertEquals(Emojis.getIconClassName("red_square"), action.getIcon());
action.setIcon("save.gif");
assertEquals(Ionicons.getIconClassName("save-outline"), action.getIcon());
action.setIcon("success.gif");
assertEquals("symbol-status-blue", action.getIcon());
action.setIcon("text.gif");
assertEquals("symbol-document-text", action.getIcon());
action.setIcon("warning.gif");
assertEquals("symbol-status-yellow", action.getIcon());
action.setIcon("yellow.gif");
assertEquals(Emojis.getIconClassName("yellow_square"), action.getIcon());

action.setIcon("blue.gif");
assertEquals(Jenkins.RESOURCE_PATH + "/images/16x16/blue.gif", action.getIcon());
}

@Override
protected AbstractBadgeAction createAction(
String id, String icon, String text, String cssClass, String style, String link) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

import com.jenkinsci.plugins.badge.action.BadgeSummaryAction;
import java.util.List;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
import org.junit.jupiter.api.Test;
import org.jvnet.hudson.test.JenkinsRule;
Expand All @@ -53,7 +55,11 @@ protected void assertFields(AbstractAddBadgeStep step, WorkflowRun run) {

BadgeSummaryAction action = summaryActions.get(0);
assertEquals(step.getId(), action.getId());
assertEquals(step.getIcon(), action.getIcon());
if (StringUtils.isEmpty(step.getIcon())) {
assertEquals(Jenkins.RESOURCE_PATH + "/images/16x16/empty.png", action.getIcon());
} else {
assertEquals(step.getIcon(), action.getIcon());
}
assertEquals(step.getText(), action.getText());
assertEquals(step.getCssClass(), action.getCssClass());
assertEquals(step.getStyle(), action.getStyle());
Expand Down

0 comments on commit 40d0c0d

Please sign in to comment.