|
|
|
@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.TenantProfile; |
|
|
|
import org.thingsboard.server.common.data.id.ApiUsageStateId; |
|
|
|
import org.thingsboard.server.common.data.id.EntityId; |
|
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
|
import org.thingsboard.server.common.data.kv.TsKvEntry; |
|
|
|
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; |
|
|
|
import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; |
|
|
|
import org.thingsboard.server.common.msg.queue.TbCallback; |
|
|
|
@ -40,6 +41,7 @@ import java.lang.reflect.Field; |
|
|
|
import java.time.LocalDate; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Optional; |
|
|
|
import java.util.UUID; |
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
|
|
|
|
@ -47,7 +49,10 @@ import static java.time.ZoneOffset.UTC; |
|
|
|
import static java.time.temporal.ChronoField.DAY_OF_MONTH; |
|
|
|
import static java.time.temporal.ChronoUnit.MONTHS; |
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
import static org.awaitility.Awaitility.await; |
|
|
|
import static org.junit.Assert.assertEquals; |
|
|
|
import static org.thingsboard.server.common.data.ApiFeature.SMS; |
|
|
|
import static org.thingsboard.server.common.data.ApiUsageRecordKey.SMS_EXEC_COUNT; |
|
|
|
|
|
|
|
@DaoSqlTest |
|
|
|
public class DefaultTbApiUsageStateServiceTest extends AbstractControllerTest { |
|
|
|
@ -157,6 +162,85 @@ public class DefaultTbApiUsageStateServiceTest extends AbstractControllerTest { |
|
|
|
assertThat(tenantApiUsageState.getNextCycleTs()).isEqualTo(firstOfNextMonth); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void checkTenantCreatedWithSmsDisabledApiUsage() throws Exception { |
|
|
|
TenantProfile tenantProfile = new TenantProfile(); |
|
|
|
tenantProfile.setName("Test profile"); |
|
|
|
TenantProfileData tenantProfileData = new TenantProfileData(); |
|
|
|
DefaultTenantProfileConfiguration config = DefaultTenantProfileConfiguration.builder() |
|
|
|
.smsEnabled(false) |
|
|
|
.build(); |
|
|
|
|
|
|
|
tenantProfileData.setConfiguration(config); |
|
|
|
tenantProfile.setProfileData(tenantProfileData); |
|
|
|
tenantProfile = doPost("/api/tenantProfile", tenantProfile, TenantProfile.class); |
|
|
|
|
|
|
|
Tenant tenant = new Tenant(); |
|
|
|
tenant.setTitle("My test tenant"); |
|
|
|
tenant.setTenantProfileId(tenantProfile.getId()); |
|
|
|
tenant = saveTenant(tenant); |
|
|
|
|
|
|
|
ApiUsageState apiUsageState = apiUsageStateService.findApiUsageStateByEntityId(tenant.getId()); |
|
|
|
assertThat(apiUsageState.getSmsExecState()).isEqualTo(ApiUsageStateValue.DISABLED); |
|
|
|
|
|
|
|
TenantId finalTenantId = tenant.getId(); |
|
|
|
ApiUsageStateId finalApiUsageStateId = apiUsageState.getId(); |
|
|
|
|
|
|
|
|
|
|
|
await().atMost(5, TimeUnit.SECONDS).until(() -> { |
|
|
|
Optional<TsKvEntry> smsApiState = tsService.findLatest(finalTenantId, finalApiUsageStateId, SMS.getApiStateKey()).get(); |
|
|
|
return smsApiState.isPresent() && smsApiState.get().getValueAsString().equals(ApiUsageStateValue.DISABLED.name()); |
|
|
|
}); |
|
|
|
|
|
|
|
await().atMost(5, TimeUnit.SECONDS).until(() -> { |
|
|
|
Optional<TsKvEntry> smsApiState = tsService.findLatest(finalTenantId, finalApiUsageStateId, SMS_EXEC_COUNT.getApiLimitKey()).get(); |
|
|
|
return smsApiState.isPresent() && smsApiState.get().getLongValue().get().equals(0L); |
|
|
|
}); |
|
|
|
|
|
|
|
// enable SMS and check that the ApiUsageState is updated accordingly
|
|
|
|
config = DefaultTenantProfileConfiguration.builder() |
|
|
|
.smsEnabled(true) |
|
|
|
.maxSms(10) |
|
|
|
.build(); |
|
|
|
tenantProfileData.setConfiguration(config); |
|
|
|
tenantProfile.setProfileData(tenantProfileData); |
|
|
|
doPost("/api/tenantProfile", tenantProfile, TenantProfile.class); |
|
|
|
|
|
|
|
await().atMost(5, TimeUnit.SECONDS).until(() -> |
|
|
|
apiUsageStateService.findApiUsageStateByEntityId(finalTenantId).getSmsExecState() == ApiUsageStateValue.ENABLED); |
|
|
|
|
|
|
|
await().atMost(5, TimeUnit.SECONDS).until(() -> { |
|
|
|
Optional<TsKvEntry> smsApiState = tsService.findLatest(finalTenantId, finalApiUsageStateId, SMS.getApiStateKey()).get(); |
|
|
|
return smsApiState.isPresent() && smsApiState.get().getValueAsString().equals(ApiUsageStateValue.ENABLED.name()); |
|
|
|
}); |
|
|
|
|
|
|
|
await().atMost(5, TimeUnit.SECONDS).until(() -> { |
|
|
|
Optional<TsKvEntry> smsApiState = tsService.findLatest(finalTenantId, finalApiUsageStateId, SMS_EXEC_COUNT.getApiLimitKey()).get(); |
|
|
|
return smsApiState.isPresent() && smsApiState.get().getLongValue().get().equals(10L); |
|
|
|
}); |
|
|
|
|
|
|
|
//disable SMS and check that the ApiUsageState is updated accordingly
|
|
|
|
config = DefaultTenantProfileConfiguration.builder() |
|
|
|
.smsEnabled(false) |
|
|
|
.build(); |
|
|
|
tenantProfileData.setConfiguration(config); |
|
|
|
tenantProfile.setProfileData(tenantProfileData); |
|
|
|
doPost("/api/tenantProfile", tenantProfile, TenantProfile.class); |
|
|
|
|
|
|
|
await().atMost(5, TimeUnit.SECONDS).until(() -> |
|
|
|
apiUsageStateService.findApiUsageStateByEntityId(finalTenantId).getSmsExecState() == ApiUsageStateValue.DISABLED); |
|
|
|
|
|
|
|
await().atMost(5, TimeUnit.SECONDS).until(() -> { |
|
|
|
Optional<TsKvEntry> smsApiState = tsService.findLatest(finalTenantId, finalApiUsageStateId, SMS.getApiStateKey()).get(); |
|
|
|
return smsApiState.isPresent() && smsApiState.get().getValueAsString().equals(ApiUsageStateValue.DISABLED.name()); |
|
|
|
}); |
|
|
|
|
|
|
|
await().atMost(5, TimeUnit.SECONDS).until(() -> { |
|
|
|
Optional<TsKvEntry> smsApiState = tsService.findLatest(finalTenantId, finalApiUsageStateId, SMS_EXEC_COUNT.getApiLimitKey()).get(); |
|
|
|
return smsApiState.isPresent() && smsApiState.get().getLongValue().get().equals(0L); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private TenantProfile createTenantProfile() { |
|
|
|
TenantProfile tenantProfile = new TenantProfile(); |
|
|
|
tenantProfile.setName("Tenant Profile"); |
|
|
|
|