// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package org.apache.cloudstack.api.response; import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.db.TransactionLegacy; import junit.framework.TestCase; import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd; import org.apache.cloudstack.api.command.QuotaEmailTemplateUpdateCmd; import org.apache.cloudstack.quota.QuotaService; import org.apache.cloudstack.quota.constant.QuotaTypes; import org.apache.cloudstack.quota.dao.QuotaBalanceDao; import org.apache.cloudstack.quota.dao.QuotaCreditsDao; import org.apache.cloudstack.quota.dao.QuotaEmailTemplatesDao; import org.apache.cloudstack.quota.dao.QuotaTariffDao; import org.apache.cloudstack.quota.vo.QuotaBalanceVO; import org.apache.cloudstack.quota.vo.QuotaCreditsVO; import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO; import org.apache.cloudstack.quota.vo.QuotaTariffVO; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.inject.Inject; @RunWith(MockitoJUnitRunner.class) public class QuotaResponseBuilderImplTest extends TestCase { @Mock QuotaTariffDao quotaTariffDao; @Mock QuotaBalanceDao quotaBalanceDao; @Mock QuotaCreditsDao quotaCreditsDao; @Mock QuotaEmailTemplatesDao quotaEmailTemplateDao; @Mock UserDao userDao; @Mock QuotaService quotaService; @Mock AccountDao accountDao; @Inject AccountManager accountMgr; QuotaResponseBuilderImpl quotaResponseBuilder = new QuotaResponseBuilderImpl(); @Before public void setup() throws IllegalAccessException, NoSuchFieldException { // Dummy transaction stack setup TransactionLegacy.open("QuotaResponseBuilderImplTest"); Field tariffDaoField = QuotaResponseBuilderImpl.class.getDeclaredField("_quotaTariffDao"); tariffDaoField.setAccessible(true); tariffDaoField.set(quotaResponseBuilder, quotaTariffDao); Field balanceDaoField = QuotaResponseBuilderImpl.class.getDeclaredField("_quotaBalanceDao"); balanceDaoField.setAccessible(true); balanceDaoField.set(quotaResponseBuilder, quotaBalanceDao); Field quotaCreditsDaoField = QuotaResponseBuilderImpl.class.getDeclaredField("_quotaCreditsDao"); quotaCreditsDaoField.setAccessible(true); quotaCreditsDaoField.set(quotaResponseBuilder, quotaCreditsDao); Field quotaEmailTemplateDaoField = QuotaResponseBuilderImpl.class.getDeclaredField("_quotaEmailTemplateDao"); quotaEmailTemplateDaoField.setAccessible(true); quotaEmailTemplateDaoField.set(quotaResponseBuilder, quotaEmailTemplateDao); Field userDaoField = QuotaResponseBuilderImpl.class.getDeclaredField("_userDao"); userDaoField.setAccessible(true); userDaoField.set(quotaResponseBuilder, userDao); Field quotaServiceField = QuotaResponseBuilderImpl.class.getDeclaredField("_quotaService"); quotaServiceField.setAccessible(true); quotaServiceField.set(quotaResponseBuilder, quotaService); Field accountDaoField = QuotaResponseBuilderImpl.class.getDeclaredField("_accountDao"); accountDaoField.setAccessible(true); accountDaoField.set(quotaResponseBuilder, accountDao); Field regionMgrField = QuotaResponseBuilderImpl.class.getDeclaredField("_accountMgr"); regionMgrField.setAccessible(true); regionMgrField.set(quotaResponseBuilder, accountMgr); } private QuotaTariffVO makeTariffTestData() { QuotaTariffVO tariffVO = new QuotaTariffVO(); tariffVO.setUsageType(QuotaTypes.IP_ADDRESS); tariffVO.setUsageName("ip address"); tariffVO.setUsageUnit("IP-Month"); tariffVO.setCurrencyValue(BigDecimal.valueOf(100.19)); tariffVO.setEffectiveOn(new Date()); tariffVO.setUsageDiscriminator(""); return tariffVO; } @Test public void testQuotaResponse() { QuotaTariffVO tariffVO = makeTariffTestData(); QuotaTariffResponse response = quotaResponseBuilder.createQuotaTariffResponse(tariffVO); assertTrue(tariffVO.getUsageType() == response.getUsageType()); assertTrue(tariffVO.getCurrencyValue().equals(response.getTariffValue())); } @Test public void testAddQuotaCredits() { final long accountId = 2L; final long domainId = 1L; final double amount = 11.0; final long updatedBy = 2L; QuotaCreditsVO credit = new QuotaCreditsVO(); credit.setCredit(new BigDecimal(amount)); Mockito.when(quotaCreditsDao.saveCredits(Mockito.any(QuotaCreditsVO.class))).thenReturn(credit); Mockito.when(quotaBalanceDao.lastQuotaBalance(Mockito.anyLong(), Mockito.anyLong(), Mockito.any(Date.class))).thenReturn(new BigDecimal(111)); Mockito.when(quotaService.computeAdjustedTime(Mockito.any(Date.class))).thenReturn(new Date()); AccountVO account = new AccountVO(); account.setState(Account.State.locked); Mockito.when(accountDao.findById(Mockito.anyLong())).thenReturn(account); QuotaCreditsResponse resp = quotaResponseBuilder.addQuotaCredits(accountId, domainId, amount, updatedBy, true); assertTrue(resp.getCredits().compareTo(credit.getCredit()) == 0); } @Test public void testListQuotaEmailTemplates() { QuotaEmailTemplateListCmd cmd = new QuotaEmailTemplateListCmd(); cmd.setTemplateName("some name"); List<QuotaEmailTemplatesVO> templates = new ArrayList<>(); QuotaEmailTemplatesVO template = new QuotaEmailTemplatesVO(); template.setTemplateName("template"); templates.add(template); Mockito.when(quotaEmailTemplateDao.listAllQuotaEmailTemplates(Mockito.anyString())).thenReturn(templates); assertTrue(quotaResponseBuilder.listQuotaEmailTemplates(cmd).size() == 1); } @Test public void testUpdateQuotaEmailTemplate() { QuotaEmailTemplateUpdateCmd cmd = new QuotaEmailTemplateUpdateCmd(); cmd.setTemplateBody("some body"); cmd.setTemplateName("some name"); cmd.setTemplateSubject("some subject"); List<QuotaEmailTemplatesVO> templates = new ArrayList<>(); Mockito.when(quotaEmailTemplateDao.listAllQuotaEmailTemplates(Mockito.anyString())).thenReturn(templates); Mockito.when(quotaEmailTemplateDao.updateQuotaEmailTemplate(Mockito.any(QuotaEmailTemplatesVO.class))).thenReturn(true); // invalid template test assertFalse(quotaResponseBuilder.updateQuotaEmailTemplate(cmd)); // valid template test QuotaEmailTemplatesVO template = new QuotaEmailTemplatesVO(); template.setTemplateName("template"); templates.add(template); assertTrue(quotaResponseBuilder.updateQuotaEmailTemplate(cmd)); } @Test public void testCreateQuotaLastBalanceResponse() { List<QuotaBalanceVO> quotaBalance = new ArrayList<>(); // null balance test try { quotaResponseBuilder.createQuotaLastBalanceResponse(null, new Date()); } catch (InvalidParameterValueException e) { assertTrue(e.getMessage().equals("There are no balance entries on or before the requested date.")); } // empty balance test try { quotaResponseBuilder.createQuotaLastBalanceResponse(quotaBalance, new Date()); } catch (InvalidParameterValueException e) { assertTrue(e.getMessage().equals("There are no balance entries on or before the requested date.")); } // valid balance test QuotaBalanceVO entry = new QuotaBalanceVO(); entry.setAccountId(2L); entry.setCreditBalance(new BigDecimal(100)); quotaBalance.add(entry); quotaBalance.add(entry); Mockito.when(quotaService.computeAdjustedTime(Mockito.any(Date.class))).thenReturn(new Date()); QuotaBalanceResponse resp = quotaResponseBuilder.createQuotaLastBalanceResponse(quotaBalance, null); assertTrue(resp.getStartQuota().compareTo(new BigDecimal(200)) == 0); } @Test public void testStartOfNextDay() { DateTime now = new DateTime(); DateTime nextDay = new DateTime(quotaResponseBuilder.startOfNextDay(now.toDate())); DateTime nextDay2 = new DateTime(quotaResponseBuilder.startOfNextDay()); assertTrue(now.toLocalDate().equals(nextDay.minusDays(1).toLocalDate())); assertTrue(now.toLocalDate().equals(nextDay2.minusDays(1).toLocalDate())); } }