@rancher/shell 3.0.9-rc.5 → 3.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/images/providers/oci-open-containers.svg +22 -0
- package/assets/images/providers/traefik.png +0 -0
- package/assets/styles/themes/_dark.scss +2 -0
- package/assets/styles/themes/_light.scss +2 -0
- package/assets/styles/themes/_modern.scss +6 -0
- package/assets/translations/en-us.yaml +129 -25
- package/components/CruResource.vue +3 -1
- package/components/ExplorerProjectsNamespaces.vue +12 -12
- package/components/IconOrSvg.vue +61 -42
- package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +109 -0
- package/components/Resource/Detail/Card/StatusCard/index.vue +21 -4
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +19 -2
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +19 -11
- package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +12 -0
- package/components/Resource/Detail/ResourcePopover/index.vue +2 -0
- package/components/Resource/Detail/ResourceRow.vue +2 -2
- package/components/ResourceList/index.vue +7 -4
- package/components/SortableTable/index.vue +2 -2
- package/components/Window/ContainerLogs.vue +48 -37
- package/components/fleet/FleetClusterTargets/TargetsList.vue +2 -2
- package/components/fleet/FleetClusterTargets/index.vue +6 -1
- package/components/fleet/GitRepoAdvancedTab.vue +333 -0
- package/components/fleet/GitRepoMetadataTab.vue +43 -0
- package/components/fleet/GitRepoRepositoryTab.vue +101 -0
- package/components/fleet/GitRepoTargetTab.vue +77 -0
- package/components/fleet/HelmOpAdvancedTab.vue +247 -0
- package/components/fleet/HelmOpChartTab.vue +158 -0
- package/components/fleet/HelmOpMetadataTab.vue +46 -0
- package/components/fleet/HelmOpTargetTab.vue +84 -0
- package/components/fleet/HelmOpValuesTab.vue +147 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +119 -70
- package/components/form/BannerSettings.vue +2 -2
- package/components/form/NodeScheduling.vue +81 -7
- package/components/form/NotificationSettings.vue +2 -2
- package/components/form/PodAffinity.vue +1 -36
- package/components/form/ResourceLabeledSelect.vue +8 -4
- package/components/form/ResourceQuota/Namespace.vue +30 -9
- package/components/form/ResourceQuota/NamespaceRow.vue +25 -7
- package/components/form/ResourceQuota/Project.vue +140 -82
- package/components/form/ResourceQuota/ResourceQuotaEntry.vue +145 -0
- package/components/form/ResourceQuota/__tests__/Namespace.test.ts +307 -0
- package/components/form/ResourceQuota/__tests__/NamespaceRow.test.ts +281 -0
- package/components/form/ResourceQuota/__tests__/Project.test.ts +274 -27
- package/components/form/ResourceQuota/__tests__/ResourceQuotaEntry.test.ts +215 -0
- package/components/form/SchedulingCustomization.vue +14 -6
- package/components/form/SelectOrCreateAuthSecret.vue +107 -18
- package/components/form/__tests__/NodeScheduling.test.ts +12 -9
- package/components/form/__tests__/PodAffinity.test.ts +21 -2
- package/components/form/__tests__/SchedulingCustomization.test.ts +240 -0
- package/components/formatter/ClusterLink.vue +8 -0
- package/components/formatter/SecretOrigin.vue +79 -0
- package/config/labels-annotations.js +7 -6
- package/config/pagination-table-headers.js +6 -4
- package/config/product/explorer.js +1 -11
- package/config/product/manager.js +0 -1
- package/config/query-params.js +3 -0
- package/config/settings.ts +15 -2
- package/config/table-headers.js +21 -17
- package/config/types.js +23 -8
- package/detail/fleet.cattle.io.cluster.vue +1 -1
- package/detail/workload/index.vue +11 -16
- package/dialog/DeactivateDriverDialog.vue +1 -1
- package/dialog/FeatureFlagListDialog.vue +1 -1
- package/dialog/Ipv6NetworkingDialog.vue +156 -0
- package/dialog/ScalePoolDownDialog.vue +2 -2
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +1 -0
- package/edit/__tests__/management.cattle.io.project.test.js +56 -128
- package/edit/auth/oidc.vue +1 -1
- package/edit/catalog.cattle.io.clusterrepo.vue +155 -25
- package/edit/fleet.cattle.io.gitrepo.vue +153 -283
- package/edit/fleet.cattle.io.helmop.vue +190 -332
- package/edit/management.cattle.io.project.vue +5 -42
- package/edit/management.cattle.io.setting.vue +6 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/__tests__/auth.spec.ts +145 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/__tests__/index.test.ts +202 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/__tests__/tls.spec.ts +226 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +24 -21
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/__tests__/opsgenie.spec.ts +157 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/__tests__/pagerduty.spec.ts +132 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/__tests__/slack.spec.ts +108 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -1
- package/edit/monitoring.coreos.com.receiver/__tests__/auth.spec.ts +165 -0
- package/edit/monitoring.coreos.com.receiver/__tests__/index.test.ts +153 -0
- package/edit/monitoring.coreos.com.receiver/__tests__/tls.spec.ts +115 -0
- package/edit/monitoring.coreos.com.receiver/types/__tests__/email.spec.ts +86 -0
- package/edit/monitoring.coreos.com.receiver/types/__tests__/opsgenie.spec.ts +209 -0
- package/edit/monitoring.coreos.com.receiver/types/__tests__/pagerduty.spec.ts +105 -0
- package/edit/monitoring.coreos.com.receiver/types/__tests__/slack.spec.ts +92 -0
- package/edit/monitoring.coreos.com.receiver/types/__tests__/webhook.spec.ts +131 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +55 -24
- package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +1 -103
- package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +13 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2-fleet-cluster-agent.test.ts +283 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +65 -49
- package/edit/provisioning.cattle.io.cluster/ingress/IngressCards.vue +114 -0
- package/edit/provisioning.cattle.io.cluster/ingress/IngressConfiguration.vue +158 -0
- package/edit/provisioning.cattle.io.cluster/rke2.vue +167 -69
- package/edit/provisioning.cattle.io.cluster/shared.ts +36 -1
- package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +2 -1
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +70 -7
- package/edit/provisioning.cattle.io.cluster/tabs/Ingress.vue +343 -0
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +2 -1
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/__tests__/S3Config.test.ts +13 -1
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +10 -44
- package/edit/secret/index.vue +1 -1
- package/edit/token.vue +68 -29
- package/edit/workload/__tests__/index.test.ts +2 -37
- package/edit/workload/index.vue +6 -2
- package/edit/workload/mixins/workload.js +0 -32
- package/list/__tests__/management.cattle.io.setting.test.ts +198 -0
- package/list/management.cattle.io.setting.vue +13 -0
- package/list/provisioning.cattle.io.cluster.vue +50 -1
- package/list/secret.vue +4 -9
- package/list/service.vue +6 -8
- package/machine-config/amazonec2.vue +11 -4
- package/machine-config/components/EC2Networking.vue +46 -30
- package/machine-config/components/__tests__/EC2Networking.test.ts +7 -7
- package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +0 -9
- package/machine-config/digitalocean.vue +3 -3
- package/models/__tests__/chart.test.ts +2 -2
- package/models/__tests__/namespace.test.ts +11 -0
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +96 -0
- package/models/__tests__/workload.test.ts +42 -1
- package/models/catalog.cattle.io.clusterrepo.js +30 -4
- package/models/chart.js +3 -3
- package/models/ext.cattle.io.token.js +48 -0
- package/models/kontainerdriver.js +2 -2
- package/models/namespace.js +7 -1
- package/models/nodedriver.js +2 -2
- package/models/provisioning.cattle.io.cluster.js +28 -7
- package/models/secret.js +0 -17
- package/models/service.js +44 -1
- package/models/token.js +4 -0
- package/models/workload.js +12 -6
- package/package.json +1 -1
- package/pages/account/index.vue +96 -67
- package/pages/auth/setup.vue +5 -14
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +45 -18
- package/pages/c/_cluster/apps/charts/__tests__/install.test.ts +4 -1
- package/pages/c/_cluster/apps/charts/index.vue +82 -3
- package/pages/c/_cluster/apps/charts/install.vue +317 -42
- package/pages/c/_cluster/explorer/tools/index.vue +1 -1
- package/pages/c/_cluster/manager/cloudCredential/index.vue +1 -1
- package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +5 -4
- package/pages/c/_cluster/settings/index.vue +3 -1
- package/pages/c/_cluster/uiplugins/index.vue +1 -1
- package/plugins/dashboard-store/__tests__/getters.test.ts +108 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +27 -0
- package/plugins/dashboard-store/actions.js +3 -8
- package/plugins/dashboard-store/getters.js +7 -5
- package/plugins/dashboard-store/mutations.js +4 -1
- package/plugins/dashboard-store/resource-class.js +3 -3
- package/plugins/steve/__tests__/steve-class.test.ts +102 -141
- package/plugins/steve/steve-class.js +12 -3
- package/plugins/steve/steve-pagination-utils.ts +6 -2
- package/rancher-components/RcIcon/types.ts +2 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +72 -20
- package/store/prefs.js +3 -0
- package/types/aws-sdk.d.ts +121 -0
- package/types/resources/node.ts +15 -0
- package/types/shell/index.d.ts +537 -506
- package/types/store/pagination.types.ts +5 -5
- package/utils/__tests__/array.test.ts +1 -29
- package/utils/__tests__/cluster-agent-configuration.test.ts +203 -0
- package/utils/array.ts +0 -11
- package/utils/aws.ts +21 -0
- package/utils/cluster.js +22 -2
- package/utils/selector-typed.ts +1 -1
- package/utils/svg-filter.js +4 -3
- package/components/__tests__/ProjectRow.test.ts +0 -206
- package/components/form/ResourceQuota/ProjectRow.vue +0 -277
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
|
+
import Opsgenie from '@shell/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue';
|
|
3
|
+
import { Checkbox } from '@components/Form/Checkbox';
|
|
4
|
+
|
|
5
|
+
describe('component: Opsgenie.vue', () => {
|
|
6
|
+
const defaultProps = {
|
|
7
|
+
mode: 'edit',
|
|
8
|
+
value: { responders: [] },
|
|
9
|
+
namespace: 'test-namespace'
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
it('should render correctly with initial props', () => {
|
|
13
|
+
const wrapper = shallowMount(Opsgenie, {
|
|
14
|
+
props: defaultProps,
|
|
15
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const headings = wrapper.findAll('h3');
|
|
19
|
+
|
|
20
|
+
expect(headings[0].text()).toBe('Target');
|
|
21
|
+
expect(headings[1].text()).toBe('Responders');
|
|
22
|
+
expect(wrapper.findComponent({ name: 'SimpleSecretSelector' }).exists()).toBe(true);
|
|
23
|
+
expect(wrapper.findComponent({ name: 'LabeledInput' }).exists()).toBe(true);
|
|
24
|
+
expect(wrapper.findComponent(Checkbox).exists()).toBe(true);
|
|
25
|
+
expect(wrapper.findComponent({ name: 'ArrayList' }).exists()).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should update proxy URL', async() => {
|
|
29
|
+
const wrapper = shallowMount(Opsgenie, {
|
|
30
|
+
props: defaultProps,
|
|
31
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const labeledInput = wrapper.findComponent({ name: 'LabeledInput' });
|
|
35
|
+
|
|
36
|
+
await labeledInput.vm.$emit('update:value', 'http://my-proxy.com');
|
|
37
|
+
|
|
38
|
+
expect(wrapper.props('value').httpConfig.proxyURL).toBe('http://my-proxy.com');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should toggle send resolved alerts checkbox', async() => {
|
|
42
|
+
const wrapper = shallowMount(Opsgenie, {
|
|
43
|
+
props: defaultProps,
|
|
44
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const checkbox = wrapper.findComponent(Checkbox);
|
|
48
|
+
|
|
49
|
+
await checkbox.vm.$emit('update:value', false);
|
|
50
|
+
expect(wrapper.props('value').sendResolved).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should handle API key secret updates', async() => {
|
|
54
|
+
const wrapper = shallowMount(Opsgenie, {
|
|
55
|
+
props: defaultProps,
|
|
56
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const secretSelector = wrapper.findComponent({ name: 'SimpleSecretSelector' });
|
|
60
|
+
|
|
61
|
+
await secretSelector.vm.$emit('updateSecretName', 'my-secret-name');
|
|
62
|
+
await secretSelector.vm.$emit('updateSecretKey', 'my-secret-key');
|
|
63
|
+
|
|
64
|
+
expect(wrapper.props('value').apiKey.name).toBe('my-secret-name');
|
|
65
|
+
expect(wrapper.props('value').apiKey.key).toBe('my-secret-key');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should add and update a responder', async() => {
|
|
69
|
+
const wrapper = shallowMount(Opsgenie, {
|
|
70
|
+
props: defaultProps,
|
|
71
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const arrayList = wrapper.findComponent({ name: 'ArrayList' });
|
|
75
|
+
|
|
76
|
+
await arrayList.vm.$emit('update:value', [wrapper.vm.defaultResponder]);
|
|
77
|
+
|
|
78
|
+
const responders = wrapper.vm.responders;
|
|
79
|
+
|
|
80
|
+
expect(responders).toHaveLength(1);
|
|
81
|
+
expect(responders[0].type).toBe('team');
|
|
82
|
+
expect(responders[0].target).toBe('id');
|
|
83
|
+
|
|
84
|
+
// Manually change responder type and check if watch updates the value prop
|
|
85
|
+
responders[0].type = 'user';
|
|
86
|
+
await wrapper.vm.$nextTick();
|
|
87
|
+
expect(wrapper.props('value').responders[0].type).toBe('user');
|
|
88
|
+
|
|
89
|
+
// Test updateResponder method
|
|
90
|
+
wrapper.vm.updateResponder({ selected: 'username', text: 'test-user' }, responders[0]);
|
|
91
|
+
await wrapper.vm.$nextTick();
|
|
92
|
+
expect(responders[0].target).toBe('username');
|
|
93
|
+
expect(responders[0].value).toBe('test-user');
|
|
94
|
+
// Check that the watcher has updated the value prop correctly
|
|
95
|
+
expect(wrapper.props('value').responders[0]).toStrictEqual({ type: 'user', username: 'test-user' });
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should remove a responder', async() => {
|
|
99
|
+
const wrapper = shallowMount(Opsgenie, {
|
|
100
|
+
props: {
|
|
101
|
+
...defaultProps,
|
|
102
|
+
value: {
|
|
103
|
+
responders: [
|
|
104
|
+
{
|
|
105
|
+
type: 'team',
|
|
106
|
+
id: 'team-id'
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Simulate the internal workings of ArrayList for removing an item
|
|
115
|
+
wrapper.vm.responders.splice(0, 1);
|
|
116
|
+
await wrapper.vm.$nextTick();
|
|
117
|
+
|
|
118
|
+
expect(wrapper.vm.responders).toHaveLength(0);
|
|
119
|
+
expect(wrapper.props('value').responders).toHaveLength(0);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('should render in view mode', () => {
|
|
123
|
+
const wrapper = shallowMount(Opsgenie, {
|
|
124
|
+
props: {
|
|
125
|
+
mode: 'view',
|
|
126
|
+
value: {
|
|
127
|
+
httpConfig: { proxyURL: 'http://view-proxy.com' },
|
|
128
|
+
sendResolved: false,
|
|
129
|
+
responders: [
|
|
130
|
+
{
|
|
131
|
+
type: 'user',
|
|
132
|
+
name: 'view-user'
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
namespace: 'test-namespace'
|
|
137
|
+
},
|
|
138
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
const labeledInput = wrapper.findComponent({ name: 'LabeledInput' });
|
|
142
|
+
const checkbox = wrapper.findComponent(Checkbox);
|
|
143
|
+
const arrayList = wrapper.findComponent({ name: 'ArrayList' });
|
|
144
|
+
|
|
145
|
+
expect(labeledInput.props('mode')).toBe('view');
|
|
146
|
+
expect(checkbox.props('mode')).toBe('view');
|
|
147
|
+
expect(arrayList.props('mode')).toBe('view');
|
|
148
|
+
|
|
149
|
+
const responder = wrapper.vm.responders[0];
|
|
150
|
+
|
|
151
|
+
expect(responder.type).toBe('user');
|
|
152
|
+
expect(responder.target).toBe('name');
|
|
153
|
+
expect(responder.value).toBe('view-user');
|
|
154
|
+
expect(wrapper.vm.typeLabel(responder.type)).toBe('User');
|
|
155
|
+
expect(wrapper.vm.targetLabel(responder.target)).toBe('Name');
|
|
156
|
+
});
|
|
157
|
+
});
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
|
+
import PagerDuty from '@shell/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue';
|
|
3
|
+
import { Checkbox } from '@components/Form/Checkbox';
|
|
4
|
+
|
|
5
|
+
describe('component: PagerDuty.vue', () => {
|
|
6
|
+
const defaultProps = {
|
|
7
|
+
mode: 'edit',
|
|
8
|
+
value: {},
|
|
9
|
+
namespace: 'test-namespace'
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
it('should render correctly with initial props', () => {
|
|
13
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
14
|
+
props: defaultProps,
|
|
15
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const headings = wrapper.findAll('h3');
|
|
19
|
+
|
|
20
|
+
expect(headings[0].text()).toBe('Target');
|
|
21
|
+
|
|
22
|
+
expect(wrapper.findComponent({ name: 'LabeledSelect' }).exists()).toBe(true);
|
|
23
|
+
expect(wrapper.findComponent({ name: 'SimpleSecretSelector' }).exists()).toBe(true);
|
|
24
|
+
expect(wrapper.findComponent({ name: 'LabeledInput' }).exists()).toBe(true);
|
|
25
|
+
expect(wrapper.findComponent(Checkbox).exists()).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should show routing key selector for "Events API v2"', () => {
|
|
29
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
30
|
+
props: defaultProps,
|
|
31
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
32
|
+
});
|
|
33
|
+
const selector = wrapper.findComponent({ name: 'SimpleSecretSelector' });
|
|
34
|
+
|
|
35
|
+
expect(selector.props('secretNameLabel')).toContain('monitoring.alertmanagerConfig.pagerDuty.routingKey');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should show service key selector for "Prometheus"', async() => {
|
|
39
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
40
|
+
props: { ...defaultProps, value: { serviceKey: { name: 's', key: 'k' } } },
|
|
41
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
42
|
+
});
|
|
43
|
+
const selector = wrapper.findComponent({ name: 'SimpleSecretSelector' });
|
|
44
|
+
|
|
45
|
+
expect(selector.props('secretNameLabel')).toContain('monitoring.alertmanagerConfig.pagerDuty.serviceKey');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should clear other key when integration type changes', async() => {
|
|
49
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
50
|
+
props: { ...defaultProps, value: { routingKey: { name: 'r', key: 'k' } } },
|
|
51
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
wrapper.vm.integrationType = 'Prometheus';
|
|
55
|
+
await wrapper.vm.$nextTick();
|
|
56
|
+
|
|
57
|
+
expect(wrapper.props('value').routingKey).toBeNull();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('should update routing key secret', async() => {
|
|
61
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
62
|
+
props: defaultProps,
|
|
63
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const secretSelector = wrapper.findComponent({ name: 'SimpleSecretSelector' });
|
|
67
|
+
|
|
68
|
+
await secretSelector.vm.$emit('updateSecretName', 'routing-name');
|
|
69
|
+
await secretSelector.vm.$emit('updateSecretKey', 'routing-key');
|
|
70
|
+
|
|
71
|
+
expect(wrapper.props('value').routingKey.name).toBe('routing-name');
|
|
72
|
+
expect(wrapper.props('value').routingKey.key).toBe('routing-key');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should update service key secret', async() => {
|
|
76
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
77
|
+
props: { ...defaultProps, value: { serviceKey: {} } },
|
|
78
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const secretSelector = wrapper.findComponent({ name: 'SimpleSecretSelector' });
|
|
82
|
+
|
|
83
|
+
await secretSelector.vm.$emit('updateSecretName', 'service-name');
|
|
84
|
+
await secretSelector.vm.$emit('updateSecretKey', 'service-key');
|
|
85
|
+
|
|
86
|
+
expect(wrapper.props('value').serviceKey.name).toBe('service-name');
|
|
87
|
+
expect(wrapper.props('value').serviceKey.key).toBe('service-key');
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should update proxy URL', async() => {
|
|
91
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
92
|
+
props: defaultProps,
|
|
93
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
94
|
+
});
|
|
95
|
+
const labeledInput = wrapper.findComponent({ name: 'LabeledInput' });
|
|
96
|
+
|
|
97
|
+
await labeledInput.vm.$emit('update:value', 'http://proxy.com');
|
|
98
|
+
expect(wrapper.props('value').httpConfig.proxyURL).toBe('http://proxy.com');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('should toggle send resolved alerts', async() => {
|
|
102
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
103
|
+
props: defaultProps,
|
|
104
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
105
|
+
});
|
|
106
|
+
const checkbox = wrapper.findComponent(Checkbox);
|
|
107
|
+
|
|
108
|
+
await checkbox.vm.$emit('update:value', false);
|
|
109
|
+
expect(wrapper.props('value').sendResolved).toBe(false);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('should render in view mode', () => {
|
|
113
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
114
|
+
props: { ...defaultProps, mode: 'view' },
|
|
115
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
expect(wrapper.findComponent({ name: 'LabeledSelect' }).attributes('mode')).toBe('view');
|
|
119
|
+
expect(wrapper.findComponent({ name: 'SimpleSecretSelector' }).props('disabled')).toBe(true);
|
|
120
|
+
expect(wrapper.findComponent({ name: 'LabeledInput' }).attributes('mode')).toBe('view');
|
|
121
|
+
expect(wrapper.findComponent(Checkbox).attributes('mode')).toBe('view');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('should show banner if no namespace is provided', () => {
|
|
125
|
+
const wrapper = shallowMount(PagerDuty, {
|
|
126
|
+
props: { ...defaultProps, namespace: '' },
|
|
127
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
expect(wrapper.findComponent({ name: 'Banner' }).exists()).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
|
+
import Slack from '@shell/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue';
|
|
3
|
+
import { Checkbox } from '@components/Form/Checkbox';
|
|
4
|
+
import { LabeledInput } from '@components/Form/LabeledInput';
|
|
5
|
+
import { _CREATE } from '@shell/config/query-params';
|
|
6
|
+
|
|
7
|
+
describe('component: Slack.vue', () => {
|
|
8
|
+
const defaultProps = {
|
|
9
|
+
mode: 'edit',
|
|
10
|
+
value: {},
|
|
11
|
+
namespace: 'test-namespace'
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
it('should render correctly with initial props', () => {
|
|
15
|
+
const wrapper = shallowMount(Slack, {
|
|
16
|
+
props: defaultProps,
|
|
17
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const headings = wrapper.findAll('h3');
|
|
21
|
+
|
|
22
|
+
expect(headings[0].text()).toBe('Target');
|
|
23
|
+
|
|
24
|
+
expect(wrapper.findComponent({ name: 'SimpleSecretSelector' }).exists()).toBe(true);
|
|
25
|
+
expect(wrapper.findAllComponents(LabeledInput)).toHaveLength(2);
|
|
26
|
+
expect(wrapper.findComponent(Checkbox).exists()).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should initialize text template in create mode', () => {
|
|
30
|
+
const wrapper = shallowMount(Slack, {
|
|
31
|
+
props: { ...defaultProps, mode: _CREATE },
|
|
32
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
expect(wrapper.props('value').text).toBe('{{ template "slack.rancher.text" . }}');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should update API URL secret', async() => {
|
|
39
|
+
const wrapper = shallowMount(Slack, {
|
|
40
|
+
props: defaultProps,
|
|
41
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const secretSelector = wrapper.findComponent({ name: 'SimpleSecretSelector' });
|
|
45
|
+
|
|
46
|
+
await secretSelector.vm.$emit('updateSecretName', 'my-secret');
|
|
47
|
+
await secretSelector.vm.$emit('updateSecretKey', 'my-key');
|
|
48
|
+
|
|
49
|
+
expect(wrapper.props('value').apiURL.name).toBe('my-secret');
|
|
50
|
+
expect(wrapper.props('value').apiURL.key).toBe('my-key');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should update default channel', async() => {
|
|
54
|
+
const wrapper = shallowMount(Slack, {
|
|
55
|
+
props: defaultProps,
|
|
56
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
57
|
+
});
|
|
58
|
+
const channelInput = wrapper.findAllComponents(LabeledInput)[0];
|
|
59
|
+
|
|
60
|
+
await channelInput.vm.$emit('update:value', '#my-channel');
|
|
61
|
+
expect(wrapper.props('value').channel).toBe('#my-channel');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should update proxy URL', async() => {
|
|
65
|
+
const wrapper = shallowMount(Slack, {
|
|
66
|
+
props: defaultProps,
|
|
67
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
68
|
+
});
|
|
69
|
+
const proxyInput = wrapper.findAllComponents(LabeledInput)[1];
|
|
70
|
+
|
|
71
|
+
await proxyInput.vm.$emit('update:value', 'http://my-proxy.com');
|
|
72
|
+
expect(wrapper.props('value').httpConfig.proxyURL).toBe('http://my-proxy.com');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should toggle send resolved alerts', async() => {
|
|
76
|
+
const wrapper = shallowMount(Slack, {
|
|
77
|
+
props: defaultProps,
|
|
78
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
79
|
+
});
|
|
80
|
+
const checkbox = wrapper.findComponent(Checkbox);
|
|
81
|
+
|
|
82
|
+
await checkbox.vm.$emit('update:value', true);
|
|
83
|
+
expect(wrapper.props('value').sendResolved).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('should render in view mode', () => {
|
|
87
|
+
const wrapper = shallowMount(Slack, {
|
|
88
|
+
props: { ...defaultProps, mode: 'view' },
|
|
89
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
expect(wrapper.findComponent({ name: 'SimpleSecretSelector' }).props('disabled')).toBe(true);
|
|
93
|
+
const inputs = wrapper.findAllComponents(LabeledInput);
|
|
94
|
+
|
|
95
|
+
expect(inputs[0].props('mode')).toBe('view');
|
|
96
|
+
expect(inputs[1].props('mode')).toBe('view');
|
|
97
|
+
expect(wrapper.findComponent(Checkbox).props('mode')).toBe('view');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should show banner if no namespace is provided', () => {
|
|
101
|
+
const wrapper = shallowMount(Slack, {
|
|
102
|
+
props: { ...defaultProps, namespace: '' },
|
|
103
|
+
global: { mocks: { $fetchState: { pending: false, error: null } } }
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(wrapper.findComponent({ name: 'Banner' }).exists()).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -4,10 +4,11 @@ import LabeledSelect from '@shell/components/form/LabeledSelect';
|
|
|
4
4
|
import { Checkbox } from '@components/Form/Checkbox';
|
|
5
5
|
import SimpleSecretSelector from '@shell/components/form/SimpleSecretSelector';
|
|
6
6
|
import { _VIEW } from '@shell/config/query-params';
|
|
7
|
+
import Banner from '@components/Banner/Banner.vue';
|
|
7
8
|
|
|
8
9
|
export default {
|
|
9
10
|
components: {
|
|
10
|
-
Checkbox, LabeledInput, LabeledSelect, SimpleSecretSelector
|
|
11
|
+
Banner, Checkbox, LabeledInput, LabeledSelect, SimpleSecretSelector
|
|
11
12
|
},
|
|
12
13
|
props: {
|
|
13
14
|
mode: {
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
|
+
import Auth from '@shell/edit/monitoring.coreos.com.receiver/auth.vue';
|
|
3
|
+
import { LabeledInput } from '@components/Form/LabeledInput';
|
|
4
|
+
import LabeledSelect from '@shell/components/form/LabeledSelect';
|
|
5
|
+
|
|
6
|
+
describe('component: Auth', () => {
|
|
7
|
+
const defaultProps = {
|
|
8
|
+
mode: 'create',
|
|
9
|
+
value: {},
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
it('should render correctly with default auth type "none"', () => {
|
|
13
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps } });
|
|
14
|
+
|
|
15
|
+
expect(wrapper.find('h3').text()).toBe('%monitoringReceiver.auth.label%');
|
|
16
|
+
const labeledSelect = wrapper.findComponent(LabeledSelect);
|
|
17
|
+
|
|
18
|
+
expect(labeledSelect.exists()).toBe(true);
|
|
19
|
+
expect(wrapper.vm.authType).toBe('none');
|
|
20
|
+
|
|
21
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
22
|
+
|
|
23
|
+
expect(labeledInputs).toHaveLength(0);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should initialize with "basic_auth" if value contains it', () => {
|
|
27
|
+
const value = { basic_auth: { username: 'user' } };
|
|
28
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
29
|
+
|
|
30
|
+
expect(wrapper.vm.authType).toBe('basic_auth');
|
|
31
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
32
|
+
|
|
33
|
+
expect(labeledInputs).toHaveLength(2);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should initialize with "bearer_token" if value contains it', () => {
|
|
37
|
+
const value = { bearer_token: 'token' };
|
|
38
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
39
|
+
|
|
40
|
+
expect(wrapper.vm.authType).toBe('bearer_token');
|
|
41
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
42
|
+
|
|
43
|
+
expect(labeledInputs).toHaveLength(1);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('should initialize with "bearer_token_file" if value contains it', () => {
|
|
47
|
+
const value = { bearer_token_file: '/path/to/file' };
|
|
48
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
49
|
+
|
|
50
|
+
expect(wrapper.vm.authType).toBe('bearer_token_file');
|
|
51
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
52
|
+
|
|
53
|
+
expect(labeledInputs).toHaveLength(1);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should switch to "basic_auth" and display its inputs', async() => {
|
|
57
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps } });
|
|
58
|
+
|
|
59
|
+
const labeledSelect = wrapper.findComponent(LabeledSelect);
|
|
60
|
+
|
|
61
|
+
await labeledSelect.vm.$emit('update:value', 'basic_auth');
|
|
62
|
+
await wrapper.vm.$nextTick();
|
|
63
|
+
|
|
64
|
+
expect(wrapper.vm.authType).toBe('basic_auth');
|
|
65
|
+
expect(wrapper.props().value).toHaveProperty('basic_auth');
|
|
66
|
+
expect(wrapper.props().value.basic_auth).toStrictEqual({});
|
|
67
|
+
|
|
68
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
69
|
+
|
|
70
|
+
expect(labeledInputs).toHaveLength(2);
|
|
71
|
+
expect(labeledInputs[0].props().label).toBe('%monitoringReceiver.auth.username%');
|
|
72
|
+
expect(labeledInputs[1].props().label).toBe('%monitoringReceiver.auth.password%');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should update basic_auth username and password', async() => {
|
|
76
|
+
const value = { basic_auth: { username: 'initial' } };
|
|
77
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
78
|
+
|
|
79
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
80
|
+
|
|
81
|
+
await labeledInputs[0].vm.$emit('update:value', 'testuser');
|
|
82
|
+
await labeledInputs[1].vm.$emit('update:value', 'testpass');
|
|
83
|
+
|
|
84
|
+
expect(wrapper.props().value.basic_auth.username).toBe('testuser');
|
|
85
|
+
expect(wrapper.props().value.basic_auth.password).toBe('testpass');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('should switch to "bearer_token" and display its input', async() => {
|
|
89
|
+
const value = { basic_auth: { username: 'user' } };
|
|
90
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
91
|
+
|
|
92
|
+
const labeledSelect = wrapper.findComponent(LabeledSelect);
|
|
93
|
+
|
|
94
|
+
await labeledSelect.vm.$emit('update:value', 'bearer_token');
|
|
95
|
+
await wrapper.vm.$nextTick();
|
|
96
|
+
|
|
97
|
+
expect(wrapper.vm.authType).toBe('bearer_token');
|
|
98
|
+
expect(wrapper.props().value).not.toHaveProperty('basic_auth');
|
|
99
|
+
expect(wrapper.props().value).toHaveProperty('bearer_token');
|
|
100
|
+
expect(wrapper.props().value.bearer_token).toBe('');
|
|
101
|
+
|
|
102
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
103
|
+
|
|
104
|
+
expect(labeledInputs).toHaveLength(1);
|
|
105
|
+
expect(labeledInputs[0].props().label).toBe('%monitoringReceiver.auth.bearerToken.label%');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should update bearer_token', async() => {
|
|
109
|
+
const value = { bearer_token: 'initial-token' };
|
|
110
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
111
|
+
const labeledInput = wrapper.findComponent(LabeledInput);
|
|
112
|
+
|
|
113
|
+
await labeledInput.vm.$emit('update:value', 'secret-token');
|
|
114
|
+
|
|
115
|
+
expect(wrapper.props().value.bearer_token).toBe('secret-token');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should switch to "bearer_token_file" and display its input', async() => {
|
|
119
|
+
const value = { basic_auth: { username: 'user' } };
|
|
120
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
121
|
+
|
|
122
|
+
const labeledSelect = wrapper.findComponent(LabeledSelect);
|
|
123
|
+
|
|
124
|
+
await labeledSelect.vm.$emit('update:value', 'bearer_token_file');
|
|
125
|
+
await wrapper.vm.$nextTick();
|
|
126
|
+
|
|
127
|
+
expect(wrapper.vm.authType).toBe('bearer_token_file');
|
|
128
|
+
expect(wrapper.props().value).not.toHaveProperty('basic_auth');
|
|
129
|
+
expect(wrapper.props().value).toHaveProperty('bearer_token_file');
|
|
130
|
+
expect(wrapper.props().value.bearer_token_file).toBe('');
|
|
131
|
+
|
|
132
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
133
|
+
|
|
134
|
+
expect(labeledInputs).toHaveLength(1);
|
|
135
|
+
expect(labeledInputs[0].props().label).toBe('%monitoringReceiver.auth.bearerTokenFile.label%');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('should update bearer_token_file', async() => {
|
|
139
|
+
const value = { bearer_token_file: '/initial/path' };
|
|
140
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
141
|
+
const labeledInput = wrapper.findComponent(LabeledInput);
|
|
142
|
+
|
|
143
|
+
await labeledInput.vm.$emit('update:value', '/path/to/token/file');
|
|
144
|
+
|
|
145
|
+
expect(wrapper.props().value.bearer_token_file).toBe('/path/to/token/file');
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('should switch from a selected auth type back to "none"', async() => {
|
|
149
|
+
const value = { basic_auth: { username: 'user' } };
|
|
150
|
+
const wrapper = shallowMount(Auth, { props: { ...defaultProps, value } });
|
|
151
|
+
|
|
152
|
+
expect(wrapper.vm.authType).toBe('basic_auth');
|
|
153
|
+
|
|
154
|
+
const labeledSelect = wrapper.findComponent(LabeledSelect);
|
|
155
|
+
|
|
156
|
+
await labeledSelect.vm.$emit('update:value', 'none');
|
|
157
|
+
await wrapper.vm.$nextTick();
|
|
158
|
+
|
|
159
|
+
expect(wrapper.vm.authType).toBe('none');
|
|
160
|
+
expect(wrapper.props().value).not.toHaveProperty('basic_auth');
|
|
161
|
+
const labeledInputs = wrapper.findAllComponents(LabeledInput);
|
|
162
|
+
|
|
163
|
+
expect(labeledInputs).toHaveLength(0);
|
|
164
|
+
});
|
|
165
|
+
});
|