Skip to content

Commit 27c9634

Browse files
author
Pedro González Marcos
committed
feat: change usage limit consumption to one service
1 parent 48a7ea7 commit 27c9634

File tree

7 files changed

+171
-111
lines changed

7 files changed

+171
-111
lines changed

space-client/src/main/java/io/github/pgmarc/space/FeaturesEndpoint.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import io.github.pgmarc.space.deserializers.ErrorDeserializer;
44
import io.github.pgmarc.space.deserializers.FeatureEvaluationDeserializer;
55
import io.github.pgmarc.space.exceptions.SpaceApiException;
6-
import io.github.pgmarc.space.features.Consumption;
6+
import io.github.pgmarc.space.features.UsageLimitConsumption;
77
import io.github.pgmarc.space.features.FeatureEvaluationResult;
88
import io.github.pgmarc.space.serializers.ConsumptionSerializer;
99
import okhttp3.*;
@@ -56,11 +56,11 @@ public FeatureEvaluationResult evaluate(String userId, String service, String fe
5656
return res;
5757
}
5858

59-
public FeatureEvaluationResult evaluateOptimistically(String userId, String service, String featureId, Consumption consumption)
59+
public FeatureEvaluationResult evaluateOptimistically(String userId, String service, String featureId, UsageLimitConsumption usageLimitConsumption)
6060
throws IOException {
6161
HttpUrl url = this.baseUrl.newBuilder().addEncodedPathSegment(userId)
6262
.addEncodedPathSegment(formatFeatureId(service, featureId)).build();
63-
RequestBody body = RequestBody.create(consumptionSerializer.toJson(consumption).toString(), JSON);
63+
RequestBody body = RequestBody.create(consumptionSerializer.toJson(usageLimitConsumption).toString(), JSON);
6464
Request request = new Request(url, requiredHeaders ,"POST" , body);
6565

6666
FeatureEvaluationResult res = null;

space-client/src/main/java/io/github/pgmarc/space/features/Consumption.java

Lines changed: 0 additions & 89 deletions
This file was deleted.
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package io.github.pgmarc.space.features;
2+
3+
import java.util.Collections;
4+
import java.util.HashSet;
5+
import java.util.Objects;
6+
import java.util.Set;
7+
8+
public final class UsageLimitConsumption {
9+
10+
private final Set<Item<? extends Number>> items;
11+
12+
private UsageLimitConsumption(Builder builder) {
13+
this.items = Collections.unmodifiableSet(builder.items);
14+
}
15+
16+
public Set<Item<? extends Number>> getConsumption() {
17+
return items;
18+
}
19+
20+
public static Builder builder(String service) {
21+
Objects.requireNonNull(service, "service name must not be null");
22+
return new Builder(service);
23+
}
24+
25+
public static final class Builder {
26+
27+
private final String service;
28+
private final Set<Item<? extends Number>> items = new HashSet<>();
29+
30+
private Builder(String service) {
31+
this.service = service.toLowerCase();
32+
}
33+
34+
private void validateFeatureId(String usageLimit) {
35+
Objects.requireNonNull(usageLimit, "usage limit name must not be null");
36+
}
37+
38+
public Builder addInt(String usageLimit, int quantity) {
39+
validateFeatureId(usageLimit);
40+
this.items.add(new Item<>(service, usageLimit, quantity));
41+
return this;
42+
}
43+
44+
public Builder addLong(String usageLimit, long quantity) {
45+
validateFeatureId(usageLimit);
46+
this.items.add(new Item<>(service, usageLimit, quantity));
47+
return this;
48+
}
49+
50+
public Builder addFloat(String usageLimit, float quantity) {
51+
validateFeatureId(usageLimit);
52+
this.items.add(new Item<>(service, usageLimit, quantity));
53+
return this;
54+
}
55+
56+
public Builder addDouble(String usageLimit, double quantity) {
57+
validateFeatureId(usageLimit);
58+
this.items.add(new Item<>(service, usageLimit, quantity));
59+
return this;
60+
}
61+
62+
public UsageLimitConsumption build() {
63+
if (service.isBlank()) {
64+
throw new IllegalStateException("service name must not be blank");
65+
}
66+
if (items.isEmpty()) {
67+
throw new IllegalStateException("usage limits consumption must not be empty");
68+
}
69+
return new UsageLimitConsumption(this);
70+
}
71+
}
72+
73+
public static final class Item<T> {
74+
private final String serviceName;
75+
private final String usageLimit;
76+
private final T quantity;
77+
78+
private Item(String serviceName, String usageLimit, T quantity) {
79+
this.serviceName = serviceName;
80+
this.usageLimit = usageLimit;
81+
this.quantity = quantity;
82+
}
83+
84+
public String getServiceName() {
85+
return serviceName;
86+
}
87+
88+
public String getUsageLimit() {
89+
return usageLimit;
90+
}
91+
92+
public T getQuantity() {
93+
return quantity;
94+
}
95+
}
96+
}

space-client/src/main/java/io/github/pgmarc/space/serializers/ConsumptionSerializer.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package io.github.pgmarc.space.serializers;
22

3-
import io.github.pgmarc.space.features.Consumption;
3+
import io.github.pgmarc.space.features.UsageLimitConsumption;
44
import org.json.JSONObject;
55

6-
public final class ConsumptionSerializer implements JsonSerializable<Consumption> {
6+
public final class ConsumptionSerializer implements JsonSerializable<UsageLimitConsumption> {
77

8-
private static String formatConsumptionKey(String serviceName, String usageLimitName) {
9-
return serviceName.toLowerCase() + "-" + usageLimitName;
8+
private static String formatUsageLimitConsumptionKey(String serviceName, String usageLimitName) {
9+
return serviceName + "-" + usageLimitName;
1010
}
1111

1212
@Override
13-
public JSONObject toJson(Consumption consumption) {
13+
public JSONObject toJson(UsageLimitConsumption usageLimitConsumption) {
1414

1515
JSONObject jsonObject = new JSONObject();
16-
for (Consumption.Item<?> item: consumption.getConsumption()) {
17-
jsonObject.put(formatConsumptionKey(item.getServiceName(), item.getUsageLimit()), item.getQuantity());
16+
for (UsageLimitConsumption.Item<? extends Number> item: usageLimitConsumption.getConsumption()) {
17+
jsonObject.put(formatUsageLimitConsumptionKey(item.getServiceName(), item.getUsageLimit()), item.getQuantity());
1818
}
1919

2020
return jsonObject;

space-client/src/test/java/io/github/pgmarc/space/FeaturesEndpointTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
44
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
5-
import io.github.pgmarc.space.features.Consumption;
5+
import io.github.pgmarc.space.features.UsageLimitConsumption;
66
import io.github.pgmarc.space.features.FeatureEvaluationResult;
77
import okhttp3.HttpUrl;
88
import okhttp3.OkHttpClient;
@@ -73,8 +73,8 @@ void givenConsumptionShouldEvaluateOptimistically() {
7373
String usageLimit = "featureALimit";
7474

7575
try {
76-
Consumption consumption = Consumption.builder().addInt(service, usageLimit, 100).build();
77-
FeatureEvaluationResult res = endpoint.evaluateOptimistically(userId, service, feature, consumption);
76+
UsageLimitConsumption usageLimitConsumption = UsageLimitConsumption.builder(service).addInt(usageLimit, 100).build();
77+
FeatureEvaluationResult res = endpoint.evaluateOptimistically(userId, service, feature, usageLimitConsumption);
7878
assertThat(res.isAvailable()).isTrue();
7979
assertThat(res.getConsumed(usageLimit)).hasValue(100);
8080
assertThat(res.getLimit(usageLimit)).hasValue(500);
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.github.pgmarc.space.features;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.assertj.core.api.Assertions.*;
6+
7+
class UsageLimitConsumptionTest {
8+
9+
@Test
10+
void givenConsumptionServiceNameMustBeLowerCase() {
11+
12+
String service = "Petclinic";
13+
UsageLimitConsumption usageLimitConsumption = UsageLimitConsumption.builder(service)
14+
.addInt("intLimit", Integer.MAX_VALUE)
15+
.addLong("longLimit", Long.MAX_VALUE)
16+
.addFloat("floatLimit", Float.MAX_VALUE)
17+
.addDouble("doubleLimit", Double.MAX_VALUE)
18+
.build();
19+
assertThat(usageLimitConsumption.getConsumption())
20+
.allMatch( item -> item.getServiceName().equals(service.toLowerCase()));
21+
}
22+
23+
@Test
24+
void givenNullServiceNameShouldThrow() {
25+
26+
assertThatExceptionOfType(NullPointerException.class)
27+
.isThrownBy(() -> UsageLimitConsumption.builder(null))
28+
.withMessage("service name must not be null");
29+
}
30+
31+
@Test
32+
void givenEmptyServiceNameShouldThrow() {
33+
34+
UsageLimitConsumption.Builder builder = UsageLimitConsumption.builder("");
35+
36+
assertThatExceptionOfType(IllegalStateException.class)
37+
.isThrownBy(builder::build)
38+
.withMessage("service name must not be blank");
39+
}
40+
41+
@Test
42+
void givenEmptyUsageLimitConsumptionShouldThrow() {
43+
44+
UsageLimitConsumption.Builder builder = UsageLimitConsumption.builder("Petclinic");
45+
46+
assertThatExceptionOfType(IllegalStateException.class)
47+
.isThrownBy(builder::build)
48+
.withMessage("usage limits consumption must not be empty");
49+
}
50+
51+
52+
53+
}

space-client/src/test/java/io/github/pgmarc/space/serializers/ConsumptionSerializerTest.java renamed to space-client/src/test/java/io/github/pgmarc/space/serializers/UsageLimitConsumptionSerializerTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package io.github.pgmarc.space.serializers;
22

3-
import io.github.pgmarc.space.features.Consumption;
3+
import io.github.pgmarc.space.features.UsageLimitConsumption;
44
import org.json.JSONObject;
55
import org.junit.jupiter.api.Test;
66

77
import static org.assertj.core.api.Assertions.*;
88

9-
class ConsumptionSerializerTest {
9+
class UsageLimitConsumptionSerializerTest {
1010

1111
private final ConsumptionSerializer serializer = new ConsumptionSerializer();
1212

@@ -19,20 +19,20 @@ void givenConsumptionShouldSerialize() {
1919
float barConsumption = 0.1f;
2020
double consumedSeconds = (double) Float.MAX_VALUE + 1;
2121

22-
Consumption consumption = Consumption.builder()
23-
.addInt(service, "maxPets", petsRegistered)
24-
.addLong(service, "fooLimit", fooConsumption)
25-
.addDouble(service, "maxSeconds", consumedSeconds)
26-
.addFloat(service, "barLimit", barConsumption)
22+
UsageLimitConsumption usageLimitConsumption = UsageLimitConsumption.builder(service)
23+
.addInt( "maxPets", petsRegistered)
24+
.addLong( "fooLimit", fooConsumption)
25+
.addDouble("maxSeconds", consumedSeconds)
26+
.addFloat("barLimit", barConsumption)
2727
.build();
2828

29-
assertThatNoException().isThrownBy(() -> serializer.toJson(consumption));
29+
assertThatNoException().isThrownBy(() -> serializer.toJson(usageLimitConsumption));
3030

3131
String intUsageLimit = "petclinic-maxPets";
3232
String longUsageLimit = "petclinic-fooLimit";
3333
String floatUsageLimit = "petclinic-barLimit";
3434
String doubleUsageLimit = "petclinic-maxSeconds";
35-
JSONObject consumptionPayload = serializer.toJson(consumption);
35+
JSONObject consumptionPayload = serializer.toJson(usageLimitConsumption);
3636

3737
assertThat(consumptionPayload.keySet()).contains(intUsageLimit, longUsageLimit, floatUsageLimit, doubleUsageLimit);
3838
assertThat(consumptionPayload.getInt(intUsageLimit)).isEqualTo(petsRegistered);

0 commit comments

Comments
 (0)