From 349762355b0d98931ef123d6939ec66344af5be6 Mon Sep 17 00:00:00 2001 From: Enrico Vianello Date: Fri, 9 Aug 2024 10:59:55 +0200 Subject: [PATCH 1/5] Bump version to 1.10.1 --- iam-common/pom.xml | 2 +- iam-login-service/pom.xml | 2 +- iam-persistence/pom.xml | 2 +- iam-test-client/pom.xml | 2 +- iam-voms-aa/pom.xml | 2 +- pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iam-common/pom.xml b/iam-common/pom.xml index 0e8aeafdc..cff779667 100644 --- a/iam-common/pom.xml +++ b/iam-common/pom.xml @@ -5,7 +5,7 @@ it.infn.mw.iam-parent iam-parent - 1.10.0 + 1.10.1 it.infn.mw.iam-common diff --git a/iam-login-service/pom.xml b/iam-login-service/pom.xml index 4e45ea08c..50380d9c8 100644 --- a/iam-login-service/pom.xml +++ b/iam-login-service/pom.xml @@ -22,7 +22,7 @@ it.infn.mw.iam-parent iam-parent - 1.10.0 + 1.10.1 it.infn.mw.iam-login-service diff --git a/iam-persistence/pom.xml b/iam-persistence/pom.xml index ae547b3de..c0532b02f 100644 --- a/iam-persistence/pom.xml +++ b/iam-persistence/pom.xml @@ -22,7 +22,7 @@ it.infn.mw.iam-parent iam-parent - 1.10.0 + 1.10.1 it.infn.mw.iam-persistence diff --git a/iam-test-client/pom.xml b/iam-test-client/pom.xml index aa2493565..a727bb31d 100644 --- a/iam-test-client/pom.xml +++ b/iam-test-client/pom.xml @@ -5,7 +5,7 @@ it.infn.mw.iam-parent iam-parent - 1.10.0 + 1.10.1 it.infn.mw.iam-test-client diff --git a/iam-voms-aa/pom.xml b/iam-voms-aa/pom.xml index f68a4d4b5..611802c26 100644 --- a/iam-voms-aa/pom.xml +++ b/iam-voms-aa/pom.xml @@ -22,7 +22,7 @@ it.infn.mw.iam-parent iam-parent - 1.10.0 + 1.10.1 it.infn.mw.iam-voms-aa diff --git a/pom.xml b/pom.xml index 755656453..57f3726c2 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ it.infn.mw.iam-parent iam-parent - 1.10.0 + 1.10.1 pom INDIGO Identity and Access Manager (IAM) - Parent POM From 55c6e731e831f525050fc3026717ea9a4aed220d Mon Sep 17 00:00:00 2001 From: Enrico Vianello Date: Fri, 9 Aug 2024 11:03:22 +0200 Subject: [PATCH 2/5] Check if user is active before suspending it --- .../infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java b/iam-login-service/src/main/java/it/infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java index bb1ab3698..38f66ed1f 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java @@ -25,7 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -67,7 +66,6 @@ public enum AccountLifecycleStatus { private Set accountsScheduledForRemoval = newHashSet(); - @Autowired public ExpiredAccountsHandler(Clock clock, LifecycleProperties properties, IamAccountRepository repo, IamAccountService service) { this.clock = clock; @@ -150,7 +148,9 @@ private void handleExpiredAccount(IamAccount expiredAccount) { && properties.getAccount().getExpiredAccountPolicy().isRemoveExpiredAccounts()) { scheduleAccountRemoval(expiredAccount); } else if (pastSuspensionGracePeriod(expiredAccount)) { - suspendAccount(expiredAccount); + if (expiredAccount.isActive()) { + suspendAccount(expiredAccount); + } } else { markAsPendingSuspension(expiredAccount); } From 9f6a0a1326cc0c4b2aef6ce1adf402bbc5c950f0 Mon Sep 17 00:00:00 2001 From: Enrico Vianello Date: Fri, 9 Aug 2024 16:32:46 +0200 Subject: [PATCH 3/5] Add test there's no update every time a suspended user is handled --- .../mw/iam/test/lifecycle/AccountLifecycleTests.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java index 08a927016..21e3c4b4b 100644 --- a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java +++ b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java @@ -110,6 +110,7 @@ public void testRemovalGracePeriodWorks() { assertThat(testAccount.isActive(), is(true)); testAccount.setEndTime(Date.from(EIGHT_DAYS_AGO)); repo.save(testAccount); + Date lastUpdateTime = testAccount.getLastUpdateTime(); handler.handleExpiredAccounts(); @@ -117,6 +118,16 @@ public void testRemovalGracePeriodWorks() { repo.findByUuid(TEST_USER_UUID).orElseThrow(assertionError(EXPECTED_ACCOUNT_NOT_FOUND)); assertThat(testAccount.isActive(), is(false)); + assertThat(testAccount.getLastUpdateTime().compareTo(lastUpdateTime) > 0, is(true)); + lastUpdateTime = testAccount.getLastUpdateTime(); + + handler.handleExpiredAccounts(); + + testAccount = + repo.findByUuid(TEST_USER_UUID).orElseThrow(assertionError(EXPECTED_ACCOUNT_NOT_FOUND)); + + assertThat(testAccount.isActive(), is(false)); + assertThat(testAccount.getLastUpdateTime().compareTo(lastUpdateTime) == 0, is(true)); Optional timestampLabel = testAccount.getLabelByName(LIFECYCLE_TIMESTAMP_LABEL); From 310118d8deb54a44740bd494acdfcddb2f45d5ff Mon Sep 17 00:00:00 2001 From: Enrico Vianello Date: Fri, 9 Aug 2024 17:45:08 +0200 Subject: [PATCH 4/5] Avoid useless multiple AccountLabelSetEvent Removed usage of label lifeycle.timestamp --- .../lifecycle/ExpiredAccountsHandler.java | 79 +++++++++++++------ ...LifecycleNoRemovalExpiredAccountTests.java | 12 --- ...LifecycleNoSuspensionGracePeriodTests.java | 7 -- .../test/lifecycle/AccountLifecycleTests.java | 12 --- 4 files changed, 54 insertions(+), 56 deletions(-) diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java b/iam-login-service/src/main/java/it/infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java index 38f66ed1f..5d059fd94 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/core/lifecycle/ExpiredAccountsHandler.java @@ -16,11 +16,15 @@ package it.infn.mw.iam.core.lifecycle; import static com.google.common.collect.Sets.newHashSet; +import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.AccountLifecycleStatus.PENDING_REMOVAL; +import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.AccountLifecycleStatus.PENDING_SUSPENSION; +import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.AccountLifecycleStatus.SUSPENDED; import java.time.Clock; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Date; +import java.util.Optional; import java.util.Set; import org.slf4j.Logger; @@ -42,10 +46,7 @@ public class ExpiredAccountsHandler implements Runnable { public enum AccountLifecycleStatus { - OK, - PENDING_SUSPENSION, - PENDING_REMOVAL, - SUSPENDED + OK, PENDING_SUSPENSION, PENDING_REMOVAL, SUSPENDED } public static final String LIFECYCLE_TIMESTAMP_LABEL = "lifecycle.timestamp"; @@ -94,40 +95,71 @@ private boolean pastRemovalGracePeriod(IamAccount expiredAccount) { properties.getAccount().getExpiredAccountPolicy().getRemovalGracePeriodDays()); } - private void addLastCheckedLabel(IamAccount expiredAccount) { - accountService.setLabel(expiredAccount, - IamLabel.builder() - .name(LIFECYCLE_TIMESTAMP_LABEL) - .value(String.valueOf(checkTime.toEpochMilli())) - .build()); - } - private void addStatusLabel(IamAccount expiredAccount, AccountLifecycleStatus status) { accountService.setLabel(expiredAccount, IamLabel.builder().name(LIFECYCLE_STATUS_LABEL).value(status.name()).build()); } + private boolean checkAccountStatusIs(IamAccount a, AccountLifecycleStatus status) { + Optional lifecycleStatus = a.getLabelByName(LIFECYCLE_STATUS_LABEL); + if (lifecycleStatus.isEmpty()) { + return false; + } + return status.name().equals(lifecycleStatus.get().getValue()); + } + private void suspendAccount(IamAccount expiredAccount) { - LOG.info("Suspeding account {} expired on {} ({} days ago)", expiredAccount.getUsername(), + if (expiredAccount.isActive()) { + LOG.info("Suspeding account {} expired on {} ({} days ago)", expiredAccount.getUsername(), expiredAccount.getEndTime(), ChronoUnit.DAYS.between(expiredAccount.getEndTime().toInstant(), checkTime)); - accountService.disableAccount(expiredAccount); - if (properties.getAccount().getExpiredAccountPolicy().isRemoveExpiredAccounts()) { - addStatusLabel(expiredAccount, AccountLifecycleStatus.PENDING_REMOVAL); + accountService.disableAccount(expiredAccount); + } else { + // nothing to do + LOG.debug("Account {} expired on {} has been already suspended", expiredAccount.getUsername(), expiredAccount.getEndTime()); } - else { - addStatusLabel(expiredAccount, AccountLifecycleStatus.SUSPENDED); + if (properties.getAccount().getExpiredAccountPolicy().isRemoveExpiredAccounts()) { + markAsPendingRemoval(expiredAccount); + } else { + markAsSuspended(expiredAccount); } - addLastCheckedLabel(expiredAccount); } private void markAsPendingSuspension(IamAccount expiredAccount) { + if (checkAccountStatusIs(expiredAccount, PENDING_SUSPENSION)) { + LOG.debug("Account {} expired on {} has been already marked as pending suspension", + expiredAccount.getUsername(), expiredAccount.getEndTime()); + return; + } LOG.info("Marking account {} (expired on {} ({} days ago)) as pending suspension", expiredAccount.getUsername(), expiredAccount.getEndTime(), ChronoUnit.DAYS.between(expiredAccount.getEndTime().toInstant(), checkTime)); - addStatusLabel(expiredAccount, AccountLifecycleStatus.PENDING_SUSPENSION); - addLastCheckedLabel(expiredAccount); + addStatusLabel(expiredAccount, PENDING_SUSPENSION); + } + + private void markAsPendingRemoval(IamAccount expiredAccount) { + if (checkAccountStatusIs(expiredAccount, PENDING_REMOVAL)) { + LOG.debug("Account {} expired on {} has been already marked as pending removal", + expiredAccount.getUsername(), expiredAccount.getEndTime()); + return; + } + LOG.info("Marking account {} (expired on {} ({} days ago)) as pending removal", + expiredAccount.getUsername(), expiredAccount.getEndTime(), + ChronoUnit.DAYS.between(expiredAccount.getEndTime().toInstant(), checkTime)); + addStatusLabel(expiredAccount, PENDING_REMOVAL); + } + + private void markAsSuspended(IamAccount expiredAccount) { + if (checkAccountStatusIs(expiredAccount, SUSPENDED)) { + LOG.debug("Account {} expired on {} has been already marked as suspended", + expiredAccount.getUsername(), expiredAccount.getEndTime()); + return; + } + LOG.info("Marking account {} (expired on {} ({} days ago)) as suspended", + expiredAccount.getUsername(), expiredAccount.getEndTime(), + ChronoUnit.DAYS.between(expiredAccount.getEndTime().toInstant(), checkTime)); + addStatusLabel(expiredAccount, SUSPENDED); } private void removeAccount(IamAccount expiredAccount) { @@ -137,7 +169,6 @@ private void removeAccount(IamAccount expiredAccount) { accountService.deleteAccount(expiredAccount); } - private void scheduleAccountRemoval(IamAccount expiredAccount) { accountsScheduledForRemoval.add(expiredAccount); } @@ -148,9 +179,7 @@ private void handleExpiredAccount(IamAccount expiredAccount) { && properties.getAccount().getExpiredAccountPolicy().isRemoveExpiredAccounts()) { scheduleAccountRemoval(expiredAccount); } else if (pastSuspensionGracePeriod(expiredAccount)) { - if (expiredAccount.isActive()) { - suspendAccount(expiredAccount); - } + suspendAccount(expiredAccount); } else { markAsPendingSuspension(expiredAccount); } diff --git a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoRemovalExpiredAccountTests.java b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoRemovalExpiredAccountTests.java index 1d69d4701..1d0c2e166 100644 --- a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoRemovalExpiredAccountTests.java +++ b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoRemovalExpiredAccountTests.java @@ -16,8 +16,6 @@ package it.infn.mw.iam.test.lifecycle; import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.LIFECYCLE_STATUS_LABEL; -import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.LIFECYCLE_TIMESTAMP_LABEL; -import static java.lang.String.valueOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -72,11 +70,6 @@ public void testSuspendedLabelWorks() { assertThat(testAccount.isActive(), is(false)); - Optional timestampLabel = testAccount.getLabelByName(LIFECYCLE_TIMESTAMP_LABEL); - - assertThat(timestampLabel.isPresent(), is(true)); - assertThat(timestampLabel.get().getValue(), is(valueOf(NOW.toEpochMilli()))); - Optional statusLabel = testAccount.getLabelByName(LIFECYCLE_STATUS_LABEL); assertThat(statusLabel.isPresent(), is(true)); assertThat(statusLabel.get().getValue(), @@ -99,11 +92,6 @@ public void testNoRemovalWorks() { assertThat(testAccount.isActive(), is(false)); - Optional timestampLabel = testAccount.getLabelByName(LIFECYCLE_TIMESTAMP_LABEL); - - assertThat(timestampLabel.isPresent(), is(true)); - assertThat(timestampLabel.get().getValue(), is(valueOf(NOW.toEpochMilli()))); - Optional statusLabel = testAccount.getLabelByName(LIFECYCLE_STATUS_LABEL); assertThat(statusLabel.isPresent(), is(true)); assertThat(statusLabel.get().getValue(), diff --git a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoSuspensionGracePeriodTests.java b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoSuspensionGracePeriodTests.java index 57f840dd2..cb97f60e9 100644 --- a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoSuspensionGracePeriodTests.java +++ b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoSuspensionGracePeriodTests.java @@ -16,10 +16,8 @@ package it.infn.mw.iam.test.lifecycle; import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.LIFECYCLE_STATUS_LABEL; -import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.LIFECYCLE_TIMESTAMP_LABEL; import static it.infn.mw.iam.test.api.TestSupport.EXPECTED_ACCOUNT_NOT_FOUND; import static it.infn.mw.iam.test.api.TestSupport.TEST_USER_UUID; -import static java.lang.String.valueOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -92,11 +90,6 @@ public void testZeroDaysSuspensionGracePeriod() { assertThat(testAccount.isActive(), is(false)); - Optional timestampLabel = testAccount.getLabelByName(LIFECYCLE_TIMESTAMP_LABEL); - - assertThat(timestampLabel.isPresent(), is(true)); - assertThat(timestampLabel.get().getValue(), is(valueOf(NOW.toEpochMilli()))); - Optional statusLabel = testAccount.getLabelByName(LIFECYCLE_STATUS_LABEL); assertThat(statusLabel.isPresent(), is(true)); assertThat(statusLabel.get().getValue(), diff --git a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java index 21e3c4b4b..e15393e17 100644 --- a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java +++ b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java @@ -16,8 +16,6 @@ package it.infn.mw.iam.test.lifecycle; import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.LIFECYCLE_STATUS_LABEL; -import static it.infn.mw.iam.core.lifecycle.ExpiredAccountsHandler.LIFECYCLE_TIMESTAMP_LABEL; -import static java.lang.String.valueOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -91,11 +89,6 @@ public void testSuspensionGracePeriodWorks() { assertThat(testAccount.isActive(), is(true)); - Optional timestampLabel = testAccount.getLabelByName(LIFECYCLE_TIMESTAMP_LABEL); - - assertThat(timestampLabel.isPresent(), is(true)); - assertThat(timestampLabel.get().getValue(), is(valueOf(NOW.toEpochMilli()))); - Optional statusLabel = testAccount.getLabelByName(LIFECYCLE_STATUS_LABEL); assertThat(statusLabel.isPresent(), is(true)); assertThat(statusLabel.get().getValue(), @@ -129,11 +122,6 @@ public void testRemovalGracePeriodWorks() { assertThat(testAccount.isActive(), is(false)); assertThat(testAccount.getLastUpdateTime().compareTo(lastUpdateTime) == 0, is(true)); - Optional timestampLabel = testAccount.getLabelByName(LIFECYCLE_TIMESTAMP_LABEL); - - assertThat(timestampLabel.isPresent(), is(true)); - assertThat(timestampLabel.get().getValue(), is(valueOf(NOW.toEpochMilli()))); - Optional statusLabel = testAccount.getLabelByName(LIFECYCLE_STATUS_LABEL); assertThat(statusLabel.isPresent(), is(true)); assertThat(statusLabel.get().getValue(), From 247eb5c11375d23bb50e6c33900f679f280ff848 Mon Sep 17 00:00:00 2001 From: Enrico Vianello Date: Fri, 9 Aug 2024 18:07:13 +0200 Subject: [PATCH 5/5] Improve coverage --- ...AccountLifecycleNoRemovalExpiredAccountTests.java | 11 +++++++++++ .../mw/iam/test/lifecycle/AccountLifecycleTests.java | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoRemovalExpiredAccountTests.java b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoRemovalExpiredAccountTests.java index 1d0c2e166..7dd7f4f18 100644 --- a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoRemovalExpiredAccountTests.java +++ b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleNoRemovalExpiredAccountTests.java @@ -62,6 +62,7 @@ public void testSuspendedLabelWorks() { assertThat(testAccount.isActive(), is(true)); testAccount.setEndTime(Date.from(EIGHT_DAYS_AGO)); repo.save(testAccount); + Date lastUpdateTime = testAccount.getLastUpdateTime(); handler.handleExpiredAccounts(); @@ -69,6 +70,16 @@ public void testSuspendedLabelWorks() { repo.findByUuid(TEST_USER_UUID).orElseThrow(assertionError(EXPECTED_ACCOUNT_NOT_FOUND)); assertThat(testAccount.isActive(), is(false)); + assertThat(testAccount.getLastUpdateTime().compareTo(lastUpdateTime) > 0, is(true)); + lastUpdateTime = testAccount.getLastUpdateTime(); + + handler.handleExpiredAccounts(); + + testAccount = + repo.findByUuid(TEST_USER_UUID).orElseThrow(assertionError(EXPECTED_ACCOUNT_NOT_FOUND)); + + assertThat(testAccount.isActive(), is(false)); + assertThat(testAccount.getLastUpdateTime().compareTo(lastUpdateTime) == 0, is(true)); Optional statusLabel = testAccount.getLabelByName(LIFECYCLE_STATUS_LABEL); assertThat(statusLabel.isPresent(), is(true)); diff --git a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java index e15393e17..e357f5d86 100644 --- a/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java +++ b/iam-login-service/src/test/java/it/infn/mw/iam/test/lifecycle/AccountLifecycleTests.java @@ -81,6 +81,7 @@ public void testSuspensionGracePeriodWorks() { testAccount.setEndTime(Date.from(FOUR_DAYS_AGO)); repo.save(testAccount); + Date lastUpdateTime = testAccount.getLastUpdateTime(); handler.handleExpiredAccounts(); @@ -88,11 +89,22 @@ public void testSuspensionGracePeriodWorks() { repo.findByUuid(TEST_USER_UUID).orElseThrow(assertionError(EXPECTED_ACCOUNT_NOT_FOUND)); assertThat(testAccount.isActive(), is(true)); + assertThat(testAccount.getLastUpdateTime().compareTo(lastUpdateTime) > 0, is(true)); + lastUpdateTime = testAccount.getLastUpdateTime(); Optional statusLabel = testAccount.getLabelByName(LIFECYCLE_STATUS_LABEL); assertThat(statusLabel.isPresent(), is(true)); assertThat(statusLabel.get().getValue(), is(ExpiredAccountsHandler.AccountLifecycleStatus.PENDING_SUSPENSION.name())); + + handler.handleExpiredAccounts(); + + testAccount = + repo.findByUuid(TEST_USER_UUID).orElseThrow(assertionError(EXPECTED_ACCOUNT_NOT_FOUND)); + + assertThat(testAccount.isActive(), is(true)); + assertThat(testAccount.getLastUpdateTime().compareTo(lastUpdateTime) == 0, is(true)); + } @Test