Skip to content

Commit 5de4e36

Browse files
committed
BE members: Fix not being able to modify members
1 parent c6bdc27 commit 5de4e36

File tree

9 files changed

+34
-268
lines changed

9 files changed

+34
-268
lines changed

cypress/e2e/billingentity-members.cy.ts

Lines changed: 1 addition & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ import { BillingEntityPermissions } from '../../src/app/types/billing-entity';
33
import { ClusterRoleBinding, ClusterRoleBindingPermissions } from '../../src/app/types/clusterrole-binding';
44
import { billingEntityNxt } from '../fixtures/billingentities';
55
import { createClusterRoleBinding } from '../fixtures/clusterrole-binding';
6-
import { createClusterRole } from '../fixtures/clusterrole';
7-
import { ClusterRolePermissions } from '../../src/app/types/clusterRole';
86

9-
describe('billing entity edit members with existing roles', () => {
7+
describe('billing entity edit members', () => {
108
beforeEach(() => {
119
cy.setupAuth();
1210
window.localStorage.setItem('hideFirstTimeLoginDialog', 'true');
@@ -20,17 +18,9 @@ describe('billing entity edit members with existing roles', () => {
2018
cy.setPermission(
2119
{ verb: 'list', ...BillingEntityPermissions },
2220
{ verb: 'get', ...BillingEntityPermissions, name: 'be-2345' },
23-
{ verb: 'get', ...ClusterRoleBindingPermissions, name: 'billingentities-be-2345-viewer' },
24-
{ verb: 'get', ...ClusterRoleBindingPermissions, name: 'billingentities-be-2345-admin' },
2521
{ verb: 'update', ...ClusterRoleBindingPermissions, name: 'billingentities-be-2345-viewer' },
2622
{ verb: 'update', ...ClusterRoleBindingPermissions, name: 'billingentities-be-2345-admin' }
2723
);
28-
cy.intercept('GET', 'appuio-api/apis/rbac.authorization.k8s.io/v1/clusterroles/billingentities-be-2345-admin', {
29-
body: createClusterRole('be-2345', true),
30-
});
31-
cy.intercept('GET', 'appuio-api/apis/rbac.authorization.k8s.io/v1/clusterroles/billingentities-be-2345-viewer', {
32-
body: createClusterRole('be-2345', false),
33-
});
3424
});
3525

3626
it('add member', () => {
@@ -290,90 +280,3 @@ describe('billing entity edit members with existing roles', () => {
290280
cy.get('p-message').contains('You are about to remove yourself as admin!');
291281
});
292282
});
293-
294-
describe('billing entity edit members without initial roles', () => {
295-
beforeEach(() => {
296-
cy.setupAuth();
297-
window.localStorage.setItem('hideFirstTimeLoginDialog', 'true');
298-
cy.disableCookieBanner();
299-
});
300-
beforeEach(() => {
301-
// needed for initial getUser request
302-
cy.intercept('GET', 'appuio-api/apis/appuio.io/v1/users/mig', {
303-
body: createUser({ username: 'mig', defaultOrganizationRef: 'nxt' }),
304-
});
305-
cy.setPermission(
306-
{ verb: 'list', ...BillingEntityPermissions },
307-
{ verb: 'get', ...BillingEntityPermissions, name: 'be-2345' },
308-
{ verb: 'get', ...ClusterRoleBindingPermissions, name: 'billingentities-be-2345-viewer' },
309-
{ verb: 'update', ...ClusterRoleBindingPermissions, name: 'billingentities-be-2345-admin' },
310-
{ verb: 'update', ...ClusterRoleBindingPermissions, name: 'billingentities-be-2345-viewer' },
311-
{ verb: 'update', ...ClusterRolePermissions, name: 'billingentities-be-2345-admin' }
312-
);
313-
cy.intercept('GET', 'appuio-api/apis/rbac.authorization.k8s.io/v1/clusterroles/billingentities-be-2345-admin', {
314-
statusCode: 404,
315-
});
316-
cy.intercept('GET', 'appuio-api/apis/rbac.authorization.k8s.io/v1/clusterroles/billingentities-be-2345-viewer', {
317-
statusCode: 404,
318-
});
319-
cy.intercept(
320-
'GET',
321-
'appuio-api/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/billingentities-be-2345-viewer',
322-
{
323-
statusCode: 404,
324-
}
325-
);
326-
cy.intercept(
327-
'GET',
328-
'appuio-api/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/billingentities-be-2345-admin',
329-
{
330-
statusCode: 404,
331-
}
332-
);
333-
});
334-
335-
it('add member', () => {
336-
cy.intercept('GET', 'appuio-api/apis/billing.appuio.io/v1/billingentities/be-2345', {
337-
body: billingEntityNxt,
338-
});
339-
cy.intercept('POST', 'appuio-api/apis/rbac.authorization.k8s.io/v1/clusterroles', (req) => {
340-
if (req.body.metadata.name.includes('admin')) {
341-
expect(req.body.rules).to.have.length(2);
342-
const rule = req.body.rules && req.body.rules[0];
343-
expect(rule && rule.resourceNames).to.include('billingentities-be-2345-admin');
344-
expect(rule && rule.verbs).to.eql(['*']);
345-
346-
req.reply(createClusterRole('be-2345', true));
347-
return;
348-
}
349-
if (req.body.metadata.name.includes('viewer')) {
350-
const rule = req.body.rules && req.body.rules[0];
351-
expect(rule && rule.resourceNames).to.include('billingentities-be-2345-viewer');
352-
expect(rule && rule.verbs).to.eql(['get', 'watch']);
353-
354-
req.reply(createClusterRole('be-2345', false));
355-
return;
356-
}
357-
}).as('createRole');
358-
359-
cy.intercept('POST', 'appuio-api/apis/rbac.authorization.k8s.io/v1/clusterrolebindings', (req) => {
360-
expect(req.body.subjects).to.have.length(1);
361-
const subject = req.body.subjects && req.body.subjects[0];
362-
expect(subject && subject.name).to.eq('appuio#crc');
363-
364-
if (req.body.metadata.name.includes('admin')) {
365-
req.reply(createClusterRoleBinding({ name: 'billingentities-be-2345-admin', users: ['appuio#crc'] }));
366-
}
367-
if (req.body.metadata.name.includes('viewer')) {
368-
req.reply(createClusterRoleBinding({ name: 'billingentities-be-2345-viewer', users: ['appuio#crc'] }));
369-
}
370-
}).as('createRoleBinding');
371-
372-
cy.visit('/billingentities/be-2345/members');
373-
cy.get('.text-3xl').should('contain.text', 'be-2345 Members');
374-
cy.get('[data-cy="name-input-0"]').type('crc');
375-
cy.get('p-multiselect').eq(0).click().contains('billingentities-be-2345-admin').click();
376-
cy.get('button[type=submit]').click();
377-
cy.wait(['@createRole', '@createRoleBinding']);
378-
});
379-
});

cypress/fixtures/clusterrole.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/app/billingentity/billing-entity.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ <h1 class="pt-0 mt-0 mb-0" i18n id="billingentities-title">Billing</h1>
3939
{{ p.billingEntity.metadata.name }}
4040
</div>
4141
<div>
42-
<a *ngIf="p.canViewMembers" [routerLink]="[p.billingEntity.metadata.name, 'members']"
42+
<a *ngIf="p.canEditMembers" [routerLink]="[p.billingEntity.metadata.name, 'members']"
4343
class="text-blue-500 hover:text-primary cursor-pointer ml-3" i18n-title title="Edit members">
4444
<fa-icon [icon]="faUserGroup" />
4545
</a>

src/app/billingentity/billing-entity.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ export class BillingEntityComponent implements OnInit {
5757
this.billingEntityService.canEditMembers(`billingentities-${be.metadata.name}-admin`),
5858
this.billingEntityService.canEditBilling(be.metadata.name),
5959
]).pipe(
60-
map(([billingEntity, canViewMembers, canEdit]) => {
60+
map(([billingEntity, canEditMembers, canEdit]) => {
6161
return {
6262
billingEntity,
63-
canViewMembers,
63+
canEditMembers,
6464
canEdit,
6565
} satisfies BillingModel;
6666
})
@@ -91,5 +91,5 @@ interface ViewModel {
9191
interface BillingModel {
9292
billingEntity: BillingEntity;
9393
canEdit: boolean;
94-
canViewMembers: boolean;
94+
canEditMembers: boolean;
9595
}

src/app/billingentity/billingentity-members/billing-entity-members.component.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
<ng-container *ngrxLet="payload$ as payload; suspenseTpl: loading; error as err">
2-
<ng-container *ngIf="payload as p">
1+
<ng-container *ngrxLet="viewModel$ as vm; suspenseTpl: loading; error as err">
2+
<ng-container *ngIf="vm as p">
33
<div class="surface-card p-4 shadow-2 border-round mb-4">
44
<div class="flex flex-row justify-content-between">
55
<div class="text-3xl font-medium text-900 mb-3">
6-
{{ payload.billingEntity.metadata.name }}
6+
{{ vm.billingEntity.metadata.name }}
77
<span i18n>Members</span>
88
</div>
99
<a appBackLink="../.." class="text-blue-500 hover:text-primary text-2xl cursor-pointer">
@@ -12,7 +12,7 @@
1212
</div>
1313

1414
<div class="border-top-1 surface-border" *ngIf="form">
15-
<form (submit)="save(payload)" [formGroup]="form" class="flex flex-column" novalidate>
15+
<form (submit)="save(vm)" [formGroup]="form" class="flex flex-column" novalidate>
1616
<div class="max-w-1200px">
1717
<div class="grid mb-2 mt-2">
1818
<p-message
@@ -44,7 +44,7 @@
4444
<label i18n for="selectedRoles" class="md:hidden">Roles</label>
4545
<p-multiSelect
4646
formControlName="selectedRoles"
47-
[options]="[payload.viewerBinding.metadata.name, payload.adminBinding.metadata.name]"
47+
[options]="[vm.viewerBinding.metadata.name, vm.adminBinding.metadata.name]"
4848
defaultLabel="Select Roles"
4949
[maxSelectedLabels]="1"
5050
[styleClass]="'w-full'"
@@ -80,7 +80,7 @@
8080
severity="warn"
8181
text="You are about to remove yourself as admin!"></p-message>
8282
</div>
83-
<button [disabled]="form.invalid" [loading]="(rolebindingService.loading$ | ngrxPush) ?? false" class="w-auto mt-3" pButton pRipple type="submit">
83+
<button [disabled]="form.invalid" [loading]="(roleBindingService.loading$ | ngrxPush) ?? false" class="w-auto mt-3" pButton pRipple type="submit">
8484
<fa-icon [icon]="faSave" class="pr-2"></fa-icon>
8585
<span class="pr-2" i18n>Save</span>
8686
</button>

0 commit comments

Comments
 (0)