Skip to content

Commit ed0a83e

Browse files
MikeEdgarhemahgdependabot[bot]claudejankalinic
authored
Migrate from Next.js 14 / React 18 to Next.js 15 / React 19 (#2323)
* Migrate from Next.js 14 / React 18 to Next.js 15 / React 19 Signed-off-by: Michael Edgar <medgar@redhat.com> Co-authored-by: hemahg <hhg@redhat.com> Co-Authored-By: dependabot[bot] <support@github.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> Assisted-by: Claude Code (Sonnet 4.5) <noreply@anthropic.com> * Update to pre-prelease Patternfly dependencies Signed-off-by: Michael Edgar <medgar@redhat.com> * Additional fixes for Next.js 15 / React 19 - Fixes to theme icon selection - Additional async function promise conversion - Update timestamp when using in-app refresh button - Fix cluster connection detail drawer - Add missing project column in cluster table when OIDC is enabled - Remove broken auto-refresh on group members tab, topic groups listing, and topic partitions listing Signed-off-by: Michael Edgar <medgar@redhat.com> Assisted-by: Claude Code (Sonnet 4.5) <noreply@anthropic.com> * Consolidate `ThSortType` import to local `react-table` index Signed-off-by: Michael Edgar <medgar@redhat.com> * [ST] Adjusting CSS selector for application `<div>` element Signed-off-by: Michael Edgar <medgar@redhat.com> * Additional system test adjustments and fixes Signed-off-by: Michael Edgar <medgar@redhat.com> * Update topic and Kafka system tests Signed-off-by: Michael Edgar <medgar@redhat.com> * Add Kafka condition wait util, fix warnings list test Signed-off-by: Michael Edgar <medgar@redhat.com> * Remove Console pod stability polling Signed-off-by: Michael Edgar <medgar@redhat.com> * Remove commented code, create topics async Signed-off-by: Michael Edgar <medgar@redhat.com> * add root for nextjs Signed-off-by: jkalinic <jkalinic@redhat.com> --------- Signed-off-by: Michael Edgar <medgar@redhat.com> Signed-off-by: jkalinic <jkalinic@redhat.com> Co-authored-by: hemahg <hhg@redhat.com> Co-authored-by: dependabot[bot] <support@github.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by: jkalinic <jkalinic@redhat.com>
1 parent a0030f6 commit ed0a83e

140 files changed

Lines changed: 5071 additions & 4509 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

systemtests/src/main/java/com/github/streamshub/systemtests/locators/CssSelectors.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ public class CssSelectors {
1414
private CssSelectors() {}
1515

1616
public static final String PAGE_DIV = new CssBuilder()
17-
.withElementBody().withChild()
18-
.withElementDiv().nth(1)
17+
.withElementDiv().withId("root")
1918
.build();
2019

2120
// ----------------------------
@@ -31,22 +30,25 @@ private CssSelectors() {}
3130
.build();
3231

3332
// Keycloak
34-
public static final String LOGIN_KEYCLOAK_PAGE_TITLE = new CssBuilder(PAGE_DIV)
35-
.withDesc()
33+
public static final String LOGIN_KEYCLOAK_PAGE_TITLE = new CssBuilder()
3634
.withElementHeader().withId("kc-header")
3735
.build();
3836

39-
public static final String LOGIN_KEYCLOAK_USERNAME_INPUT = new CssBuilder(PAGE_DIV)
37+
public static final String LOGIN_KEYCLOAK_FORM = new CssBuilder()
38+
.withElementForm().withId("kc-form-login")
39+
.build();
40+
41+
public static final String LOGIN_KEYCLOAK_USERNAME_INPUT = new CssBuilder(LOGIN_KEYCLOAK_FORM)
4042
.withDesc()
4143
.withElementInput().withId("username")
4244
.build();
4345

44-
public static final String LOGIN_KEYCLOAK_PASSWORD_INPUT = new CssBuilder(PAGE_DIV)
46+
public static final String LOGIN_KEYCLOAK_PASSWORD_INPUT = new CssBuilder(LOGIN_KEYCLOAK_FORM)
4547
.withDesc()
4648
.withElementInput().withId("password")
4749
.build();
4850

49-
public static final String LOGIN_KEYCLOAK_SIGN_IN_BUTTON = new CssBuilder(PAGE_DIV)
51+
public static final String LOGIN_KEYCLOAK_SIGN_IN_BUTTON = new CssBuilder(LOGIN_KEYCLOAK_FORM)
5052
.withDesc()
5153
.withElementButton().withId("kc-login")
5254
.build();
@@ -100,7 +102,7 @@ private CssSelectors() {}
100102
.withElementDiv().withChild()
101103
.withElementButton().withComponentButton()
102104
.build();
103-
105+
104106
public static final String PAGES_CONTENT_HEADER_TITLE_CONTENT = new CssBuilder(PAGES_HEADER_CONTENT)
105107
.withElementDiv().withChild()
106108
.withElementH1().withComponentTitle()

systemtests/src/main/java/com/github/streamshub/systemtests/locators/MessagesPageSelectors.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ private MessagesPageSelectors() {}
4848

4949
public static final String MPS_TOOLBAR_POPOVER_FORM = new CssBuilder()
5050
.withElementBody().withChild()
51-
.withElementDiv().nth(3).withChild()
51+
.withElementDiv().nth(4).withChild()
5252
.withElementDiv().withComponentPanel().withChild()
5353
.withElementDiv().withComponentPanel().withSubComponentMain().withChild()
5454
.withElementDiv().withComponentPanel().withSubComponentMainBody().withChild()
@@ -306,8 +306,8 @@ public static String getTableRowItem(int nthRow, int nthColumn) {
306306
.withElementSpan().withComponentFormControl().withChild()
307307
.withElementInput()
308308
.build();
309-
310-
309+
310+
311311
public static final String MPS_MESSAGE_SIDEBAR = new CssBuilder(CssSelectors.PAGES_CONTENT)
312312
.withChild()
313313
.withElementDiv().withComponentPage().withSubComponentMainBody().withChild()

systemtests/src/main/java/com/github/streamshub/systemtests/setup/console/ConsoleInstanceSetup.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@
1111
import com.github.streamshub.console.api.v1alpha1.spec.security.Rule;
1212
import com.github.streamshub.systemtests.Environment;
1313
import com.github.streamshub.systemtests.constants.Constants;
14-
import com.github.streamshub.systemtests.constants.Labels;
1514
import com.github.streamshub.systemtests.setup.keycloak.KeycloakInstanceSetup;
1615
import com.github.streamshub.systemtests.setup.keycloak.KeycloakTestConfig;
17-
import com.github.streamshub.systemtests.utils.WaitUtils;
1816
import com.github.streamshub.systemtests.utils.resourceutils.ClusterUtils;
1917
import com.github.streamshub.systemtests.utils.resourceutils.ResourceUtils;
2018
import com.github.streamshub.systemtests.utils.resourceutils.console.ConsoleUtils;
@@ -39,8 +37,6 @@ public static void setupIfNeeded(Console console) {
3937
return;
4038
}
4139
KubeResourceManager.get().createResourceWithWait(console);
42-
WaitUtils.waitForPodsReadyAndStable(console.getMetadata().getNamespace(),
43-
Labels.getConsolePodSelector(console.getMetadata().getName()), 1, true);
4440
LOGGER.info("Console deployed and available at {}", ConsoleUtils.getConsoleUiUrl(console.getMetadata().getName(), true));
4541
}
4642

systemtests/src/main/java/com/github/streamshub/systemtests/utils/WaitUtils.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
package com.github.streamshub.systemtests.utils;
22

3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.concurrent.TimeUnit;
6+
import java.util.function.Function;
7+
import java.util.function.Predicate;
8+
import java.util.stream.Collectors;
9+
10+
import org.apache.logging.log4j.Logger;
11+
312
import com.github.streamshub.systemtests.clients.KafkaClients;
413
import com.github.streamshub.systemtests.constants.ResourceConditions;
514
import com.github.streamshub.systemtests.constants.TimeConstants;
@@ -11,6 +20,7 @@
1120
import com.github.streamshub.systemtests.utils.resourceutils.ResourceUtils;
1221
import com.github.streamshub.systemtests.utils.resourceutils.kafka.KafkaNamingUtils;
1322
import com.github.streamshub.systemtests.utils.resourceutils.keycloak.KeycloakApiUtils;
23+
1424
import io.fabric8.kubernetes.api.model.ContainerStatus;
1525
import io.fabric8.kubernetes.api.model.LabelSelector;
1626
import io.fabric8.kubernetes.api.model.Pod;
@@ -28,12 +38,6 @@
2838
import io.strimzi.api.kafka.model.rebalance.KafkaRebalance;
2939
import io.strimzi.api.kafka.model.rebalance.KafkaRebalanceState;
3040
import io.strimzi.api.kafka.model.topic.KafkaTopic;
31-
import org.apache.logging.log4j.Logger;
32-
33-
import java.util.List;
34-
import java.util.Map;
35-
import java.util.function.Function;
36-
import java.util.stream.Collectors;
3741

3842
import static com.github.streamshub.systemtests.utils.resourceutils.ResourceUtils.listKubeResourcesByPrefix;
3943

@@ -333,6 +337,15 @@ public static void waitForKafkaHasNoWarningStatus(String namespaceName, String c
333337
});
334338
}
335339

