Merge pull request #1281 from dod-ccpo/bugfix/reporting-apps-and-envs

Better incorporate fixture data into reporting
This commit is contained in:
graham-dds 2020-01-06 12:23:08 -05:00 committed by GitHub
commit f4e1b668f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 26 deletions

View File

@ -34,16 +34,24 @@ class MockReportingProvider:
} }
] ]
""" """
if portfolio.name in cls.FIXTURE_SPEND_DATA:
applications = cls.FIXTURE_SPEND_DATA[portfolio.name]["applications"] fixture_apps = cls.FIXTURE_SPEND_DATA.get(portfolio.name, {}).get(
return sorted( "applications", []
[ )
cls._get_application_monthly_totals(application)
for application in applications for application in portfolio.applications:
], if application.name not in [app["name"] for app in fixture_apps]:
key=lambda app: app["name"], fixture_apps.append({"name": application.name, "environments": []})
)
return [] return sorted(
[
cls._get_application_monthly_totals(portfolio, fixture_app)
for fixture_app in fixture_apps
if fixture_app["name"]
in [application.name for application in portfolio.applications]
],
key=lambda app: app["name"],
)
@classmethod @classmethod
def _get_environment_monthly_totals(cls, environment): def _get_environment_monthly_totals(cls, environment):
@ -64,7 +72,7 @@ class MockReportingProvider:
} }
@classmethod @classmethod
def _get_application_monthly_totals(cls, application): def _get_application_monthly_totals(cls, portfolio, fixture_app):
""" """
returns a dictionary that represents spending totals for an application returns a dictionary that represents spending totals for an application
and its environments e.g. and its environments e.g.
@ -83,19 +91,28 @@ class MockReportingProvider:
] ]
} }
""" """
environments = sorted( application_envs = [
[ env
cls._get_environment_monthly_totals(env) for env in portfolio.all_environments
for env in application["environments"] if env.application.name == fixture_app["name"]
], ]
key=lambda env: env["name"],
) environments = [
cls._get_environment_monthly_totals(env)
for env in fixture_app["environments"]
if env["name"] in [e.name for e in application_envs]
]
for env in application_envs:
if env.name not in [env["name"] for env in environments]:
environments.append({"name": env.name})
return { return {
"name": application["name"], "name": fixture_app["name"],
"this_month": sum(env["this_month"] for env in environments), "this_month": sum(env.get("this_month", 0) for env in environments),
"last_month": sum(env["last_month"] for env in environments), "last_month": sum(env.get("last_month", 0) for env in environments),
"total": sum(env["total"] for env in environments), "total": sum(env.get("total", 0) for env in environments),
"environments": environments, "environments": sorted(environments, key=lambda env: env["name"]),
} }
@classmethod @classmethod

View File

@ -49,7 +49,7 @@
<span v-html='formatDollars(application.last_month || 0)'></span> <span v-html='formatDollars(application.last_month || 0)'></span>
</td> </td>
<td class="table-cell--align-right"> <td class="table-cell--align-right">
<span v-html='formatDollars(application.total)'></span> <span v-html='formatDollars(application.total || 0)'></span>
</td> </td>
</tr> </tr>
<tr <tr
@ -67,7 +67,7 @@
<span v-html='formatDollars(environment.last_month || 0)'></span> <span v-html='formatDollars(environment.last_month || 0)'></span>
</td> </td>
<td class="table-cell--align-right"> <td class="table-cell--align-right">
<span v-html='formatDollars(environment.total)'></span> <span v-html='formatDollars(environment.total || 0)'></span>
</td> </td>
</tr> </tr>
</template> </template>

View File

@ -1,4 +1,5 @@
from atst.domain.csp.reports import MockReportingProvider from atst.domain.csp.reports import MockReportingProvider
from tests.factories import PortfolioFactory
def test_get_environment_monthly_totals(): def test_get_environment_monthly_totals():
@ -20,6 +21,11 @@ def test_get_environment_monthly_totals():
def test_get_application_monthly_totals(): def test_get_application_monthly_totals():
portfolio = PortfolioFactory.create(
applications=[
{"name": "Test Application", "environments": [{"name": "Z"}, {"name": "A"}]}
],
)
application = { application = {
"name": "Test Application", "name": "Test Application",
"environments": [ "environments": [
@ -42,7 +48,9 @@ def test_get_application_monthly_totals():
], ],
} }
totals = MockReportingProvider._get_application_monthly_totals(application) totals = MockReportingProvider._get_application_monthly_totals(
portfolio, application
)
assert totals["name"] == "Test Application" assert totals["name"] == "Test Application"
assert totals["this_month"] == 300 assert totals["this_month"] == 300
assert totals["last_month"] == 700 assert totals["last_month"] == 700