diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/index.test.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/index.test.js
new file mode 100644
index 000000000..9c71d5cac
--- /dev/null
+++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/index.test.js
@@ -0,0 +1,173 @@
+import React from "react";
+
+import { Provider } from "mobx-react";
+
+import { mount } from "enzyme";
+
+import moment from "moment";
+
+import { MockAlert, MockAlertGroup } from "__mocks__/Alerts.js";
+import { AlertStore } from "Stores/AlertStore";
+import { Settings } from "Stores/Settings";
+import { SilenceFormStore } from "Stores/SilenceFormStore";
+import { AlertGroup } from ".";
+
+let alertStore;
+let settingsStore;
+let silenceFormStore;
+let group;
+
+const MockGroup = (groupName, alertCount) => {
+ const group = MockAlertGroup(
+ { alertname: "Fake Alert", group: groupName },
+ [],
+ [],
+ {}
+ );
+ return group;
+};
+
+beforeEach(() => {
+ alertStore = new AlertStore([]);
+ settingsStore = new Settings();
+ silenceFormStore = new SilenceFormStore();
+ group = MockGroup();
+});
+
+const MockAlerts = alertCount => {
+ for (let i = 1; i <= alertCount; i++) {
+ let alert = MockAlert([], { instance: `instance${i}` });
+ const startsAt = moment().toISOString();
+ alert.startsAt = startsAt;
+ alert.alertmanager[0].startsAt = startsAt;
+ group.alerts.push(alert);
+ }
+};
+
+const MountedAlertGroup = (afterUpdate, showAlertmanagers) => {
+ return mount(
+
+
+
+ );
+};
+
+describe("", () => {
+ it("renders Alertmanager labels in footer if showAlertmanagersInFooter=true", () => {
+ MockAlerts(2);
+ const tree = MountedAlertGroup(jest.fn(), true).find("AlertGroup");
+ expect(tree.find("GroupFooter").html()).toMatch(/@alertmanager: default/);
+ });
+
+ it("only renders titlebar when collapsed", () => {
+ MockAlerts(10);
+ const tree = MountedAlertGroup(jest.fn(), false);
+ const alertGroup = tree.find("AlertGroup");
+ alertGroup.instance().collapse.toggle();
+ expect(alertGroup.instance().collapse.value).toBe(true);
+ tree.update();
+ expect(tree.find("Alert")).toHaveLength(0);
+ expect(tree.find("ul.list-group")).toHaveLength(0);
+ });
+});
+
+const ValidateLoadButtonPresent = (totalAlerts, isPresent) => {
+ MockAlerts(totalAlerts);
+ const tree = MountedAlertGroup(jest.fn(), false);
+ const buttons = tree.find("button");
+ expect(buttons).toHaveLength(isPresent ? 2 : 0);
+};
+
+const ValidateLoadButtonAction = (
+ totalAlerts,
+ buttonIndex,
+ iconMatch,
+ loadedAlerts,
+ alertsToRenderBeforeClick
+) => {
+ MockAlerts(totalAlerts);
+ const tree = MountedAlertGroup(jest.fn(), false);
+ if (alertsToRenderBeforeClick !== undefined) {
+ tree
+ .find("AlertGroup")
+ .instance().renderConfig.alertsToRender = alertsToRenderBeforeClick;
+ tree.update();
+ }
+ const loadMore = tree.find("button").at(buttonIndex);
+ expect(loadMore.html()).toMatch(iconMatch);
+ loadMore.simulate("click");
+ tree.update();
+ expect(tree.find("Alert")).toHaveLength(loadedAlerts);
+};
+
+describe(" renderConfig", () => {
+ it("settingsStore.alertGroupConfig.config.defaultRenderCount should be 5 by default", () => {
+ expect(settingsStore.alertGroupConfig.config.defaultRenderCount).toBe(5);
+ });
+
+ it("renderConfig.alertsToRender should be 5 by default", () => {
+ const tree = MountedAlertGroup(jest.fn(), false).find("AlertGroup");
+ expect(tree.instance().renderConfig.alertsToRender).toBe(5);
+ });
+
+ it("renders only up to renderConfig.alertsToRender alerts", () => {
+ MockAlerts(50);
+ const tree = MountedAlertGroup(jest.fn(), false).find("AlertGroup");
+ const alerts = tree.find("Alert");
+ expect(alerts).toHaveLength(tree.instance().renderConfig.alertsToRender);
+ });
+
+ it("load buttons are not rendered for 1 alert", () => {
+ ValidateLoadButtonPresent(1, false);
+ });
+
+ it("load buttons are not rendered for 5 alerts", () => {
+ ValidateLoadButtonPresent(5, false);
+ });
+
+ it("load buttons are rendered for 6 alert", () => {
+ ValidateLoadButtonPresent(6, true);
+ });
+
+ it("clicking - icon hides 1 alert if there's 6 in total", () => {
+ ValidateLoadButtonAction(6, 0, /fa-minus/, 5, 6);
+ });
+
+ it("clicking - icon hides 1 alert if there's 6 in total and we're showing 3", () => {
+ ValidateLoadButtonAction(6, 0, /fa-minus/, 2, 3);
+ });
+
+ it("clicking - icon hides 2 alerts if there's 7 in total and we're showing 7", () => {
+ ValidateLoadButtonAction(7, 0, /fa-minus/, 5, 7);
+ });
+
+ it("clicking - icon hides 5 alerts if there's 10 in total and we're showing 10", () => {
+ ValidateLoadButtonAction(10, 0, /fa-minus/, 5, 10);
+ });
+
+ it("clicking - icon hides 5 alerts if there's 18 in total and we're showing 17", () => {
+ ValidateLoadButtonAction(18, 0, /fa-minus/, 12, 17);
+ });
+
+ it("clicking + icon loads 1 more alert if there's 6 in total", () => {
+ ValidateLoadButtonAction(6, 1, /fa-plus/, 6);
+ });
+
+ it("clicking + icon loads 4 more alert if there's 9 in total", () => {
+ ValidateLoadButtonAction(9, 1, /fa-plus/, 9);
+ });
+
+ it("clicking + icon loads 5 more alert if there's 14 in total", () => {
+ ValidateLoadButtonAction(14, 1, /fa-plus/, 10);
+ });
+
+ it("clicking + icon loads 5 more alert if there's 25 in total and we're showing 16", () => {
+ ValidateLoadButtonAction(25, 1, /fa-plus/, 22, 17);
+ });
+});