From 0c7b0bd8f7df9ed48c9d04385b9a5a879e841794 Mon Sep 17 00:00:00 2001
From: "maciej.moscicki"
Date: Thu, 17 Aug 2023 16:33:46 +0200
Subject: [PATCH 1/8] add ability to move offsets
---
.../src/api/hermes-client/index.ts | 14 ++++++
hermes-console-vue/src/i18n/en-US.ts | 8 +++
hermes-console-vue/src/mocks/handlers.ts | 16 ++++++
.../views/subscription/SubscriptionView.vue | 10 ++++
.../SubscriptionOffsets.spec.ts | 49 +++++++++++++++++++
.../SubscriptionOffsets.vue | 47 ++++++++++++++++++
6 files changed, 144 insertions(+)
create mode 100644 hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.spec.ts
create mode 100644 hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.vue
diff --git a/hermes-console-vue/src/api/hermes-client/index.ts b/hermes-console-vue/src/api/hermes-client/index.ts
index 346c6df1ef..989736bcf7 100644
--- a/hermes-console-vue/src/api/hermes-client/index.ts
+++ b/hermes-console-vue/src/api/hermes-client/index.ts
@@ -159,3 +159,17 @@ export function querySubscriptions(
export function fetchRoles(path: string): ResponsePromise {
return axios.get(path);
}
+
+export function moveSubscriptionOffsets(
+ topicName: string,
+ subscription: string,
+): ResponsePromise {
+ return axios.post(
+ `/topics/${topicName}/subscriptions/${subscription}/moveOffsetsToTheEnd`,
+ {
+ validateStatus: (status: number) => {
+ return status > 200 && status < 400;
+ },
+ },
+ );
+}
\ No newline at end of file
diff --git a/hermes-console-vue/src/i18n/en-US.ts b/hermes-console-vue/src/i18n/en-US.ts
index 595dd6a163..707e963ccc 100644
--- a/hermes-console-vue/src/i18n/en-US.ts
+++ b/hermes-console-vue/src/i18n/en-US.ts
@@ -480,6 +480,14 @@ const en_US = {
reason: 'Reason',
timestamp: 'Timestamp',
},
+ moveOffsets: {
+ title: 'Move subscription offsets to the end',
+ button: 'MOVE',
+ success: 'Moved offsets for subscription',
+ failure: 'Failed to move offsets for subscription',
+ status: 'status',
+ response: 'response',
+ },
},
search: {
collection: {
diff --git a/hermes-console-vue/src/mocks/handlers.ts b/hermes-console-vue/src/mocks/handlers.ts
index a1ebd0091f..952545ac7c 100644
--- a/hermes-console-vue/src/mocks/handlers.ts
+++ b/hermes-console-vue/src/mocks/handlers.ts
@@ -418,3 +418,19 @@ export const fetchGroupInconsistenciesErrorHandler = ({
rest.get(`${url}/consistency/inconsistencies/groups`, (req, res, ctx) => {
return res(ctx.status(errorCode), ctx.json(undefined));
});
+
+export const moveSubscriptionOffsetsHandler = ({
+ topicName,
+ subscriptionName,
+ statusCode,
+ }: {
+ topicName: string;
+ subscriptionName: string;
+ statusCode: number;
+}) =>
+ rest.post(
+ `${url}/topics/${topicName}/subscriptions/${subscriptionName}/moveOffsetsToTheEnd`,
+ (req, res, ctx) => {
+ return res(ctx.status(statusCode), ctx.json(undefined));
+ },
+ );
\ No newline at end of file
diff --git a/hermes-console-vue/src/views/subscription/SubscriptionView.vue b/hermes-console-vue/src/views/subscription/SubscriptionView.vue
index 51600be7f4..d14b62feca 100644
--- a/hermes-console-vue/src/views/subscription/SubscriptionView.vue
+++ b/hermes-console-vue/src/views/subscription/SubscriptionView.vue
@@ -16,6 +16,7 @@
import ServiceResponseMetrics from '@/views/subscription/service-response-metrics/ServiceResponseMetrics.vue';
import ShowEventTrace from '@/views/subscription/show-event-trace/ShowEventTrace.vue';
import SubscriptionMetadata from '@/views/subscription/subscription-metadata/SubscriptionMetadata.vue';
+ import SubscriptionOffsets from '@/views/subscription/subscription-offsets/SubscriptionOffsets.vue';
import UndeliveredMessagesCard from '@/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.vue';
const route = useRoute();
@@ -121,6 +122,15 @@
+
+
+
+
+
+
{
+ const props = { subscription: dummySubscription };
+ const args = {
+ topicName: dummySubscription.topicName,
+ subscriptionName: dummySubscription.name,
+ statusCode: 200,
+ };
+
+ const server = setupServer(moveSubscriptionOffsetsHandler(args));
+
+ it('should show message that moving offsets was successful', async () => {
+ // given
+ server.listen();
+ const user = userEvent.setup();
+ const { getByText } = render(SubscriptionOffsets, { props });
+
+ // when
+ await user.click(getByText('subscription.moveOffsets.button'));
+
+ // then
+ expect(getByText('subscription.moveOffsets.success')).toBeVisible();
+ });
+
+ it('should show message that moving offsets failed', async () => {
+ // given
+ server.use(moveSubscriptionOffsetsHandler({ ...args, statusCode: 500 }));
+ server.listen();
+ const user = userEvent.setup();
+ const { getByText } = render(SubscriptionOffsets, { props });
+
+ // when
+ await user.click(getByText('subscription.moveOffsets.button'));
+
+ // then
+ expect(
+ getByText(
+ 'subscription.moveOffsets.failure, subscription.moveOffsets.status: 500, subscription.moveOffsets.response: ""',
+ ),
+ ).toBeVisible();
+ });
+});
diff --git a/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.vue b/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.vue
new file mode 100644
index 0000000000..8b6a9439ef
--- /dev/null
+++ b/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+ {{ $t('subscription.moveOffsets.title') }}
+
+ {{
+ $t('subscription.moveOffsets.button')
+ }}
+
+ {{ msg }}
+
+
+
+
+
From 72fbf2d30f49470008ca67a6930809f8fc9ff77d Mon Sep 17 00:00:00 2001
From: "maciej.moscicki"
Date: Tue, 22 Aug 2023 11:34:16 +0200
Subject: [PATCH 2/8] lint
---
.../src/api/hermes-client/index.ts | 20 ++++++-------
hermes-console-vue/src/mocks/handlers.ts | 28 +++++++++----------
2 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/hermes-console-vue/src/api/hermes-client/index.ts b/hermes-console-vue/src/api/hermes-client/index.ts
index 989736bcf7..a2c94da194 100644
--- a/hermes-console-vue/src/api/hermes-client/index.ts
+++ b/hermes-console-vue/src/api/hermes-client/index.ts
@@ -161,15 +161,15 @@ export function fetchRoles(path: string): ResponsePromise {
}
export function moveSubscriptionOffsets(
- topicName: string,
- subscription: string,
+ topicName: string,
+ subscription: string,
): ResponsePromise {
- return axios.post(
- `/topics/${topicName}/subscriptions/${subscription}/moveOffsetsToTheEnd`,
- {
- validateStatus: (status: number) => {
- return status > 200 && status < 400;
- },
- },
- );
+ return axios.post(
+ `/topics/${topicName}/subscriptions/${subscription}/moveOffsetsToTheEnd`,
+ {
+ validateStatus: (status: number) => {
+ return status > 200 && status < 400;
+ },
+ },
+ );
}
\ No newline at end of file
diff --git a/hermes-console-vue/src/mocks/handlers.ts b/hermes-console-vue/src/mocks/handlers.ts
index 952545ac7c..2fa2ab335c 100644
--- a/hermes-console-vue/src/mocks/handlers.ts
+++ b/hermes-console-vue/src/mocks/handlers.ts
@@ -420,17 +420,17 @@ export const fetchGroupInconsistenciesErrorHandler = ({
});
export const moveSubscriptionOffsetsHandler = ({
- topicName,
- subscriptionName,
- statusCode,
- }: {
- topicName: string;
- subscriptionName: string;
- statusCode: number;
-}) =>
- rest.post(
- `${url}/topics/${topicName}/subscriptions/${subscriptionName}/moveOffsetsToTheEnd`,
- (req, res, ctx) => {
- return res(ctx.status(statusCode), ctx.json(undefined));
- },
- );
\ No newline at end of file
+ topicName,
+ subscriptionName,
+ statusCode,
+}: {
+ topicName: string;
+ subscriptionName: string;
+ statusCode: number;
+}) =>
+ rest.post(
+ `${url}/topics/${topicName}/subscriptions/${subscriptionName}/moveOffsetsToTheEnd`,
+ (req, res, ctx) => {
+ return res(ctx.status(statusCode), ctx.json(undefined));
+ },
+ );
From 6cbe7f2d8cdc18e2beaf6435645083cc7564f641 Mon Sep 17 00:00:00 2001
From: "maciej.moscicki"
Date: Wed, 23 Aug 2023 09:20:05 +0200
Subject: [PATCH 3/8] move offsets to consumer group view
---
hermes-console-vue/src/api/hermes-client/index.ts | 2 +-
.../use-consumer-groups/useConsumerGroups.ts | 11 ++++++++++-
hermes-console-vue/src/i18n/en-US.ts | 4 ++--
.../admin/consumer-groups/ConsumerGroupsView.spec.ts | 1 +
.../admin/consumer-groups/ConsumerGroupsView.vue | 10 +++++++++-
.../src/views/subscription/SubscriptionView.vue | 10 ----------
6 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/hermes-console-vue/src/api/hermes-client/index.ts b/hermes-console-vue/src/api/hermes-client/index.ts
index a2c94da194..bb4b824a5e 100644
--- a/hermes-console-vue/src/api/hermes-client/index.ts
+++ b/hermes-console-vue/src/api/hermes-client/index.ts
@@ -172,4 +172,4 @@ export function moveSubscriptionOffsets(
},
},
);
-}
\ No newline at end of file
+}
diff --git a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
index 8956243cef..3c4c5f990d 100644
--- a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
+++ b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
@@ -1,10 +1,14 @@
-import { fetchConsumerGroups as getConsumerGroups } from '@/api/hermes-client';
+import {
+ fetchConsumerGroups as getConsumerGroups,
+ moveSubscriptionOffsets,
+} from '@/api/hermes-client';
import { ref } from 'vue';
import type { ConsumerGroup } from '@/api/consumer-group';
import type { Ref } from 'vue';
export interface UseConsumerGroups {
consumerGroups: Ref;
+ moveOffsets: (topicName: string, subscriptionName: string) => void
loading: Ref;
error: Ref;
}
@@ -36,10 +40,15 @@ export function useConsumerGroups(
}
};
+ const moveOffsets = async (topicName: string, subscriptionName: string) => {
+ await moveSubscriptionOffsets(topicName, subscriptionName);
+ };
+
fetchConsumerGroups();
return {
consumerGroups,
+ moveOffsets,
loading,
error,
};
diff --git a/hermes-console-vue/src/i18n/en-US.ts b/hermes-console-vue/src/i18n/en-US.ts
index 707e963ccc..6918d41578 100644
--- a/hermes-console-vue/src/i18n/en-US.ts
+++ b/hermes-console-vue/src/i18n/en-US.ts
@@ -481,8 +481,8 @@ const en_US = {
timestamp: 'Timestamp',
},
moveOffsets: {
- title: 'Move subscription offsets to the end',
- button: 'MOVE',
+ tooltip: 'Move subscription offsets to the end',
+ button: 'MOVE OFFSETS',
success: 'Moved offsets for subscription',
failure: 'Failed to move offsets for subscription',
status: 'status',
diff --git a/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts b/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts
index e2b76e4d68..b70b35eb02 100644
--- a/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts
+++ b/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts
@@ -11,6 +11,7 @@ vi.mock('@/composables/consumer-groups/use-consumer-groups/useConsumerGroups');
const useConsumerGroupsStub: UseConsumerGroups = {
consumerGroups: ref(dummyConsumerGroups),
+ moveOffsets: () => {},
loading: ref(false),
error: ref({
fetchConsumerGroups: null,
diff --git a/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue b/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue
index 1da2a768ce..c4e40404c9 100644
--- a/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue
+++ b/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue
@@ -12,7 +12,7 @@
const params = route.params as Record;
const { subscriptionId, topicId, groupId } = params;
- const { consumerGroups, loading, error } = useConsumerGroups(
+ const { consumerGroups, moveOffsets, loading, error } = useConsumerGroups(
topicId,
subscriptionId,
);
@@ -64,6 +64,14 @@
{{ $t('consumerGroups.title') }}
+
+
+ {{ $t('subscription.moveOffsets.button') }}
+ {{
+ $t('subscription.moveOffsets.tooltip')
+ }}
+
+
diff --git a/hermes-console-vue/src/views/subscription/SubscriptionView.vue b/hermes-console-vue/src/views/subscription/SubscriptionView.vue
index d14b62feca..51600be7f4 100644
--- a/hermes-console-vue/src/views/subscription/SubscriptionView.vue
+++ b/hermes-console-vue/src/views/subscription/SubscriptionView.vue
@@ -16,7 +16,6 @@
import ServiceResponseMetrics from '@/views/subscription/service-response-metrics/ServiceResponseMetrics.vue';
import ShowEventTrace from '@/views/subscription/show-event-trace/ShowEventTrace.vue';
import SubscriptionMetadata from '@/views/subscription/subscription-metadata/SubscriptionMetadata.vue';
- import SubscriptionOffsets from '@/views/subscription/subscription-offsets/SubscriptionOffsets.vue';
import UndeliveredMessagesCard from '@/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.vue';
const route = useRoute();
@@ -122,15 +121,6 @@
-
-
-
-
-
-
Date: Thu, 24 Aug 2023 15:38:46 +0200
Subject: [PATCH 4/8] use notifications for moving offsets
---
hermes-console-vue/json-server/server.ts | 4 +++
.../use-consumer-groups/useConsumerGroups.ts | 25 +++++++++++++++++--
hermes-console-vue/src/i18n/en-US.ts | 6 ++---
3 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/hermes-console-vue/json-server/server.ts b/hermes-console-vue/json-server/server.ts
index 3c24a149a9..b24f67b22c 100644
--- a/hermes-console-vue/json-server/server.ts
+++ b/hermes-console-vue/json-server/server.ts
@@ -19,6 +19,10 @@ server.post('/query/subscriptions', (req, res) => {
res.jsonp(subscriptions);
});
+server.post('/topics/*/subscriptions/*/moveOffsetsToTheEnd', (req, res) => {
+ res.sendStatus(200);
+});
+
const router = jsonServer.router('json-server/db.json');
server.use(router);
diff --git a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
index 3c4c5f990d..f51dfbfb50 100644
--- a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
+++ b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
@@ -3,12 +3,15 @@ import {
moveSubscriptionOffsets,
} from '@/api/hermes-client';
import { ref } from 'vue';
+import { useNotificationsStore } from '@/store/app-notifications/useAppNotifications';
import type { ConsumerGroup } from '@/api/consumer-group';
import type { Ref } from 'vue';
+import i18n from '@/main';
+
export interface UseConsumerGroups {
consumerGroups: Ref;
- moveOffsets: (topicName: string, subscriptionName: string) => void
+ moveOffsets: (topicName: string, subscriptionName: string) => void;
loading: Ref;
error: Ref;
}
@@ -41,7 +44,25 @@ export function useConsumerGroups(
};
const moveOffsets = async (topicName: string, subscriptionName: string) => {
- await moveSubscriptionOffsets(topicName, subscriptionName);
+ const notificationsStore = useNotificationsStore();
+ try {
+ await moveSubscriptionOffsets(topicName, subscriptionName);
+ await notificationsStore.dispatchNotification({
+ title: i18n.global.t('subscription.moveOffsets.success', {
+ subscriptionName,
+ }),
+ text: '',
+ type: 'success',
+ });
+ } catch (e) {
+ await notificationsStore.dispatchNotification({
+ title: i18n.global.t('subscription.moveOffsets.failure', {
+ subscriptionName,
+ }),
+ text: (e as Error).message,
+ type: 'error',
+ });
+ }
};
fetchConsumerGroups();
diff --git a/hermes-console-vue/src/i18n/en-US.ts b/hermes-console-vue/src/i18n/en-US.ts
index 6918d41578..76ea299ea0 100644
--- a/hermes-console-vue/src/i18n/en-US.ts
+++ b/hermes-console-vue/src/i18n/en-US.ts
@@ -483,10 +483,8 @@ const en_US = {
moveOffsets: {
tooltip: 'Move subscription offsets to the end',
button: 'MOVE OFFSETS',
- success: 'Moved offsets for subscription',
- failure: 'Failed to move offsets for subscription',
- status: 'status',
- response: 'response',
+ success: 'Moved offsets for subscription {subscriptionName}',
+ failure: 'Failed to move offsets for subscription {subscriptionName}',
},
},
search: {
From 5c9d4317a622de794d65050247d1ab4d9119f251 Mon Sep 17 00:00:00 2001
From: "maciej.moscicki"
Date: Thu, 24 Aug 2023 16:33:47 +0200
Subject: [PATCH 5/8] show notifications with move offsets results
---
.../useConsumerGroups.spec.ts | 34 ++++++++++++-
.../use-consumer-groups/useConsumerGroups.ts | 4 +-
.../consumer-groups/ConsumerGroupsView.vue | 2 +-
.../SubscriptionOffsets.spec.ts | 49 -------------------
.../SubscriptionOffsets.vue | 47 ------------------
5 files changed, 36 insertions(+), 100 deletions(-)
delete mode 100644 hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.spec.ts
delete mode 100644 hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.vue
diff --git a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts
index 4c9fd4f34b..5587b34ec4 100644
--- a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts
+++ b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts
@@ -1,10 +1,11 @@
-import { afterEach } from 'vitest';
+import { afterEach, expect } from 'vitest';
import { dummyConsumerGroups } from '@/dummy/consumerGroups';
import { dummySubscription } from '@/dummy/subscription';
import { dummyTopic } from '@/dummy/topic';
import {
fetchConsumerGroupsErrorHandler,
fetchConsumerGroupsHandler,
+ moveSubscriptionOffsetsHandler,
} from '@/mocks/handlers';
import { setupServer } from 'msw/node';
import { useConsumerGroups } from '@/composables/consumer-groups/use-consumer-groups/useConsumerGroups';
@@ -66,4 +67,35 @@ describe('useConsumerGroups', () => {
expect(error.value.fetchConsumerGroups).not.toBeNull();
});
});
+
+ it('should show message that moving offsets was successful', async () => {
+ // given
+ server.listen();
+ const { moveOffsets } = useConsumerGroups(topicName, subscriptionName);
+
+ // when
+ moveOffsets();
+
+ // then
+ //TODO: check that notification was sent
+ });
+
+ it('should show message that moving offsets was unsuccessful', async () => {
+ // given
+ server.use(
+ moveSubscriptionOffsetsHandler({
+ topicName,
+ subscriptionName,
+ statusCode: 500,
+ }),
+ );
+ server.listen();
+ const { moveOffsets } = useConsumerGroups(topicName, subscriptionName);
+
+ // when
+ moveOffsets();
+
+ // then
+ //TODO: check that notification was sent
+ });
});
diff --git a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
index f51dfbfb50..69ca0e3562 100644
--- a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
+++ b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
@@ -11,7 +11,7 @@ import i18n from '@/main';
export interface UseConsumerGroups {
consumerGroups: Ref;
- moveOffsets: (topicName: string, subscriptionName: string) => void;
+ moveOffsets: () => void;
loading: Ref;
error: Ref;
}
@@ -43,7 +43,7 @@ export function useConsumerGroups(
}
};
- const moveOffsets = async (topicName: string, subscriptionName: string) => {
+ const moveOffsets = async () => {
const notificationsStore = useNotificationsStore();
try {
await moveSubscriptionOffsets(topicName, subscriptionName);
diff --git a/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue b/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue
index c4e40404c9..e6149517dc 100644
--- a/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue
+++ b/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue
@@ -65,7 +65,7 @@
-
+
{{ $t('subscription.moveOffsets.button') }}
{{
$t('subscription.moveOffsets.tooltip')
diff --git a/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.spec.ts b/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.spec.ts
deleted file mode 100644
index e8e4842ecb..0000000000
--- a/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.spec.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { describe, expect } from 'vitest';
-import { dummySubscription } from '@/dummy/subscription';
-import { moveSubscriptionOffsetsHandler } from '@/mocks/handlers';
-import { render } from '@/utils/test-utils';
-import { setupServer } from 'msw/node';
-import SubscriptionOffsets from '@/views/subscription/subscription-offsets/SubscriptionOffsets.vue';
-import userEvent from '@testing-library/user-event';
-
-describe('SubscriptionOffsets', () => {
- const props = { subscription: dummySubscription };
- const args = {
- topicName: dummySubscription.topicName,
- subscriptionName: dummySubscription.name,
- statusCode: 200,
- };
-
- const server = setupServer(moveSubscriptionOffsetsHandler(args));
-
- it('should show message that moving offsets was successful', async () => {
- // given
- server.listen();
- const user = userEvent.setup();
- const { getByText } = render(SubscriptionOffsets, { props });
-
- // when
- await user.click(getByText('subscription.moveOffsets.button'));
-
- // then
- expect(getByText('subscription.moveOffsets.success')).toBeVisible();
- });
-
- it('should show message that moving offsets failed', async () => {
- // given
- server.use(moveSubscriptionOffsetsHandler({ ...args, statusCode: 500 }));
- server.listen();
- const user = userEvent.setup();
- const { getByText } = render(SubscriptionOffsets, { props });
-
- // when
- await user.click(getByText('subscription.moveOffsets.button'));
-
- // then
- expect(
- getByText(
- 'subscription.moveOffsets.failure, subscription.moveOffsets.status: 500, subscription.moveOffsets.response: ""',
- ),
- ).toBeVisible();
- });
-});
diff --git a/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.vue b/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.vue
deleted file mode 100644
index 8b6a9439ef..0000000000
--- a/hermes-console-vue/src/views/subscription/subscription-offsets/SubscriptionOffsets.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
- {{ $t('subscription.moveOffsets.title') }}
-
- {{
- $t('subscription.moveOffsets.button')
- }}
-
- {{ msg }}
-
-
-
-
-
From c5627e2c6b6231678be4cea7dec480b13fbe0172 Mon Sep 17 00:00:00 2001
From: "maciej.moscicki"
Date: Thu, 24 Aug 2023 16:35:37 +0200
Subject: [PATCH 6/8] remove redundant validate status
---
hermes-console-vue/src/api/hermes-client/index.ts | 5 -----
1 file changed, 5 deletions(-)
diff --git a/hermes-console-vue/src/api/hermes-client/index.ts b/hermes-console-vue/src/api/hermes-client/index.ts
index bb4b824a5e..ede389f11e 100644
--- a/hermes-console-vue/src/api/hermes-client/index.ts
+++ b/hermes-console-vue/src/api/hermes-client/index.ts
@@ -166,10 +166,5 @@ export function moveSubscriptionOffsets(
): ResponsePromise {
return axios.post(
`/topics/${topicName}/subscriptions/${subscription}/moveOffsetsToTheEnd`,
- {
- validateStatus: (status: number) => {
- return status > 200 && status < 400;
- },
- },
);
}
From 1edaa10cb61d86b0a1210d18da6ebfd6e18395b7 Mon Sep 17 00:00:00 2001
From: "maciej.moscicki"
Date: Mon, 28 Aug 2023 09:29:17 +0200
Subject: [PATCH 7/8] mock global i18n
---
hermes-console-vue/src/i18n.ts | 13 +++++++++++++
hermes-console-vue/src/main.ts | 12 +-----------
hermes-console-vue/vitest.setup.ts | 10 ++++++++++
3 files changed, 24 insertions(+), 11 deletions(-)
create mode 100644 hermes-console-vue/src/i18n.ts
diff --git a/hermes-console-vue/src/i18n.ts b/hermes-console-vue/src/i18n.ts
new file mode 100644
index 0000000000..8dfc747790
--- /dev/null
+++ b/hermes-console-vue/src/i18n.ts
@@ -0,0 +1,13 @@
+import { createI18n } from 'vue-i18n';
+import messages from '@/i18n/messages';
+
+export const i18n = createI18n({
+ legacy: false,
+ locale: 'en-US',
+ fallbackLocale: 'en-US',
+ messages: messages,
+});
+
+export function useGlobalI18n() {
+ return i18n.global;
+}
diff --git a/hermes-console-vue/src/main.ts b/hermes-console-vue/src/main.ts
index 97e22bdf65..4b5db0086f 100644
--- a/hermes-console-vue/src/main.ts
+++ b/hermes-console-vue/src/main.ts
@@ -3,12 +3,11 @@ import '@mdi/font/css/materialdesignicons.css';
import 'vuetify/styles';
import { aliases, mdi } from 'vuetify/iconsets/mdi';
import { createApp } from 'vue';
-import { createI18n } from 'vue-i18n';
import { createPinia } from 'pinia';
import { createVuetify } from 'vuetify';
+import { i18n } from '@/i18n';
import App from './App.vue';
import axios from 'axios';
-import messages from '@/i18n/messages';
import piniaPluginPersistedState from 'pinia-plugin-persistedstate';
import router from './router';
@@ -48,13 +47,6 @@ const vuetify = createVuetify({
},
});
-const i18n = createI18n({
- legacy: false,
- locale: 'en-US',
- fallbackLocale: 'en-US',
- messages: messages,
-});
-
const store = createPinia();
store.use(piniaPluginPersistedState);
@@ -67,5 +59,3 @@ app.use(router);
app.use(store);
app.mount('#app');
-
-export default i18n;
diff --git a/hermes-console-vue/vitest.setup.ts b/hermes-console-vue/vitest.setup.ts
index 522f05c378..c39bcd0efb 100644
--- a/hermes-console-vue/vitest.setup.ts
+++ b/hermes-console-vue/vitest.setup.ts
@@ -1,10 +1,12 @@
import '@testing-library/jest-dom';
+import { useGlobalI18n } from './src/i18n';
import { useI18n } from 'vue-i18n';
import { vi } from 'vitest';
/*
* Mock browser-specific elements.
*/
+vi.mock('./src/i18n');
global.ResizeObserver = vi.fn(() => ({
observe: vi.fn(),
unobserve: vi.fn(),
@@ -26,3 +28,11 @@ vi.mocked(useI18n, {
}).mockReturnValue({
t: (key) => key,
});
+
+vi.mocked(useGlobalI18n, {
+ partial: true,
+ deep: true,
+}).mockReturnValue({
+ // @ts-ignore
+ t: (key) => key,
+});
From c320a7ed76cf79531536a3ba60a6c807fbe100c3 Mon Sep 17 00:00:00 2001
From: "maciej.moscicki"
Date: Mon, 28 Aug 2023 09:29:49 +0200
Subject: [PATCH 8/8] test moveOffsets notifications
---
.../useConsumerGroups.spec.ts | 48 ++++++++++++++++++-
.../use-consumer-groups/useConsumerGroups.ts | 21 ++++----
hermes-console-vue/src/i18n/en-US.ts | 10 +++-
3 files changed, 67 insertions(+), 12 deletions(-)
diff --git a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts
index 5587b34ec4..320f14954f 100644
--- a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts
+++ b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts
@@ -1,4 +1,5 @@
import { afterEach, expect } from 'vitest';
+import { createTestingPinia } from '@pinia/testing';
import { dummyConsumerGroups } from '@/dummy/consumerGroups';
import { dummySubscription } from '@/dummy/subscription';
import { dummyTopic } from '@/dummy/topic';
@@ -7,8 +8,10 @@ import {
fetchConsumerGroupsHandler,
moveSubscriptionOffsetsHandler,
} from '@/mocks/handlers';
+import { setActivePinia } from 'pinia';
import { setupServer } from 'msw/node';
import { useConsumerGroups } from '@/composables/consumer-groups/use-consumer-groups/useConsumerGroups';
+import { useNotificationsStore } from '@/store/app-notifications/useAppNotifications';
import { waitFor } from '@testing-library/vue';
describe('useConsumerGroups', () => {
@@ -23,6 +26,14 @@ describe('useConsumerGroups', () => {
}),
);
+ const pinia = createTestingPinia({
+ fakeApp: true,
+ });
+
+ beforeEach(() => {
+ setActivePinia(pinia);
+ });
+
afterEach(() => {
server.resetHandlers();
});
@@ -70,14 +81,34 @@ describe('useConsumerGroups', () => {
it('should show message that moving offsets was successful', async () => {
// given
+ server.use(
+ moveSubscriptionOffsetsHandler({
+ topicName,
+ subscriptionName,
+ statusCode: 200,
+ }),
+ );
server.listen();
+ const notificationsStore = useNotificationsStore();
+ const dispatchNotification = vi.spyOn(
+ notificationsStore,
+ 'dispatchNotification',
+ );
+
const { moveOffsets } = useConsumerGroups(topicName, subscriptionName);
// when
moveOffsets();
// then
- //TODO: check that notification was sent
+ await waitFor(() => {
+ expect(dispatchNotification).toHaveBeenLastCalledWith(
+ expect.objectContaining({
+ type: 'success',
+ title: 'notifications.subscriptionOffsets.move.success',
+ }),
+ );
+ });
});
it('should show message that moving offsets was unsuccessful', async () => {
@@ -90,12 +121,25 @@ describe('useConsumerGroups', () => {
}),
);
server.listen();
+
+ const notificationsStore = useNotificationsStore();
+ const dispatchNotification = vi.spyOn(
+ notificationsStore,
+ 'dispatchNotification',
+ );
const { moveOffsets } = useConsumerGroups(topicName, subscriptionName);
// when
moveOffsets();
// then
- //TODO: check that notification was sent
+ await waitFor(() => {
+ expect(dispatchNotification).toHaveBeenLastCalledWith(
+ expect.objectContaining({
+ type: 'error',
+ title: 'notifications.subscriptionOffsets.move.failure',
+ }),
+ );
+ });
});
});
diff --git a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
index 69ca0e3562..7ec1af6c23 100644
--- a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
+++ b/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts
@@ -3,12 +3,11 @@ import {
moveSubscriptionOffsets,
} from '@/api/hermes-client';
import { ref } from 'vue';
+import { useGlobalI18n } from '@/i18n';
import { useNotificationsStore } from '@/store/app-notifications/useAppNotifications';
import type { ConsumerGroup } from '@/api/consumer-group';
import type { Ref } from 'vue';
-import i18n from '@/main';
-
export interface UseConsumerGroups {
consumerGroups: Ref;
moveOffsets: () => void;
@@ -48,17 +47,23 @@ export function useConsumerGroups(
try {
await moveSubscriptionOffsets(topicName, subscriptionName);
await notificationsStore.dispatchNotification({
- title: i18n.global.t('subscription.moveOffsets.success', {
- subscriptionName,
- }),
+ title: useGlobalI18n().t(
+ 'notifications.subscriptionOffsets.move.success',
+ {
+ subscriptionName,
+ },
+ ),
text: '',
type: 'success',
});
} catch (e) {
await notificationsStore.dispatchNotification({
- title: i18n.global.t('subscription.moveOffsets.failure', {
- subscriptionName,
- }),
+ title: useGlobalI18n().t(
+ 'notifications.subscriptionOffsets.move.failure',
+ {
+ subscriptionName,
+ },
+ ),
text: (e as Error).message,
type: 'error',
});
diff --git a/hermes-console-vue/src/i18n/en-US.ts b/hermes-console-vue/src/i18n/en-US.ts
index 76ea299ea0..b2e2f6ffac 100644
--- a/hermes-console-vue/src/i18n/en-US.ts
+++ b/hermes-console-vue/src/i18n/en-US.ts
@@ -483,8 +483,6 @@ const en_US = {
moveOffsets: {
tooltip: 'Move subscription offsets to the end',
button: 'MOVE OFFSETS',
- success: 'Moved offsets for subscription {subscriptionName}',
- failure: 'Failed to move offsets for subscription {subscriptionName}',
},
},
search: {
@@ -517,6 +515,14 @@ const en_US = {
},
},
},
+ notifications: {
+ subscriptionOffsets: {
+ move: {
+ success: 'Moved offsets for subscription {subscriptionName}',
+ failure: 'Failed to move offsets for subscription {subscriptionName}',
+ },
+ },
+ },
};
export default en_US;