183 lines
6.5 KiB
Python
183 lines
6.5 KiB
Python
import boto3
|
|
import pytest
|
|
|
|
from botocore.exceptions import ClientError
|
|
import sure # noqa # pylint: disable=unused-import
|
|
from datetime import datetime
|
|
from moto import mock_budgets
|
|
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
|
|
|
|
|
|
@mock_budgets
|
|
def test_create_and_describe_budget_minimal_params():
|
|
client = boto3.client("budgets", region_name="us-east-1")
|
|
resp = client.create_budget(
|
|
AccountId=ACCOUNT_ID,
|
|
Budget={
|
|
"BudgetLimit": {"Amount": "10", "Unit": "USD"},
|
|
"BudgetName": "testbudget",
|
|
"TimeUnit": "DAILY",
|
|
"BudgetType": "COST",
|
|
},
|
|
)
|
|
resp["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
|
|
|
try:
|
|
budget = client.describe_budget(AccountId=ACCOUNT_ID, BudgetName="testbudget")[
|
|
"Budget"
|
|
]
|
|
except OverflowError:
|
|
pytest.skip("This test requires 64-bit time_t")
|
|
budget.should.have.key("BudgetLimit")
|
|
budget["BudgetLimit"].should.have.key("Amount")
|
|
budget["BudgetLimit"]["Amount"].should.equal("10")
|
|
budget["BudgetLimit"].should.have.key("Unit")
|
|
budget["BudgetLimit"]["Unit"].should.equal("USD")
|
|
budget.should.have.key("BudgetName").equals("testbudget")
|
|
budget.should.have.key("TimeUnit").equals("DAILY")
|
|
budget.should.have.key("BudgetType").equals("COST")
|
|
budget.should.have.key("CalculatedSpend")
|
|
budget["CalculatedSpend"].should.have.key("ActualSpend")
|
|
budget["CalculatedSpend"]["ActualSpend"].should.equal(
|
|
{"Amount": "0", "Unit": "USD"}
|
|
)
|
|
budget["CalculatedSpend"].should.have.key("ForecastedSpend")
|
|
budget["CalculatedSpend"]["ForecastedSpend"].should.equal(
|
|
{"Amount": "0", "Unit": "USD"}
|
|
)
|
|
budget.should.have.key("CostTypes")
|
|
budget["CostTypes"].should.have.key("IncludeCredit").equals(True)
|
|
budget["CostTypes"].should.have.key("IncludeDiscount").equals(True)
|
|
budget["CostTypes"].should.have.key("IncludeOtherSubscription").equals(True)
|
|
budget["CostTypes"].should.have.key("IncludeRecurring").equals(True)
|
|
budget["CostTypes"].should.have.key("IncludeRefund").equals(True)
|
|
budget["CostTypes"].should.have.key("IncludeSubscription").equals(True)
|
|
budget["CostTypes"].should.have.key("IncludeSupport").equals(True)
|
|
budget["CostTypes"].should.have.key("IncludeTax").equals(True)
|
|
budget["CostTypes"].should.have.key("IncludeUpfront").equals(True)
|
|
budget["CostTypes"].should.have.key("UseAmortized").equals(False)
|
|
budget["CostTypes"].should.have.key("UseBlended").equals(False)
|
|
budget.should.have.key("LastUpdatedTime").should.be.a(datetime)
|
|
budget.should.have.key("TimePeriod")
|
|
budget["TimePeriod"].should.have.key("Start")
|
|
budget["TimePeriod"]["Start"].should.be.a(datetime)
|
|
budget["TimePeriod"].should.have.key("End")
|
|
budget["TimePeriod"]["End"].should.be.a(datetime)
|
|
budget.should.have.key("TimeUnit").equals("DAILY")
|
|
|
|
|
|
@mock_budgets
|
|
def test_create_existing_budget():
|
|
client = boto3.client("budgets", region_name="us-east-1")
|
|
client.create_budget(
|
|
AccountId=ACCOUNT_ID,
|
|
Budget={
|
|
"BudgetLimit": {"Amount": "10", "Unit": "USD"},
|
|
"BudgetName": "testb",
|
|
"TimeUnit": "DAILY",
|
|
"BudgetType": "COST",
|
|
},
|
|
)
|
|
|
|
with pytest.raises(ClientError) as exc:
|
|
client.create_budget(
|
|
AccountId=ACCOUNT_ID,
|
|
Budget={
|
|
"BudgetLimit": {"Amount": "10", "Unit": "USD"},
|
|
"BudgetName": "testb",
|
|
"TimeUnit": "DAILY",
|
|
"BudgetType": "COST",
|
|
},
|
|
)
|
|
err = exc.value.response["Error"]
|
|
err["Code"].should.equal("DuplicateRecordException")
|
|
err["Message"].should.equal(
|
|
"Error creating budget: testb - the budget already exists."
|
|
)
|
|
|
|
|
|
@mock_budgets
|
|
def test_create_budget_without_limit_param():
|
|
client = boto3.client("budgets", region_name="us-east-1")
|
|
with pytest.raises(ClientError) as exc:
|
|
client.create_budget(
|
|
AccountId=ACCOUNT_ID,
|
|
Budget={"BudgetName": "testb", "TimeUnit": "DAILY", "BudgetType": "COST"},
|
|
)
|
|
err = exc.value.response["Error"]
|
|
err["Code"].should.equal("InvalidParameterException")
|
|
err["Message"].should.equal(
|
|
"Unable to create/update budget - please provide one of the followings: Budget Limit/ Planned Budget Limit/ Auto Adjust Data"
|
|
)
|
|
|
|
|
|
@mock_budgets
|
|
def test_describe_unknown_budget():
|
|
client = boto3.client("budgets", region_name="us-east-1")
|
|
with pytest.raises(ClientError) as exc:
|
|
client.describe_budget(AccountId=ACCOUNT_ID, BudgetName="unknown")
|
|
err = exc.value.response["Error"]
|
|
err["Code"].should.equal("NotFoundException")
|
|
err["Message"].should.equal(
|
|
"Unable to get budget: unknown - the budget doesn't exist."
|
|
)
|
|
|
|
|
|
@mock_budgets
|
|
def test_describe_no_budgets():
|
|
client = boto3.client("budgets", region_name="us-east-1")
|
|
resp = client.describe_budgets(AccountId=ACCOUNT_ID)
|
|
resp.should.have.key("Budgets").equals([])
|
|
|
|
|
|
@mock_budgets
|
|
def test_create_and_describe_all_budgets():
|
|
client = boto3.client("budgets", region_name="us-east-1")
|
|
client.create_budget(
|
|
AccountId=ACCOUNT_ID,
|
|
Budget={
|
|
"BudgetLimit": {"Amount": "10", "Unit": "USD"},
|
|
"BudgetName": "testbudget",
|
|
"TimeUnit": "DAILY",
|
|
"BudgetType": "COST",
|
|
},
|
|
)
|
|
|
|
try:
|
|
res = client.describe_budgets(AccountId=ACCOUNT_ID)
|
|
except OverflowError:
|
|
pytest.skip("This test requires 64-bit time_t")
|
|
res["Budgets"].should.have.length_of(1)
|
|
|
|
|
|
@mock_budgets
|
|
def test_delete_budget():
|
|
client = boto3.client("budgets", region_name="us-east-1")
|
|
client.create_budget(
|
|
AccountId=ACCOUNT_ID,
|
|
Budget={
|
|
"BudgetLimit": {"Amount": "10", "Unit": "USD"},
|
|
"BudgetName": "b1",
|
|
"TimeUnit": "DAILY",
|
|
"BudgetType": "COST",
|
|
},
|
|
)
|
|
|
|
resp = client.delete_budget(AccountId=ACCOUNT_ID, BudgetName="b1")
|
|
resp["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
|
|
|
res = client.describe_budgets(AccountId=ACCOUNT_ID)
|
|
res["Budgets"].should.have.length_of(0)
|
|
|
|
|
|
@mock_budgets
|
|
def test_delete_unknown_budget():
|
|
client = boto3.client("budgets", region_name="us-east-1")
|
|
with pytest.raises(ClientError) as exc:
|
|
client.delete_budget(AccountId=ACCOUNT_ID, BudgetName="unknown")
|
|
err = exc.value.response["Error"]
|
|
err["Code"].should.equal("NotFoundException")
|
|
err["Message"].should.equal(
|
|
"Unable to delete budget: unknown - the budget doesn't exist. Try creating it first. "
|
|
)
|