diff --git a/pkg/harvester/list/__tests__/kubeovn.io.vpc.test.js b/pkg/harvester/list/__tests__/kubeovn.io.vpc.test.js
new file mode 100644
index 00000000..380348c0
--- /dev/null
+++ b/pkg/harvester/list/__tests__/kubeovn.io.vpc.test.js
@@ -0,0 +1,54 @@
+import { mount } from '@vue/test-utils';
+import HarvesterVPC from '../kubeovn.io.vpc.vue';
+
+// A table that renders the page's group header for each of the given groups
+function resourceTable(groups) {
+ return {
+ data: () => ({ groups }),
+ template: '
',
+ };
+}
+
+function mountList(groups) {
+ return mount(HarvesterVPC, {
+ props: { schema: { id: 'kubeovn.io.vpc' } },
+ data: () => ({ enabledKubeOvnAddon: true }),
+ global: {
+ stubs: {
+ ResourceTable: resourceTable(groups),
+ Masthead: true,
+ Loading: true,
+ 'router-link': { template: '' },
+ },
+ mocks: {
+ $fetchState: { pending: false },
+ t: (key) => ({ 'harvester.vpc.label': 'Virtual Private Cloud', 'generic.none': 'None' }[key] || key),
+ $store: {
+ getters: {
+ currentProduct: { inStore: 'harvester' },
+ 'harvester/all': () => [],
+ 'harvester/schemaFor': () => ({ collectionMethods: ['POST'] }),
+ },
+ },
+ },
+ },
+ });
+}
+
+describe('list: kubeovn.io.vpc', () => {
+ it('should label a group of subnets without a VPC as None and offer no VPC actions', () => {
+ const wrapper = mountList([{ key: '' }]);
+ const group = wrapper.find('.group');
+
+ expect(group.find('.group-tab').text()).toBe('Virtual Private Cloud: None');
+ expect(group.find('.right').exists()).toBe(false);
+ });
+
+ it('should label a VPC group with its name and offer the VPC actions', () => {
+ const wrapper = mountList([{ key: 'ovn-cluster' }]);
+ const group = wrapper.find('.group');
+
+ expect(group.find('.group-tab').text()).toBe('Virtual Private Cloud: ovn-cluster');
+ expect(group.findAll('.right a, .right button')).toHaveLength(3);
+ });
+});
diff --git a/pkg/harvester/list/kubeovn.io.vpc.vue b/pkg/harvester/list/kubeovn.io.vpc.vue
index 254200c4..8fb94952 100644
--- a/pkg/harvester/list/kubeovn.io.vpc.vue
+++ b/pkg/harvester/list/kubeovn.io.vpc.vue
@@ -139,7 +139,8 @@ export default {
},
methods: {
groupLabel(group) {
- return `${ this.t('harvester.vpc.label') }: ${ group.key }`;
+ // Kube-OVN sets a subnet's VPC (ovn-cluster when none is given), so an empty one is a subnet it hasn't processed
+ return `${ this.t('harvester.vpc.label') }: ${ group.key || this.t('generic.none') }`;
},
slotName(vpc) {
@@ -226,7 +227,10 @@ export default {
{{ groupLabel(group) }}
-