Skip to content

Commit a1a82ad

Browse files
authored
fix: added unit tests for async (#18)
1 parent 2169b2f commit a1a82ad

File tree

3 files changed

+109
-45
lines changed

3 files changed

+109
-45
lines changed
Lines changed: 7 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,39 @@
11
package io.javaoperatorsdk.admissioncontroller;
22

3-
import java.io.IOException;
4-
import java.io.InputStream;
5-
import java.util.Base64;
6-
import java.util.UUID;
7-
83
import org.junit.jupiter.api.Test;
94

105
import io.fabric8.kubernetes.api.model.HasMetadata;
11-
import io.fabric8.kubernetes.api.model.admission.v1.AdmissionRequest;
12-
import io.fabric8.kubernetes.api.model.admission.v1.AdmissionReview;
13-
import io.fabric8.kubernetes.api.model.apps.Deployment;
14-
import io.fabric8.kubernetes.client.utils.Serialization;
156

16-
import static org.assertj.core.api.Assertions.assertThat;
7+
import static io.javaoperatorsdk.admissioncontroller.Commons.*;
178

189
class AdmissionControllerTest {
1910

20-
public static final String MISSING_REQUIRED_LABEL = "Missing required label.";
21-
public static final String LABEL_KEY = "app.kubernetes.io/name";
22-
public static final String LABEL_TEST_VALUE = "mutation-test";
23-
2411
@Test
25-
public void validatesResource() {
12+
void validatesResource() {
2613
AdmissionController<HasMetadata> admissionController =
2714
new AdmissionController<>((resource, operation) -> {
28-
if (resource.getMetadata().getLabels().get(LABEL_KEY) == null) {
15+
if (resource.getMetadata().getLabels().get(Commons.LABEL_KEY) == null) {
2916
throw new NotAllowedException(MISSING_REQUIRED_LABEL);
3017
}
3118
});
3219
var inputAdmissionReview = createTestAdmissionReview();
3320

3421
var response = admissionController.handle(inputAdmissionReview);
3522

36-
assertThat(response.getResponse().getUid())
37-
.isEqualTo(inputAdmissionReview.getRequest().getUid());
38-
assertThat(response.getResponse().getStatus().getCode()).isEqualTo(403);
39-
assertThat(response.getResponse().getStatus().getMessage()).isEqualTo(MISSING_REQUIRED_LABEL);
40-
assertThat(response.getResponse().getAllowed()).isFalse();
23+
assertValidation(response, inputAdmissionReview.getRequest().getUid());
4124
}
4225

4326
@Test
44-
public void mutatesResource() {
27+
void mutatesResource() {
4528
AdmissionController<HasMetadata> admissionController =
4629
new AdmissionController<>((resource, operation) -> {
47-
resource.getMetadata().getLabels().putIfAbsent(LABEL_KEY, LABEL_TEST_VALUE);
30+
resource.getMetadata().getLabels().putIfAbsent(Commons.LABEL_KEY, LABEL_TEST_VALUE);
4831
return resource;
4932
});
5033
var inputAdmissionReview = createTestAdmissionReview();
5134

5235
var response = admissionController.handle(inputAdmissionReview);
5336

54-
assertThat(response.getResponse().getAllowed()).isTrue();
55-
String patch = new String(Base64.getDecoder().decode(response.getResponse().getPatch()));
56-
assertThat(patch)
57-
.isEqualTo(
58-
"[{\"op\":\"add\",\"path\":\"/metadata/labels/app.kubernetes.io~1name\",\"value\":\"mutation-test\"}]");
37+
assertMutation(response);
5938
}
60-
61-
private AdmissionReview createTestAdmissionReview() {
62-
AdmissionReview admissionReview = new AdmissionReview();
63-
AdmissionRequest request = new AdmissionRequest();
64-
admissionReview.setRequest(request);
65-
request.setOperation(Operation.CREATE.name());
66-
request.setUid(UUID.randomUUID().toString());
67-
Deployment deployment = null;
68-
try (InputStream is = getClass().getResourceAsStream("deployment.yaml")) {
69-
deployment = Serialization.unmarshal(is, Deployment.class);
70-
request.setObject(deployment);
71-
} catch (IOException e) {
72-
throw new IllegalStateException(e);
73-
}
74-
return admissionReview;
75-
}
76-
7739
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.javaoperatorsdk.admissioncontroller;
2+
3+
import java.util.concurrent.CompletableFuture;
4+
import java.util.concurrent.ExecutionException;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
import io.fabric8.kubernetes.api.model.HasMetadata;
9+
import io.fabric8.kubernetes.api.model.admission.v1.AdmissionReview;
10+
import io.javaoperatorsdk.admissioncontroller.mutation.AsyncMutator;
11+
12+
import static io.javaoperatorsdk.admissioncontroller.Commons.*;
13+
14+
class AsyncAdmissionControllerTest {
15+
16+
@Test
17+
void validatesResource() throws ExecutionException, InterruptedException {
18+
AsyncAdmissionController<HasMetadata> admissionController =
19+
new AsyncAdmissionController<>((resource, operation) -> {
20+
if (resource.getMetadata().getLabels().get(LABEL_KEY) == null) {
21+
throw new NotAllowedException(MISSING_REQUIRED_LABEL);
22+
}
23+
});
24+
var inputAdmissionReview = createTestAdmissionReview();
25+
26+
CompletableFuture<AdmissionReview> response =
27+
(CompletableFuture<AdmissionReview>) admissionController.handle(inputAdmissionReview);
28+
29+
assertValidation(response.get(), inputAdmissionReview.getRequest().getUid());
30+
}
31+
32+
@Test
33+
void mutatesResource() throws ExecutionException, InterruptedException {
34+
AsyncAdmissionController<HasMetadata> admissionController =
35+
new AsyncAdmissionController<>((AsyncMutator<HasMetadata>) (resource,
36+
operation) -> CompletableFuture.supplyAsync(() -> {
37+
resource.getMetadata().getLabels().putIfAbsent(LABEL_KEY, LABEL_TEST_VALUE);
38+
return resource;
39+
}));
40+
var inputAdmissionReview = createTestAdmissionReview();
41+
42+
CompletableFuture<AdmissionReview> response =
43+
(CompletableFuture<AdmissionReview>) admissionController.handle(inputAdmissionReview);
44+
45+
assertMutation(response.get());
46+
}
47+
48+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package io.javaoperatorsdk.admissioncontroller;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.util.Base64;
6+
import java.util.UUID;
7+
8+
import io.fabric8.kubernetes.api.model.admission.v1.AdmissionRequest;
9+
import io.fabric8.kubernetes.api.model.admission.v1.AdmissionReview;
10+
import io.fabric8.kubernetes.api.model.apps.Deployment;
11+
import io.fabric8.kubernetes.client.utils.Serialization;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
15+
public class Commons {
16+
17+
public static final String LABEL_KEY = "app.kubernetes.io/name";
18+
public static final String MISSING_REQUIRED_LABEL = "Missing required label.";
19+
public static final String LABEL_TEST_VALUE = "mutation-test";
20+
21+
public static AdmissionReview createTestAdmissionReview() {
22+
AdmissionReview admissionReview = new AdmissionReview();
23+
AdmissionRequest request = new AdmissionRequest();
24+
admissionReview.setRequest(request);
25+
request.setOperation(Operation.CREATE.name());
26+
request.setUid(UUID.randomUUID().toString());
27+
Deployment deployment = null;
28+
try (InputStream is = Commons.class.getResourceAsStream("deployment.yaml")) {
29+
deployment = Serialization.unmarshal(is, Deployment.class);
30+
request.setObject(deployment);
31+
} catch (IOException e) {
32+
throw new IllegalStateException(e);
33+
}
34+
return admissionReview;
35+
}
36+
37+
public static void assertMutation(AdmissionReview admissionReview) {
38+
assertThat(admissionReview.getResponse().getAllowed()).isTrue();
39+
String patch = new String(Base64.getDecoder().decode(admissionReview.getResponse().getPatch()));
40+
assertThat(patch)
41+
.isEqualTo(
42+
"[{\"op\":\"add\",\"path\":\"/metadata/labels/app.kubernetes.io~1name\",\"value\":\"mutation-test\"}]");
43+
}
44+
45+
public static void assertValidation(AdmissionReview admissionReview, String requestUid) {
46+
assertThat(admissionReview.getResponse().getUid())
47+
.isEqualTo(requestUid);
48+
assertThat(admissionReview.getResponse().getStatus().getCode()).isEqualTo(403);
49+
assertThat(admissionReview.getResponse().getStatus().getMessage())
50+
.isEqualTo(MISSING_REQUIRED_LABEL);
51+
assertThat(admissionReview.getResponse().getAllowed()).isFalse();
52+
}
53+
54+
}

0 commit comments

Comments
 (0)