mirror of
https://github.com/google/nomulus
synced 2025-12-23 06:15:42 +00:00
Add suspend / unsuspend to the console (#2675)
This commit is contained in:
@@ -24,7 +24,11 @@
|
|||||||
</div>
|
</div>
|
||||||
} @else {
|
} @else {
|
||||||
<mat-menu #actions="matMenu">
|
<mat-menu #actions="matMenu">
|
||||||
<ng-template matMenuContent let-domainName="domainName">
|
<ng-template
|
||||||
|
matMenuContent
|
||||||
|
let-domainName="domainName"
|
||||||
|
let-domain="domain"
|
||||||
|
>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
(click)="openRegistryLock(domainName)"
|
(click)="openRegistryLock(domainName)"
|
||||||
@@ -33,6 +37,24 @@
|
|||||||
<mat-icon>key</mat-icon>
|
<mat-icon>key</mat-icon>
|
||||||
<span>Registry Lock</span>
|
<span>Registry Lock</span>
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
mat-menu-item
|
||||||
|
(click)="onSuspendClick(domainName)"
|
||||||
|
[elementId]="getElementIdForSuspendUnsuspend()"
|
||||||
|
[disabled]="isDomainUnsuspendable(domain)"
|
||||||
|
>
|
||||||
|
<mat-icon>lock_clock</mat-icon>
|
||||||
|
<span>Suspend</span>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
mat-menu-item
|
||||||
|
(click)="onUnsuspendClick(domainName)"
|
||||||
|
[elementId]="getElementIdForSuspendUnsuspend()"
|
||||||
|
[disabled]="!isDomainUnsuspendable(domain)"
|
||||||
|
>
|
||||||
|
<mat-icon>lock_open</mat-icon>
|
||||||
|
<span>Unsuspend</span>
|
||||||
|
</button>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
<div
|
<div
|
||||||
@@ -170,7 +192,10 @@
|
|||||||
<button
|
<button
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
[matMenuTriggerFor]="actions"
|
[matMenuTriggerFor]="actions"
|
||||||
[matMenuTriggerData]="{ domainName: element.domainName }"
|
[matMenuTriggerData]="{
|
||||||
|
domainName: element.domainName,
|
||||||
|
domain: element
|
||||||
|
}"
|
||||||
aria-label="Domain actions"
|
aria-label="Domain actions"
|
||||||
>
|
>
|
||||||
<mat-icon>more_horiz</mat-icon>
|
<mat-icon>more_horiz</mat-icon>
|
||||||
|
|||||||
@@ -14,13 +14,17 @@
|
|||||||
|
|
||||||
import { SelectionModel } from '@angular/cdk/collections';
|
import { SelectionModel } from '@angular/cdk/collections';
|
||||||
import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';
|
import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';
|
||||||
import { Component, ViewChild, effect, Inject } from '@angular/core';
|
import { Component, effect, Inject, ViewChild } from '@angular/core';
|
||||||
import { MatPaginator, PageEvent } from '@angular/material/paginator';
|
import { MatPaginator, PageEvent } from '@angular/material/paginator';
|
||||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||||
import { MatTableDataSource } from '@angular/material/table';
|
import { MatTableDataSource } from '@angular/material/table';
|
||||||
import { Subject, debounceTime, take, filter } from 'rxjs';
|
import { debounceTime, filter, Subject, take } from 'rxjs';
|
||||||
import { RegistrarService } from '../registrar/registrar.service';
|
import { RegistrarService } from '../registrar/registrar.service';
|
||||||
import { Domain, DomainListService } from './domainList.service';
|
import {
|
||||||
|
BULK_ACTION_NAME,
|
||||||
|
Domain,
|
||||||
|
DomainListService,
|
||||||
|
} from './domainList.service';
|
||||||
import { RegistryLockComponent } from './registryLock.component';
|
import { RegistryLockComponent } from './registryLock.component';
|
||||||
import { RegistryLockService } from './registryLock.service';
|
import { RegistryLockService } from './registryLock.service';
|
||||||
import {
|
import {
|
||||||
@@ -62,6 +66,12 @@ export class ResponseDialogComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Operation {
|
||||||
|
deleting = 'deleting',
|
||||||
|
suspending = 'suspending',
|
||||||
|
unsuspending = 'unsuspending',
|
||||||
|
}
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-reason-dialog',
|
selector: 'app-reason-dialog',
|
||||||
template: `
|
template: `
|
||||||
@@ -75,8 +85,8 @@ export class ResponseDialogComponent {
|
|||||||
</mat-dialog-content>
|
</mat-dialog-content>
|
||||||
<mat-dialog-actions>
|
<mat-dialog-actions>
|
||||||
<button mat-button (click)="onCancel()">Cancel</button>
|
<button mat-button (click)="onCancel()">Cancel</button>
|
||||||
<button mat-button color="warn" (click)="onDelete()" [disabled]="!reason">
|
<button mat-button color="warn" (click)="onSave()" [disabled]="!reason">
|
||||||
Delete
|
Save
|
||||||
</button>
|
</button>
|
||||||
</mat-dialog-actions>
|
</mat-dialog-actions>
|
||||||
`,
|
`,
|
||||||
@@ -84,14 +94,13 @@ export class ResponseDialogComponent {
|
|||||||
})
|
})
|
||||||
export class ReasonDialogComponent {
|
export class ReasonDialogComponent {
|
||||||
reason: string = '';
|
reason: string = '';
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
public dialogRef: MatDialogRef<ReasonDialogComponent>,
|
public dialogRef: MatDialogRef<ReasonDialogComponent>,
|
||||||
@Inject(MAT_DIALOG_DATA)
|
@Inject(MAT_DIALOG_DATA)
|
||||||
public data: { operation: 'deleting' | 'suspending' }
|
public data: { operation: Operation }
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
onDelete(): void {
|
onSave(): void {
|
||||||
this.dialogRef.close(this.reason);
|
this.dialogRef.close(this.reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,6 +117,13 @@ export class ReasonDialogComponent {
|
|||||||
})
|
})
|
||||||
export class DomainListComponent {
|
export class DomainListComponent {
|
||||||
public static PATH = 'domain-list';
|
public static PATH = 'domain-list';
|
||||||
|
private static SUSPENDED_STATUSES = [
|
||||||
|
'SERVER_RENEW_PROHIBITED',
|
||||||
|
'SERVER_TRANSFER_PROHIBITED',
|
||||||
|
'SERVER_UPDATE_PROHIBITED',
|
||||||
|
'SERVER_DELETE_PROHIBITED',
|
||||||
|
'SERVER_HOLD',
|
||||||
|
];
|
||||||
private readonly DEBOUNCE_MS = 500;
|
private readonly DEBOUNCE_MS = 500;
|
||||||
isAllSelected = false;
|
isAllSelected = false;
|
||||||
|
|
||||||
@@ -258,19 +274,30 @@ export class DomainListComponent {
|
|||||||
return RESTRICTED_ELEMENTS.BULK_DELETE;
|
return RESTRICTED_ELEMENTS.BULK_DELETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getElementIdForSuspendUnsuspend() {
|
||||||
|
return RESTRICTED_ELEMENTS.SUSPEND;
|
||||||
|
}
|
||||||
|
|
||||||
getOperationMessage(domain: string) {
|
getOperationMessage(domain: string) {
|
||||||
if (this.operationResult && this.operationResult[domain])
|
if (this.operationResult && this.operationResult[domain])
|
||||||
return this.operationResult[domain].message;
|
return this.operationResult[domain].message;
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isDomainUnsuspendable(domain: Domain) {
|
||||||
|
return DomainListComponent.SUSPENDED_STATUSES.every((s) =>
|
||||||
|
domain.statuses.includes(s)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
sendDeleteRequest(reason: string) {
|
sendDeleteRequest(reason: string) {
|
||||||
this.isLoading = true;
|
this.isLoading = true;
|
||||||
this.domainListService
|
this.domainListService
|
||||||
.deleteDomains(
|
.bulkDomainAction(
|
||||||
this.selection.selected,
|
this.selection.selected.map((d) => d.domainName),
|
||||||
reason,
|
reason,
|
||||||
this.registrarService.registrarId()
|
this.registrarService.registrarId(),
|
||||||
|
BULK_ACTION_NAME.DELETE
|
||||||
)
|
)
|
||||||
.pipe(take(1))
|
.pipe(take(1))
|
||||||
.subscribe({
|
.subscribe({
|
||||||
@@ -294,15 +321,17 @@ export class DomainListComponent {
|
|||||||
this.operationResult = result;
|
this.operationResult = result;
|
||||||
this.reloadData();
|
this.reloadData();
|
||||||
},
|
},
|
||||||
error: (err: HttpErrorResponse) =>
|
error: (err: HttpErrorResponse) => {
|
||||||
this._snackBar.open(err.error || err.message),
|
this.isLoading = false;
|
||||||
|
this._snackBar.open(err.error || err.message);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteSelectedDomains() {
|
deleteSelectedDomains() {
|
||||||
const dialogRef = this.dialog.open(ReasonDialogComponent, {
|
const dialogRef = this.dialog.open(ReasonDialogComponent, {
|
||||||
data: {
|
data: {
|
||||||
operation: 'deleting',
|
operation: Operation.deleting,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -314,4 +343,77 @@ export class DomainListComponent {
|
|||||||
)
|
)
|
||||||
.subscribe(this.sendDeleteRequest.bind(this));
|
.subscribe(this.sendDeleteRequest.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sendSuspendUnsuspendRequest(
|
||||||
|
domainName: string,
|
||||||
|
reason: string,
|
||||||
|
actionName: BULK_ACTION_NAME
|
||||||
|
) {
|
||||||
|
this.isLoading = true;
|
||||||
|
this.domainListService
|
||||||
|
.bulkDomainAction(
|
||||||
|
[domainName],
|
||||||
|
reason,
|
||||||
|
this.registrarService.registrarId(),
|
||||||
|
actionName
|
||||||
|
)
|
||||||
|
.pipe(take(1))
|
||||||
|
.subscribe({
|
||||||
|
next: (result: DomainData) => {
|
||||||
|
this.isLoading = false;
|
||||||
|
if (result[domainName].responseCode.toString().startsWith('2')) {
|
||||||
|
this._snackBar.open(result[domainName].message);
|
||||||
|
} else {
|
||||||
|
this.reloadData();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: (err: HttpErrorResponse) => {
|
||||||
|
this.isLoading = false;
|
||||||
|
this._snackBar.open(err.error || err.message);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
onSuspendClick(domainName: string) {
|
||||||
|
const dialogRef = this.dialog.open(ReasonDialogComponent, {
|
||||||
|
data: {
|
||||||
|
operation: Operation.suspending,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
dialogRef
|
||||||
|
.afterClosed()
|
||||||
|
.pipe(
|
||||||
|
take(1),
|
||||||
|
filter((reason) => !!reason)
|
||||||
|
)
|
||||||
|
.subscribe((reason) => {
|
||||||
|
this.sendSuspendUnsuspendRequest(
|
||||||
|
domainName,
|
||||||
|
reason,
|
||||||
|
BULK_ACTION_NAME.SUSPEND
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onUnsuspendClick(domainName: string) {
|
||||||
|
const dialogRef = this.dialog.open(ReasonDialogComponent, {
|
||||||
|
data: {
|
||||||
|
operation: Operation.unsuspending,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
dialogRef
|
||||||
|
.afterClosed()
|
||||||
|
.pipe(
|
||||||
|
take(1),
|
||||||
|
filter((reason) => !!reason)
|
||||||
|
)
|
||||||
|
.subscribe((reason) => {
|
||||||
|
this.sendSuspendUnsuspendRequest(
|
||||||
|
domainName,
|
||||||
|
reason,
|
||||||
|
BULK_ACTION_NAME.UNSUSPEND
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,12 @@ export interface DomainListResult {
|
|||||||
totalResults: number;
|
totalResults: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum BULK_ACTION_NAME {
|
||||||
|
DELETE = 'DELETE',
|
||||||
|
SUSPEND = 'SUSPEND',
|
||||||
|
UNSUSPEND = 'UNSUSPEND',
|
||||||
|
}
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root',
|
providedIn: 'root',
|
||||||
})
|
})
|
||||||
@@ -71,11 +77,16 @@ export class DomainListService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteDomains(domains: Domain[], reason: string, registrarId: string) {
|
bulkDomainAction(
|
||||||
|
domains: string[],
|
||||||
|
reason: string,
|
||||||
|
registrarId: string,
|
||||||
|
actionName: BULK_ACTION_NAME
|
||||||
|
) {
|
||||||
return this.backendService.bulkDomainAction(
|
return this.backendService.bulkDomainAction(
|
||||||
domains.map((d) => d.domainName),
|
domains,
|
||||||
reason,
|
reason,
|
||||||
'DELETE',
|
actionName,
|
||||||
registrarId
|
registrarId
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export enum RESTRICTED_ELEMENTS {
|
|||||||
OTE,
|
OTE,
|
||||||
USERS,
|
USERS,
|
||||||
BULK_DELETE,
|
BULK_DELETE,
|
||||||
|
SUSPEND,
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DISABLED_ELEMENTS_PER_ROLE = {
|
export const DISABLED_ELEMENTS_PER_ROLE = {
|
||||||
@@ -28,6 +29,7 @@ export const DISABLED_ELEMENTS_PER_ROLE = {
|
|||||||
RESTRICTED_ELEMENTS.OTE,
|
RESTRICTED_ELEMENTS.OTE,
|
||||||
RESTRICTED_ELEMENTS.USERS,
|
RESTRICTED_ELEMENTS.USERS,
|
||||||
RESTRICTED_ELEMENTS.BULK_DELETE,
|
RESTRICTED_ELEMENTS.BULK_DELETE,
|
||||||
|
RESTRICTED_ELEMENTS.SUSPEND,
|
||||||
],
|
],
|
||||||
SUPPORT_LEAD: [RESTRICTED_ELEMENTS.USERS],
|
SUPPORT_LEAD: [RESTRICTED_ELEMENTS.USERS],
|
||||||
SUPPORT_AGENT: [RESTRICTED_ELEMENTS.USERS],
|
SUPPORT_AGENT: [RESTRICTED_ELEMENTS.USERS],
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
// Copyright 2025 The Nomulus Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package google.registry.ui.server.console.domains;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import google.registry.model.console.ConsolePermission;
|
||||||
|
|
||||||
|
/** An action that will unsuspend the given domain, removing all 5 server*Prohibited statuses. */
|
||||||
|
public class ConsoleBulkDomainUnsuspendActionType implements ConsoleDomainActionType {
|
||||||
|
|
||||||
|
private static final String DOMAIN_SUSPEND_XML =
|
||||||
|
"""
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<epp
|
||||||
|
xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<command>
|
||||||
|
<update>
|
||||||
|
<domain:update
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:name>%DOMAIN_NAME%</domain:name>
|
||||||
|
<domain:add></domain:add>
|
||||||
|
<domain:rem>
|
||||||
|
<domain:status s="serverDeleteProhibited" lang="en"></domain:status>
|
||||||
|
<domain:status s="serverHold" lang="en"></domain:status>
|
||||||
|
<domain:status s="serverRenewProhibited" lang="en"></domain:status>
|
||||||
|
<domain:status s="serverTransferProhibited" lang="en"></domain:status>
|
||||||
|
<domain:status s="serverUpdateProhibited" lang="en"></domain:status>
|
||||||
|
</domain:rem>
|
||||||
|
</domain:update>
|
||||||
|
</update>
|
||||||
|
<extension>
|
||||||
|
<metadata:metadata
|
||||||
|
xmlns:metadata="urn:google:params:xml:ns:metadata-1.0">
|
||||||
|
<metadata:reason>Console unsuspension: %REASON%</metadata:reason>
|
||||||
|
<metadata:requestedByRegistrar>false</metadata:requestedByRegistrar>
|
||||||
|
</metadata:metadata>
|
||||||
|
</extension>
|
||||||
|
<clTRID>RegistryConsole</clTRID>
|
||||||
|
</command>
|
||||||
|
</epp>""";
|
||||||
|
|
||||||
|
private final String reason;
|
||||||
|
|
||||||
|
public ConsoleBulkDomainUnsuspendActionType(JsonElement jsonElement) {
|
||||||
|
this.reason = jsonElement.getAsJsonObject().get("reason").getAsString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getXmlContentsToRun(String domainName) {
|
||||||
|
return ConsoleDomainActionType.fillSubstitutions(
|
||||||
|
DOMAIN_SUSPEND_XML, ImmutableMap.of("DOMAIN_NAME", domainName, "REASON", reason));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConsolePermission getNecessaryPermission() {
|
||||||
|
return ConsolePermission.SUSPEND_DOMAIN;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,7 +31,8 @@ public interface ConsoleDomainActionType {
|
|||||||
|
|
||||||
enum BulkAction {
|
enum BulkAction {
|
||||||
DELETE(ConsoleBulkDomainDeleteActionType.class),
|
DELETE(ConsoleBulkDomainDeleteActionType.class),
|
||||||
SUSPEND(ConsoleBulkDomainSuspendActionType.class);
|
SUSPEND(ConsoleBulkDomainSuspendActionType.class),
|
||||||
|
UNSUSPEND(ConsoleBulkDomainUnsuspendActionType.class);
|
||||||
|
|
||||||
private final Class<? extends ConsoleDomainActionType> actionClass;
|
private final Class<? extends ConsoleDomainActionType> actionClass;
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
|
|||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.ImmutableSortedMap;
|
import com.google.common.collect.ImmutableSortedMap;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
@@ -61,6 +62,14 @@ public class ConsoleBulkDomainActionTest {
|
|||||||
|
|
||||||
private static final Gson GSON = GsonUtils.provideGson();
|
private static final Gson GSON = GsonUtils.provideGson();
|
||||||
|
|
||||||
|
private static ImmutableSet<StatusValue> serverSuspensionStatuses =
|
||||||
|
ImmutableSet.of(
|
||||||
|
StatusValue.SERVER_RENEW_PROHIBITED,
|
||||||
|
StatusValue.SERVER_TRANSFER_PROHIBITED,
|
||||||
|
StatusValue.SERVER_UPDATE_PROHIBITED,
|
||||||
|
StatusValue.SERVER_DELETE_PROHIBITED,
|
||||||
|
StatusValue.SERVER_HOLD);
|
||||||
|
|
||||||
private final FakeClock clock = new FakeClock(DateTime.parse("2024-05-13T00:00:00.000Z"));
|
private final FakeClock clock = new FakeClock(DateTime.parse("2024-05-13T00:00:00.000Z"));
|
||||||
|
|
||||||
@RegisterExtension
|
@RegisterExtension
|
||||||
@@ -135,12 +144,34 @@ public class ConsoleBulkDomainActionTest {
|
|||||||
"""
|
"""
|
||||||
{"example.tld":{"message":"Command completed successfully","responseCode":1000}}""");
|
{"example.tld":{"message":"Command completed successfully","responseCode":1000}}""");
|
||||||
assertThat(loadByEntity(domain).getStatusValues())
|
assertThat(loadByEntity(domain).getStatusValues())
|
||||||
.containsAtLeast(
|
.containsAtLeastElementsIn(serverSuspensionStatuses);
|
||||||
StatusValue.SERVER_RENEW_PROHIBITED,
|
}
|
||||||
StatusValue.SERVER_TRANSFER_PROHIBITED,
|
|
||||||
StatusValue.SERVER_UPDATE_PROHIBITED,
|
@Test
|
||||||
StatusValue.SERVER_DELETE_PROHIBITED,
|
void testSuccess_unsuspend() throws Exception {
|
||||||
StatusValue.SERVER_HOLD);
|
User adminUser =
|
||||||
|
persistResource(
|
||||||
|
new User.Builder()
|
||||||
|
.setEmailAddress("email@email.com")
|
||||||
|
.setUserRoles(
|
||||||
|
new UserRoles.Builder().setGlobalRole(GlobalRole.FTE).setIsAdmin(true).build())
|
||||||
|
.build());
|
||||||
|
persistResource(domain.asBuilder().addStatusValues(serverSuspensionStatuses).build());
|
||||||
|
ConsoleBulkDomainAction action =
|
||||||
|
createAction(
|
||||||
|
"UNSUSPEND",
|
||||||
|
GSON.toJsonTree(
|
||||||
|
ImmutableMap.of("domainList", ImmutableList.of("example.tld"), "reason", "test")),
|
||||||
|
adminUser);
|
||||||
|
assertThat(loadByEntity(domain).getStatusValues())
|
||||||
|
.containsAtLeastElementsIn(serverSuspensionStatuses);
|
||||||
|
action.run();
|
||||||
|
assertThat(fakeResponse.getStatus()).isEqualTo(SC_OK);
|
||||||
|
assertThat(fakeResponse.getPayload())
|
||||||
|
.isEqualTo(
|
||||||
|
"""
|
||||||
|
{"example.tld":{"message":"Command completed successfully","responseCode":1000}}""");
|
||||||
|
assertThat(loadByEntity(domain).getStatusValues()).containsNoneIn(serverSuspensionStatuses);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
Reference in New Issue
Block a user