340+
public static void waitForKafkaCondition(String namespace, String kafkaName, Predicate<Kafka> condition) {
341+
KubeResourceManager.get().kubeClient()
342+
.getClient()
343+
.resources(Kafka.class)
344+
.inNamespace(namespace)
345+
.withName(kafkaName)
346+
.waitUntilCondition(condition, TimeConstants.GLOBAL_STATUS_TIMEOUT, TimeUnit.MILLISECONDS);
347+
}
348+
336349
public static void waitForClientsSuccess(KafkaClients clients) {
337350
waitForClientsSuccess(clients.getNamespaceName(), clients.getProducerName(), clients.getConsumerName(), clients.getMessageCount(), true);
338351
}

systemtests/src/main/java/com/github/streamshub/systemtests/utils/resourceutils/kafka/KafkaTopicUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
public class KafkaTopicUtils {
2323
private static final Logger LOGGER = LogWrapper.getLogger(KafkaTopicUtils.class);
24-
24+
2525
private KafkaTopicUtils() {}
2626

2727
/**
@@ -57,7 +57,7 @@ public static List<KafkaTopic> setupTopicsIfNeededAndReturn(String namespace, St
5757
KubeResourceManager.get().deleteResourceWithWait(existingTopics.toArray(new KafkaTopic[0]));
5858
}
5959

60-
KubeResourceManager.get().createResourceWithWait(topics.toArray(new KafkaTopic[0]));
60+
KubeResourceManager.get().createResourceAsyncWait(topics.toArray(new KafkaTopic[0]));
6161

6262
return topics;
6363
}

systemtests/src/main/java/com/github/streamshub/systemtests/utils/resourceutils/kafka/KafkaUtils.java

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,33 @@
11
package com.github.streamshub.systemtests.utils.resourceutils.kafka;
22

3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.stream.IntStream;
8+
9+
import org.apache.logging.log4j.Logger;
10+
311
import com.github.streamshub.systemtests.constants.Constants;
412
import com.github.streamshub.systemtests.constants.Labels;
13+
import com.github.streamshub.systemtests.enums.ConditionStatus;
14+
import com.github.streamshub.systemtests.enums.ResourceStatus;
515
import com.github.streamshub.systemtests.logs.LogWrapper;
616
import com.github.streamshub.systemtests.utils.Utils;
717
import com.github.streamshub.systemtests.utils.WaitUtils;
818
import com.github.streamshub.systemtests.utils.resourceutils.ClusterUtils;
919
import com.github.streamshub.systemtests.utils.resourceutils.ResourceUtils;
20+
1021
import io.fabric8.kubernetes.api.model.Pod;
1122
import io.skodjob.kubetest4j.resources.KubeResourceManager;
23+
import io.strimzi.api.kafka.model.common.Condition;
1224
import io.strimzi.api.kafka.model.kafka.Kafka;
1325
import io.strimzi.api.kafka.model.kafka.KafkaBuilder;
1426
import io.strimzi.api.kafka.model.kafka.listener.GenericKafkaListener;
1527
import io.strimzi.api.kafka.model.kafka.listener.GenericKafkaListenerConfigurationBroker;
1628
import io.strimzi.api.kafka.model.kafka.listener.GenericKafkaListenerConfigurationBrokerBuilder;
1729
import io.strimzi.api.kafka.model.nodepool.KafkaNodePool;
1830
import io.strimzi.api.kafka.model.nodepool.KafkaNodePoolBuilder;
19-
import org.apache.logging.log4j.Logger;
20-
21-
import java.util.ArrayList;
22-
import java.util.Collections;
23-
import java.util.List;
24-
import java.util.Map;
25-
import java.util.stream.IntStream;
2631

2732
public class KafkaUtils {
2833
private static final Logger LOGGER = LogWrapper.getLogger(KafkaUtils.class);
@@ -242,4 +247,21 @@ public static void scaleBrokerReplicasWithWait(String namespace, String kafkaNam
242247
WaitUtils.waitForKafkaBrokerNodePoolReplicasInSpec(namespace, kafkaName, scaledBrokersCount);
243248
WaitUtils.waitForPodsReadyAndStable(namespace, Labels.getKnpBrokerLabelSelector(kafkaName), scaledBrokersCount, true);
244249
}
250+
251+
public static List<Condition> warningConditions(String namespace, String kafkaName) {
252+
var kafka = ResourceUtils.getKubeResource(Kafka.class, namespace, kafkaName);
253+
if (kafka != null) {
254+
return warningConditions(kafka);
255+
}
256+
return Collections.emptyList();
257+
}
258+
259+
public static List<Condition> warningConditions(Kafka kafka) {
260+
return kafka.getStatus()
261+
.getConditions()
262+
.stream()
263+
.filter(condition -> condition.getType().equals(ResourceStatus.WARNING.toString()))
264+
.filter(condition -> condition.getStatus().equals(ConditionStatus.TRUE.toString()))
265+
.toList();
266+
}
245267
}

systemtests/src/main/java/com/github/streamshub/systemtests/utils/testchecks/TopicChecks.java

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
import com.github.streamshub.systemtests.utils.playwright.PwPageUrls;
1313
import com.github.streamshub.systemtests.utils.playwright.PwUtils;
1414
import com.github.streamshub.systemtests.utils.testutils.TopicsTestUtils;
15+
import com.microsoft.playwright.assertions.PlaywrightAssertions;
16+
1517
import org.apache.logging.log4j.Logger;
1618

1719
import java.util.List;
1820

19-
import static org.junit.jupiter.api.Assertions.assertEquals;
20-
2121
public class TopicChecks {
2222
private static final Logger LOGGER = LogWrapper.getLogger(TopicChecks.class);
2323
private TopicChecks() {}
@@ -40,12 +40,22 @@ public static void checkOverviewPageTopicState(TestCaseConfig tcc, String kafkaN
4040
PwUtils.navigate(tcc, PwPageUrls.getOverviewPage(tcc, kafkaName));
4141

4242
// Status
43-
PwUtils.waitForContainsText(tcc, ClusterOverviewPageSelectors.COPS_TOPICS_CARD_TOTAL_TOPICS, total + " topics", true);
44-
PwUtils.waitForContainsText(tcc, ClusterOverviewPageSelectors.COPS_TOPICS_CARD_TOTAL_PARTITIONS, partitions + " partitions", true);
43+
PlaywrightAssertions
44+
.assertThat(tcc.page().locator(ClusterOverviewPageSelectors.COPS_TOPICS_CARD_TOTAL_TOPICS))
45+
.containsText(total + " topics");
46+
PlaywrightAssertions
47+
.assertThat(tcc.page().locator(ClusterOverviewPageSelectors.COPS_TOPICS_CARD_TOTAL_PARTITIONS))
48+
.containsText(partitions + " partitions");
4549

46-
PwUtils.waitForContainsText(tcc, ClusterOverviewPageSelectors.COPS_TOPICS_CARD_FULLY_REPLICATED, fullyReplicated + " Fully replicated", true);
47-
PwUtils.waitForContainsText(tcc, ClusterOverviewPageSelectors.COPS_TOPICS_CARD_UNDER_REPLICATED, underReplicated + " Under replicated", true);
48-
PwUtils.waitForContainsText(tcc, ClusterOverviewPageSelectors.COPS_TOPICS_CARD_UNAVAILABLE, unavailable + " Unavailable", true);
50+
PlaywrightAssertions
51+
.assertThat(tcc.page().locator(ClusterOverviewPageSelectors.COPS_TOPICS_CARD_FULLY_REPLICATED))
52+
.containsText(fullyReplicated + " Fully replicated");
53+
PlaywrightAssertions
54+
.assertThat(tcc.page().locator(ClusterOverviewPageSelectors.COPS_TOPICS_CARD_UNDER_REPLICATED))
55+
.containsText(underReplicated + " Under replicated");
56+
PlaywrightAssertions
57+
.assertThat(tcc.page().locator(ClusterOverviewPageSelectors.COPS_TOPICS_CARD_UNAVAILABLE))
58+
.containsText(unavailable + " Unavailable");
4959
}
5060

5161
/**
@@ -64,11 +74,20 @@ public static void checkTopicsPageTopicState(TestCaseConfig tcc, String kafkaNam
6474
LOGGER.info("Verify Overview Page topic status [{} total topics] [FullyReplicated: {}] [UnderReplicated: {}] [Unavailabe: {}]", total, fullyReplicated, underReplicated, unavailable);
6575
// Total topic count
6676
PwUtils.navigate(tcc, PwPageUrls.getTopicsPage(tcc, kafkaName));
67-
PwUtils.waitForContainsText(tcc, TopicsPageSelectors.TPS_HEADER_TOTAL_TOPICS_BADGE, total + " total", true);
77+
PlaywrightAssertions
78+
.assertThat(tcc.page().locator(TopicsPageSelectors.TPS_HEADER_TOTAL_TOPICS_BADGE))
79+
.containsText(total + " total");
80+
6881
// Status
69-
PwUtils.waitForContainsText(tcc, TopicsPageSelectors.TPS_HEADER_BADGE_STATUS_SUCCESS, Integer.toString(fullyReplicated), true);
70-
PwUtils.waitForContainsText(tcc, TopicsPageSelectors.TPS_HEADER_BADGE_STATUS_WARNING, Integer.toString(underReplicated), true);
71-
PwUtils.waitForContainsText(tcc, TopicsPageSelectors.TPS_HEADER_BADGE_STATUS_ERROR, Integer.toString(unavailable), true);
82+
PlaywrightAssertions
83+
.assertThat(tcc.page().locator(TopicsPageSelectors.TPS_HEADER_BADGE_STATUS_SUCCESS))
84+
.containsText(Integer.toString(fullyReplicated));
85+
PlaywrightAssertions
86+
.assertThat(tcc.page().locator(TopicsPageSelectors.TPS_HEADER_BADGE_STATUS_WARNING))
87+
.containsText(Integer.toString(underReplicated));
88+
PlaywrightAssertions
89+
.assertThat(tcc.page().locator(TopicsPageSelectors.TPS_HEADER_BADGE_STATUS_ERROR))
90+
.containsText(Integer.toString(unavailable));
7291
}
7392

7493
/**
@@ -147,8 +166,12 @@ public static void checkPaginationPage(TestCaseConfig tcc, int topicsCount, List
147166
private static void checkPaginationContent(TestCaseConfig tcc, int pageNum, int numOfFinalPage, int topicsOnPage, int lowBoundary, int highBoundary, int topicsCount, String paginationTextSelector, String moveButtonSelector) {
148167
LOGGER.debug("Checking page {}/{}", pageNum, numOfFinalPage);
149168
// Check that correct number of topics is displayed
150-
PwUtils.waitForLocatorVisible(tcc, new CssBuilder(TopicsPageSelectors.TPS_TABLE_ROWS).nth(1).build());
151-
assertEquals(topicsOnPage, tcc.page().locator(TopicsPageSelectors.TPS_TABLE_ROWS).all().size());
169+
PlaywrightAssertions
170+
.assertThat(tcc.page().locator(new CssBuilder(TopicsPageSelectors.TPS_TABLE_ROWS)
171+
.withDesc()
172+
.withElementTr()
173+
.build()))
174+
.hasCount(topicsOnPage);
152175

153176
// Check pagination details
154177
String paginationOf = String.format("%s - %s of %s", lowBoundary, highBoundary, topicsCount);

0 commit comments

Comments
 (0)