package org.ovirt.engine.core.bll; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.ovirt.engine.core.common.action.QuotaCRUDParameters; import org.ovirt.engine.core.common.businessentities.Quota; import org.ovirt.engine.core.common.businessentities.QuotaCluster; import org.ovirt.engine.core.common.businessentities.QuotaStorage; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.QuotaDao; import org.ovirt.engine.core.utils.RandomUtils; /** A test case for the {@link UpdateQuotaCommand} class. */ public class UpdateQuotaCommandTest extends BaseCommandTest { /** The ID of the quota used for testing */ private static final Guid QUOTA_ID = Guid.newGuid(); /** The parameters to test the command with */ private QuotaCRUDParameters params = new QuotaCRUDParameters(setUpQuota(QUOTA_ID)); /** The command to test */ @Spy @InjectMocks private UpdateQuotaCommand command = new UpdateQuotaCommand(params, null); /** The quota to use for testing */ private Quota quota; /** A mock of the QuotaDao used by the command */ @Mock private QuotaDao quotaDao; @Before public void setUp() { quota = setUpQuota(QUOTA_ID); when(quotaDao.getById(QUOTA_ID)).thenReturn(quota); doNothing().when(command).removeQuotaFromCache(); doNothing().when(command).afterUpdate(); } private Quota setUpQuota(Guid guid) { Quota quota = new Quota(); quota.setId(guid); int numQutoaClusters = RandomUtils.instance().nextInt(10); List<QuotaCluster> quotaClusters = new ArrayList<>(numQutoaClusters); for (int i = 0; i < numQutoaClusters; ++i) { quotaClusters.add(new QuotaCluster()); } quota.setQuotaClusters(quotaClusters); int numQutoaStorages = RandomUtils.instance().nextInt(10); List<QuotaStorage> quotaStorages = new ArrayList<>(numQutoaStorages); for (int i = 0; i < numQutoaClusters; ++i) { quotaStorages.add(new QuotaStorage()); } quota.setQuotaStorages(quotaStorages); return quota; } @Test public void testExecuteCommand() { // Execute the command command.executeCommand(); Quota parameterQuota = command.getParameters().getQuota(); Guid quotaId = parameterQuota.getId(); for (QuotaStorage quotaStorage : parameterQuota.getQuotaStorages()) { assertNotNull("Quota Storage should have been assigned an ID", quotaStorage.getQuotaStorageId()); assertEquals("Wrong Qutoa ID on Quota Storage", quotaId, quotaStorage.getQuotaId()); } for (QuotaCluster quotaCluster : parameterQuota.getQuotaClusters()) { assertNotNull("Quota Cluster should have been assigned an ID", quotaCluster.getQuotaClusterId()); assertEquals("Wrong Qutoa ID on Quota Cluster", quotaId, quotaCluster.getQuotaId()); } // Verify the quota was updated in the database verify(quotaDao).update(parameterQuota); // Assert the return value assertTrue("Execution should be successful", command.getReturnValue().getSucceeded()); } @Test public void testFailToUpdateDefaultQuota() { quota.setDefault(true); ValidateTestUtils.runAndAssertValidateFailure(command, EngineMessage.ACTION_TYPE_FAILED_QUOTA_DEFAULT_CANNOT_BE_CHANGED); } @Test public void testChangeToDefaultQuota() { params.getQuota().setDefault(true); ValidateTestUtils.runAndAssertValidateFailure(command, EngineMessage.ACTION_TYPE_FAILED_QUOTA_IS_NOT_VALID); } }