diff --git a/app/jobs/reports/irs_monthly_cred_metrics_report.rb b/app/jobs/reports/irs_monthly_cred_metrics_report.rb
index 92d19e90bba..4770266368c 100644
--- a/app/jobs/reports/irs_monthly_cred_metrics_report.rb
+++ b/app/jobs/reports/irs_monthly_cred_metrics_report.rb
@@ -1,49 +1,72 @@
# frozen_string_literal: true
-require 'csv'
-
module Reports
class IrsMonthlyCredMetricsReport < BaseReport
REPORT_NAME = 'irs_monthly_cred_metrics'
attr_reader :report_date
- def initialize(report_date = nil, *args, **rest)
+ def initialize(report_date = Time.zone.yesterday.end_of_day, *args, **rest)
@report_date = report_date
super(*args, **rest)
end
+ def partner_accounts
+ partner_strings = [*IdentityConfig.store.irs_partner_strings].reject(&:blank?)
+ IaaReportingHelper.partner_accounts.filter do |account|
+ partner_strings.include?(account.partner)
+ end
+ end
+
+ def iaas
+ IaaReportingHelper.iaas.filter do |iaa|
+ iaa.end_date > 90.days.ago && (iaa.issuers & issuers).any?
+ end
+ end
+
+ def issuers
+ [*IdentityConfig.store.irs_issuers].reject(&:blank?)
+ end
+
+ def email_addresses
+ [*IdentityConfig.store.irs_credentials_emails].reject(&:blank?)
+ end
+
def definitions_table
[
['Metric', 'Unit', 'Definition'],
- [
- 'Credentials authorized for Partner',
- 'Count',
- 'The total number of users (new and existing)
- that successfully signed into the applications. ' \
- 'The combined count of the two rows below: "new identity
- verification + existing identity verification".',
- ],
- [
- 'New identity verification/Credentials Authorized for Partner',
- 'Count',
- 'The number of users who are in their first IdV proofing year
+
+ ['Monthly Active Users', 'Count',
+ 'The total number of unique users across all IAL levels
+ that successfully signed into IRS applications'],
+
+ ['New Users - IAL2 Year 1', 'Count',
+ 'The number of new unique IRS users who are in their first IdV proofing year
and authenticate with the IRS.
+
This count correlates with the billing report charges for Newly Billed
- IdV users (Year 1), Agreement-Level Count.',
- ],
- [
- 'Existing identity verification/Credentials Authorized for Partner',
- 'Count',
- 'The number of users who are in IdV proofing years 2 - 5 and authenticate with the IRS.
+ IdV users (Year 1), Agreement-Level Count.'],
+
+ ['New Users - IAL2 Year 2+', 'Count',
+ 'The number of new unique IRS users who are in their IdV proofing years 2 - 5
+ and authenticate with the IRS.
+
This count correlates with the billing report charges for Newly Billed
- IdV users (Years 2 - 5+), Agreement-Level Count. ' \
- 'count of users who share credentials with these applications.',
- ],
+ IdV users (Years 2 - 5+), Agreement-Level Count.'],
+
+ ['Total Auths', 'Count',
+ 'The total number of authentication events processed
+ (including multiple events per users) across all IRS
+ applications during the reporting period'],
+
+ ['IAL2 Auths', 'Count',
+ 'The total number of **IAL2** authentication events processed
+ (including multiple events per users) across all IRS
+ applications during the reporting period'],
]
end
- def overview_table(issuers)
+ def overview_table
[
['Report Timeframe', 'Report Generated', 'Issuers'],
["#{report_date.beginning_of_month} to #{report_date.end_of_month}", Time.zone.today.to_s,
@@ -51,44 +74,41 @@ def overview_table(issuers)
]
end
- def perform(date = Time.zone.yesterday.end_of_day)
- @report_date = date
- issuers = IaaReportingHelper.partner_accounts.select do |pc|
- pc.partner == 'IRS'
- end.flat_map(&:issuers)
- IaaReportingHelper.iaas.filter { |x| x.end_date > 90.days.ago }
+ def perform(perform_date = Time.zone.yesterday.end_of_day)
+ reports = as_emailable_irs_report(
+ date: perform_date,
+ )
+
+ reports.each do |report|
+ _latest_path, path = generate_s3_paths(
+ REPORT_NAME, 'csv',
+ subname: report.filename,
+ now: perform_date
+ )
- iaas = IaaReportingHelper.iaas.filter do |iaa|
- iaa.end_date > 90.days.ago &&
- (iaa.issuers & issuers).any? # intersection: at least one issuer matches
+ content_type = Mime::Type.lookup_by_extension('csv').to_s
+ report_csv = csv_file(report.table)
+ _url = upload_file_to_s3_bucket(
+ path: path, body: report_csv, content_type: content_type,
+ )
end
- csv = build_csv(iaas, IaaReportingHelper.partner_accounts, report_date)
- email_addresses = emails.select(&:present?)
- # Check if any emails are found
if email_addresses.empty?
Rails.logger.warn 'No email addresses received - IRS Monthly Credential Report NOT SENT'
return false
end
- reports = as_emailable_irs_report(
- iaas: iaas,
- partner_accounts: IaaReportingHelper.partner_accounts, date: report_date,
- issuers: issuers
- )
- reports.each do |report|
- upload_to_s3(report.table, report_date, report_name: report.filename)
- end
+
ReportMailer.tables_report(
email: email_addresses,
- subject: "IRS Monthly Credential Metrics - #{date.to_date}",
+ subject: "IRS Monthly Credential Metrics - #{perform_date.to_date}",
message: preamble,
reports: reports,
attachment_format: :csv,
).deliver_now
- csv
+ report_data
end
- def as_emailable_irs_report(iaas:, partner_accounts:, date:, issuers:)
+ def as_emailable_irs_report(date:)
[
Reporting::EmailableReport.new(
title: 'Definitions',
@@ -97,18 +117,22 @@ def as_emailable_irs_report(iaas:, partner_accounts:, date:, issuers:)
),
Reporting::EmailableReport.new(
title: 'Overview',
- table: overview_table(issuers),
+ table: overview_table,
filename: 'irs_monthly_cred_overview',
),
Reporting::EmailableReport.new(
title: "IRS Monthly Credential Metrics #{date.strftime('%B %Y')}",
- table: CSV.parse(build_csv(iaas, partner_accounts, date)),
+ table: report_data,
filename: 'irs_monthly_cred_metrics',
),
]
end
+ def report_data
+ @report_data ||= build_report_data
+ end
+
# @return [String]
def preamble(env: Identity::Hostdata.env || 'local')
ERB.new(<<~ERB).result(binding).html_safe # rubocop:disable Rails/OutputSafety
@@ -128,194 +152,61 @@ def preamble(env: Identity::Hostdata.env || 'local')
<% end %>
-
- For more information on how each of these metrics are calculated, take a look at our
-
- Monthly Key Metrics Report Explainer document.
-
ERB
end
- # @param [Array] iaas
- # @param [Array] partner_accounts
- # @return [String] CSV report
- def build_csv(iaas, partner_accounts, report_date)
- report_month_start = report_date.beginning_of_month
- report_month_end = report_date.end_of_month
- by_iaa_results = iaas.flat_map do |iaa|
- Db::MonthlySpAuthCount::UniqueMonthlyAuthCountsByIaa.call(
- key: iaa.key,
- issuers: iaa.issuers,
- start_date: report_month_start,
- end_date: report_month_end,
- )
- end
-
- by_issuer_results = iaas.flat_map do |iaa|
- iaa.issuers.flat_map do |issuer|
- Db::MonthlySpAuthCount::TotalMonthlyAuthCountsWithinIaaWindow.call(
- issuer: issuer,
- iaa_start_date: report_month_start,
- iaa_end_date: report_month_end,
- iaa: iaa.key,
- )
- end
- end
-
- by_partner_results = partner_accounts.flat_map do |partner_account|
- Db::MonthlySpAuthCount::NewUniqueMonthlyUserCountsByPartner.call(
- partner: partner_account.partner,
- issuers: partner_account.issuers,
- start_date: report_month_start,
- end_date: report_month_end,
- )
- end
-
- by_issuer_profile_age_results = partner_accounts.flat_map do |partner_account|
- partner_account.issuers.flat_map do |issuer|
- Db::MonthlySpAuthCount::NewUniqueMonthlyUserCountsByPartner.call(
- partner: partner_account.partner,
- issuers: [issuer],
- start_date: report_month_start,
- end_date: report_month_end,
- )
+ def csv_file(report_array)
+ CSV.generate do |csv|
+ report_array.each do |row|
+ csv << row
end
end
-
- combine_by_iaa_month(
- by_iaa_results: by_iaa_results,
- by_issuer_results: by_issuer_results,
- by_partner_results: by_partner_results,
- by_issuer_profile_age_results: by_issuer_profile_age_results,
- )
end
private
- def write_csv_header(csv)
- csv << [
- 'Credentials Authorized',
- 'New ID Verifications Authorized Credentials',
- 'Existing Identity Verification Credentials',
- ]
- end
-
- def write_csv_row(csv:, iaa_key:, year_month:, iaa_results:, by_issuer_results:,
- by_partner_results:, by_issuer_profile_age_results:)
- Date.parse(iaa_results.first[:iaa_start_date])
- Date.parse(iaa_results.first[:iaa_end_date])
- Date.strptime(year_month, '%Y%m')
-
- issuer_results = by_issuer_results.select do |r|
- r[:iaa] == iaa_key && r[:year_month] == year_month
- end
-
- total_auth = issuer_results.sum do |r|
- (r[:total_auth_count] if r[:ial] == 1 || r[:ial] == 2) || 0
- end
-
- related_issuers = issuer_results.map { |r| r[:issuer] }.uniq
-
- partner_results = by_partner_results.select do |result|
- result[:year_month] == year_month && (result[:issuers] & related_issuers).any?
- end
-
- new_users = partner_results.sum do |r|
- %i[
- partner_ial2_new_unique_user_events_year1
- partner_ial2_new_unique_user_events_year2
- partner_ial2_new_unique_user_events_year3
- partner_ial2_new_unique_user_events_year4
- partner_ial2_new_unique_user_events_year5
- partner_ial2_new_unique_user_events_year_greater_than_5
- partner_ial2_new_unique_user_events_unknown
- ].sum { |key| r[key] || 0 }
- end
-
- existing_users = by_issuer_profile_age_results.select do |r|
- r[:year_month] == year_month && (r[:issuers] & related_issuers).any?
- end.sum do |r|
- total = %i[
- partner_ial2_unique_user_events_year1
- partner_ial2_unique_user_events_year2
- partner_ial2_unique_user_events_year3
- partner_ial2_unique_user_events_year4
- partner_ial2_unique_user_events_year5
- partner_ial2_unique_user_events_year_greater_than_5
- partner_ial2_unique_user_events_unknown
- ].sum { |key| r[key] || 0 }
-
- new = %i[
- partner_ial2_new_unique_user_events_year1
- partner_ial2_new_unique_user_events_year2
- partner_ial2_new_unique_user_events_year3
- partner_ial2_new_unique_user_events_year4
- partner_ial2_new_unique_user_events_year5
- partner_ial2_new_unique_user_events_year_greater_than_5
- partner_ial2_new_unique_user_events_unknown
- ].sum { |key| r[key] || 0 }
-
- total - new
- end
-
- csv << [
- total_auth,
- new_users,
- existing_users,
- ]
- end
+ def build_report_data
+ parsed_invoice_data = CSV.parse(invoice_report_data, headers: true)
- def combine_by_iaa_month(
- by_iaa_results:,
- by_issuer_results:,
- by_partner_results:,
- by_issuer_profile_age_results:
- )
- by_iaa_and_year_month = by_iaa_results.group_by do |result|
- [result[:key], result[:year_month]]
+ report_year_month = report_date.strftime('%Y%m')
+ data_row = parsed_invoice_data.filter do |row|
+ row['year_month'] == report_year_month
end
- CSV.generate do |csv|
- write_csv_header(csv)
- by_iaa_and_year_month.each do |(iaa_key, year_month), iaa_results|
- write_csv_row(
- csv: csv,
- iaa_key: iaa_key,
- year_month: year_month,
- iaa_results: iaa_results,
- by_issuer_results: by_issuer_results,
- by_partner_results: by_partner_results,
- by_issuer_profile_age_results: by_issuer_profile_age_results,
- )
- end
- end
- end
- def emails
- [*IdentityConfig.store.irs_credentials_emails]
- end
-
- def upload_to_s3(report_body, report_date, report_name: nil)
- _latest, path = generate_s3_paths(REPORT_NAME, 'csv', subname: report_name, now: report_date)
- if bucket_name.present?
- upload_file_to_s3_bucket(
- path: path,
- body: csv_file(report_body),
- content_type: 'text/csv',
- bucket: bucket_name,
- )
- end
+ headers = definitions_table.transpose[0]
+ report_array =
+ [
+ # Headers row
+ headers,
+ ] + data_row.map do |invoice_report|
+ # Data rows - extract values directly from CSV row
+ ['Value',
+ invoice_report['iaa_unique_users'].to_i, # Monthly Active Users
+ invoice_report['partner_ial2_new_unique_user_events_year1'].to_i, # New IAL Year 1
+ ial2_year_2_plus(invoice_report), # New IAL Year 2
+ invoice_report['issuer_ial1_plus_2_total_auth_count'].to_i, # Total Auths
+ invoice_report['issuer_ial2_total_auth_count'].to_i] # IAL2 Auths
+ end
+ return report_array.transpose
end
- def csv_file(report_array)
- CSV.generate do |csv|
- report_array.each do |row|
- csv << row
- end
+ def invoice_report_data
+ @invoice_report_data ||= begin
+ # Delegate only the CSV building to the existing class
+ invoice_reporter = CombinedInvoiceSupplementReportV2.new
+ data = invoice_reporter.build_csv(iaas, partner_accounts)
+ save_report(REPORT_NAME, data, extension: 'csv')
+ data
end
end
- def extract(arr, key, ial:)
- arr.find { |elem| elem[:ial] == ial && elem[key] }&.dig(key) || 0
+ def ial2_year_2_plus(row)
+ %w[
+ partner_ial2_new_unique_user_events_year2
+ partner_ial2_new_unique_user_events_year3
+ partner_ial2_new_unique_user_events_year4
+ partner_ial2_new_unique_user_events_year5
+ ].sum { |key| row[key].to_i }
end
end
end
diff --git a/config/application.yml.default b/config/application.yml.default
index 571bba97c33..81636050a8d 100644
--- a/config/application.yml.default
+++ b/config/application.yml.default
@@ -249,6 +249,8 @@ irs_credential_tenure_report_issuers: '[]'
irs_credentials_emails: '[]'
irs_fraud_metrics_emails: '[]'
irs_fraud_metrics_issuers: '[]'
+irs_issuers: '[]'
+irs_partner_strings: '[]'
irs_registration_funnel_emails: '[]'
irs_registration_funnel_issuers: '[]'
irs_verification_report_config: '[]'
diff --git a/lib/identity_config.rb b/lib/identity_config.rb
index 562d296d4b2..17413350260 100644
--- a/lib/identity_config.rb
+++ b/lib/identity_config.rb
@@ -190,6 +190,8 @@ def self.store
config.add(:fraud_ops_public_key, type: :string)
config.add(:fraud_ops_s3_bucket, type: :string)
config.add(:fraud_ops_event_ttl_seconds, type: :integer)
+ config.add(:irs_issuers, type: :json)
+ config.add(:irs_partner_strings, type: :json)
config.add(:irs_registration_funnel_issuers, type: :json)
config.add(:irs_registration_funnel_emails, type: :json)
config.add(:irs_fraud_metrics_issuers, type: :json)
diff --git a/spec/fixtures/partner_cred_metrics_input.csv b/spec/fixtures/partner_cred_metrics_input.csv
new file mode 100644
index 00000000000..be01b2f22fb
--- /dev/null
+++ b/spec/fixtures/partner_cred_metrics_input.csv
@@ -0,0 +1,3 @@
+iaa_order_number,partner,iaa_start_date,iaa_end_date,issuer,friendly_name,year_month,year_month_readable,iaa_ial1_unique_users,iaa_ial2_unique_users,iaa_unique_users,partner_ial2_unique_user_events_year1,partner_ial2_unique_user_events_year2,partner_ial2_unique_user_events_year3,partner_ial2_unique_user_events_year4,partner_ial2_unique_user_events_year5,partner_ial2_unique_user_events_year_greater_than_5,partner_ial2_unique_user_events_unknown,partner_ial2_new_unique_user_events_year1,partner_ial2_new_unique_user_events_year2,partner_ial2_new_unique_user_events_year3,partner_ial2_new_unique_user_events_year4,partner_ial2_new_unique_user_events_year5,partner_ial2_new_unique_user_events_year_greater_than_5,partner_ial2_new_unique_user_events_unknown,issuer_ial2_unique_user_events_year1,issuer_ial2_unique_user_events_year2,issuer_ial2_unique_user_events_year3,issuer_ial2_unique_user_events_year4,issuer_ial2_unique_user_events_year5,issuer_ial2_unique_user_events_year_greater_than_5,issuer_ial2_unique_user_events_unknown,issuer_ial2_new_unique_user_events_year1,issuer_ial2_new_unique_user_events_year2,issuer_ial2_new_unique_user_events_year3,issuer_ial2_new_unique_user_events_year4,issuer_ial2_new_unique_user_events_year5,issuer_ial2_new_unique_user_events_year_greater_than_5,issuer_ial2_new_unique_user_events_unknown,issuer_ial1_total_auth_count,issuer_ial2_total_auth_count,issuer_ial1_plus_2_total_auth_count,issuer_ial1_unique_users,issuer_ial2_unique_users,issuer_unique_users
+TestOrder,PARTNER_NAME,12/1/20,11/30/21,urn:gov:gsa:openidconnect.profiles:sp:sso:agency_name:partner_app_name,PARTNER_NAME,202012,Dec-20,9059,312,9060,199,65,38,12,0,0,0,98,31,19,6,0,0,0,199,65,38,12,0,0,0,98,31,19,6,0,0,0,17949,652,18602,9059,312,9060
+TestOrder,PARTNER_NAME,12/1/20,11/30/21,urn:gov:gsa:openidconnect.profiles:sp:sso:agency_name:partner_app_name,PARTNER_NAME,202101,Jan-21,9816,351,9817,226,71,43,14,1,0,0,95,29,18,6,0,0,0,226,71,43,14,1,0,0,95,29,18,6,0,0,0,19993,776,20769,9816,351,9817
\ No newline at end of file
diff --git a/spec/jobs/reports/irs_monthly_cred_metrics_report_spec.rb b/spec/jobs/reports/irs_monthly_cred_metrics_report_spec.rb
index 4693245deec..d5278626230 100644
--- a/spec/jobs/reports/irs_monthly_cred_metrics_report_spec.rb
+++ b/spec/jobs/reports/irs_monthly_cred_metrics_report_spec.rb
@@ -21,23 +21,30 @@
{
body: anything,
content_type: 'text/csv',
- bucket: 'reports-bucket.1234-us-west-1',
}
end
- let(:mock_daily_reports_emails) { ['mock_irs@example.com'] }
+ let(:mock_daily_reports_emails) { ['mock_partner@example.com'] }
+ let(:mock_issuers) { ['urn:gov:gsa:openidconnect.profiles:sp:sso:agency_name:partner_app_name'] }
+ let(:irs_partners) { ['PARTNER_NAME'] }
+ let(:fixture_csv_data) do
+ fixture_path = Rails.root.join('spec', 'fixtures', 'partner_cred_metrics_input.csv')
+ File.read(fixture_path)
+ end
before do
# App config/environment
allow(Identity::Hostdata).to receive(:env).and_return('int')
allow(Identity::Hostdata).to receive(:aws_account_id).and_return('1234')
allow(Identity::Hostdata).to receive(:aws_region).and_return('us-west-1')
- allow(IdentityConfig.store)
- .to receive(:s3_report_bucket_prefix)
- .and_return(s3_report_bucket_prefix)
- allow(IdentityConfig.store)
- .to receive(:irs_credentials_emails)
+ allow(IdentityConfig.store).to receive(:irs_credentials_emails)
.and_return(mock_daily_reports_emails)
+ allow(IdentityConfig.store).to receive(:irs_partner_strings)
+ .and_return(irs_partners)
+ allow(IdentityConfig.store).to receive(:irs_issuers)
+ .and_return(mock_issuers)
+ allow(IdentityConfig.store).to receive(:s3_report_bucket_prefix)
+ .and_return(s3_report_bucket_prefix)
# S3 stub
Aws.config[:s3] = {
@@ -45,17 +52,14 @@
put_object: {},
},
}
-
- allow(IdentityConfig.store).to receive(:irs_credentials_emails)
- .and_return(mock_daily_reports_emails)
end
- context 'the beginning of the month, it sends records for previous month' do
+ context 'for a report_date is the beginning of the month, it sends records for previous month' do
let(:report_date) { Date.new(2021, 3, 1).prev_day }
- it 'sends out a report to IRS' do
+ it 'sends out a report to PARTNER' do
expect(ReportMailer).to receive(:tables_report).once.with(
- email: ['mock_irs@example.com'],
+ email: ['mock_partner@example.com'],
subject: 'IRS Monthly Credential Metrics - 2021-02-28',
reports: anything,
message: report.preamble,
@@ -88,184 +92,97 @@
let(:env) { 'prod' }
subject(:preamble) { report.preamble(env:) }
- it 'is valid HTML' do
- expect(preamble).to be_html_safe
- expect { Nokogiri::XML(preamble) { |c| c.strict } }.not_to raise_error
+ context 'in a prod environment' do
+ it 'has a blank preamble' do
+ expect(preamble).to be_blank
+ end
end
context 'in a non-prod environment' do
let(:env) { 'staging' }
+ subject(:preamble) { report.preamble(env:) }
+
+ it 'is valid HTML' do
+ expect(preamble).to be_html_safe
+ expect { Nokogiri::XML(preamble) { |c| c.strict } }.not_to raise_error
+ end
+
it 'has an alert with the environment name' do
expect(preamble).to be_html_safe
doc = Nokogiri::XML(preamble)
+
alert = doc.at_css('.usa-alert')
expect(alert.text).to include(env)
end
end
+ end
- context 'with data generates reports by iaa + order number, issuer and year_month' do
- context 'with an IAA with a single issuer in April 2020' do
- let(:partner_account1) do
- create(
- :partner_account,
- id: 123,
- name: 'IRS',
- description: 'This is a description.',
- requesting_agency: 'IRS',
- )
- end
- let(:partner_account2) { create(:partner_account) }
- let(:service_provider1) { create(:service_provider) }
- let(:service_provider2) { create(:service_provider) }
- let(:iaa1_range) { DateTime.new(2020, 4, 15).utc..DateTime.new(2021, 4, 14).utc }
- let(:iaa2_range) { DateTime.new(2020, 9, 1).utc..DateTime.new(2021, 8, 30).utc }
-
- let(:integration3) do
- build_integration2(service_provider: service_provider1, partner_account: partner_account1)
- end
- let(:integration4) do
- build_integration2(service_provider: service_provider2, partner_account: partner_account2)
- end
-
- let(:gtc1) do
- create(
- :iaa_gtc,
- gtc_number: 'gtc1234',
- partner_account: partner_account1,
- start_date: iaa1_range.begin,
- end_date: iaa1_range.end,
- )
- end
-
- let(:gtc2) do
- create(
- :iaa_gtc,
- gtc_number: 'gtc5678',
- partner_account: partner_account2,
- start_date: iaa2_range.begin,
- end_date: iaa2_range.end,
- )
- end
-
- let(:iaa1) { 'iaa1' }
- let(:iaa2) { 'iaa2' }
- let(:iaa1_key) { "#{gtc2.gtc_number}-#{format('%04d', iaa_order2.order_number)}" }
- let(:iaa2_key) { "#{gtc2.gtc_number}-#{format('%04d', iaa_order2.order_number)}" }
-
- let(:iaa1_sp) do
- create(
- :service_provider,
- iaa: iaa1,
- iaa_start_date: iaa1_range.begin,
- iaa_end_date: iaa1_range.end,
- )
- end
-
- let(:iaa_order1) do
- build_iaa_order(order_number: 1, date_range: iaa1_range, iaa_gtc: gtc1)
- end
- let(:iaa_order2) do
- build_iaa_order(order_number: 2, date_range: iaa2_range, iaa_gtc: gtc2)
- end
-
- let(:inside_iaa1) { iaa1_range.begin + 1.day }
-
- let(:user1) { create(:user, profiles: [profile1]) }
- let(:profile1) { build(:profile, verified_at: DateTime.new(2018, 6, 1).utc) }
-
- let(:user2) { create(:user, profiles: [profile2]) }
- let(:profile2) { build(:profile, verified_at: DateTime.new(2018, 6, 1).utc) }
- let(:report_date) { inside_iaa1 }
- let(:csv) do
- travel_to report_date do
- report.perform(report_date)
- end
- end
-
- before do
- partner_account1.requesting_agency = 'IRS'
- partner_account2.requesting_agency = 'IRS'
- iaa_order1.integrations << build_integration(
- issuer: iaa1_sp.issuer,
- partner_account: partner_account1,
- )
- partner_account1.integrations << integration3
- partner_account2.integrations << integration4
- iaa_order1.integrations << integration3
- iaa_order1.save
- iaa_order2.save
-
- # 1 new unique user in month 1 at IAA 1 sp @ IAL 1
- 7.times do
- create_sp_return_log(
- user: user1,
- issuer: iaa1_sp.issuer,
- ial: 1,
- returned_at: inside_iaa1,
- )
- end
+ context 'with data generates report' do
+ let(:partner_account1) do
+ create(
+ :partner_account,
+ id: 123,
+ name: 'PARTNER_NAME',
+ description: 'This is a description.',
+ requesting_agency: 'PARTNER_NAME',
+ )
+ end
- # 2 new unique users in month 1 at IAA 1 sp @ IAL 2 with profile age 2
- # user1 is both IAL1 and IAL2
- [user1, user2].each do |user|
- create_sp_return_log(
- user: user,
- issuer: iaa1_sp.issuer,
- ial: 2,
- returned_at: inside_iaa1,
- )
- end
- end
+ let(:report_date) { Date.new(2021, 1, 31).in_time_zone('UTC').end_of_day }
- it 'checks authentication counts in ial1 + ial2 & checks partner single issuer cases' do
- parsed = CSV.parse(csv, headers: true)
- expect(parsed.length).to eq(1)
+ it 'checks authentication counts in ial1 + ial2 & checks partner single issuer cases' do
+ allow(report).to receive(:invoice_report_data).and_return(fixture_csv_data)
- row = parsed.first
+ result = report.perform(report_date)
+ data_column = result.map { |row| row[1] }
+ expect(result.transpose.length).to eq(2) # Two Columns: "Metrics" and "Values"
+ expect(result.length).to eq(6) # One Header Row + 6 Data Rows"
- expect(row['Credentials Authorized']).to eq('9')
- expect(row['New ID Verifications Authorized Credentials']).to eq('2')
- expect(row['Existing Identity Verification Credentials']).to eq('0')
- end
- end
+ # Test the processed data
+ expect(data_column[0]).to eq('Value') # Values
+ expect(data_column[1]).to eq(9817) # Monthly Active Users - iaa_unique_users
+ expect(data_column[2]).to eq(95) # New IAL Year 1 - partner_ial2_unique_user_events_year1
+ expect(data_column[3]).to eq(53) # New IAL Year 2 - partner_ial2_unique_user_events_year2345+
+ expect(data_column[4]).to eq(20769) # Total Auths - issuer_ial1_plus_2_total_auth_count
+ expect(data_column[5]).to eq(776) # IAL2 Auths - issuer_ial2_total_auth_count
end
+ end
- def build_iaa_order(order_number:, date_range:, iaa_gtc:)
- create(
- :iaa_order,
- order_number: order_number,
- start_date: date_range.begin,
- end_date: date_range.end,
- iaa_gtc: iaa_gtc,
- )
- end
+ def build_iaa_order(order_number:, date_range:, iaa_gtc:)
+ create(
+ :iaa_order,
+ order_number: order_number,
+ start_date: date_range.begin,
+ end_date: date_range.end,
+ iaa_gtc: iaa_gtc,
+ )
+ end
- def build_integration(issuer:, partner_account:)
- create(
- :integration,
- issuer: issuer,
- partner_account: partner_account,
- )
- end
+ def build_integration(issuer:, partner_account:)
+ create(
+ :integration,
+ issuer: issuer,
+ partner_account: partner_account,
+ )
+ end
- def build_integration2(service_provider:, partner_account:)
- create(
- :integration,
- service_provider: service_provider,
- partner_account: partner_account,
- )
- end
+ def build_integration2(service_provider:, partner_account:)
+ create(
+ :integration,
+ service_provider: service_provider,
+ partner_account: partner_account,
+ )
+ end
- def create_sp_return_log(user:, issuer:, ial:, returned_at:)
- create(
- :sp_return_log,
- user_id: user.id,
- issuer: issuer,
- ial: ial,
- returned_at: returned_at,
- profile_verified_at: user.profiles.map(&:verified_at).max,
- billable: true,
- )
- end
+ def create_sp_return_log(user:, issuer:, ial:, returned_at:)
+ create(
+ :sp_return_log,
+ user_id: user.id,
+ issuer: issuer,
+ ial: ial,
+ returned_at: returned_at,
+ profile_verified_at: user.profiles.map(&:verified_at).max,
+ billable: true,
+ )
end
end
diff --git a/spec/mailers/previews/report_mailer_preview.rb b/spec/mailers/previews/report_mailer_preview.rb
index 8bab8a7940e..54a48d83b0e 100644
--- a/spec/mailers/previews/report_mailer_preview.rb
+++ b/spec/mailers/previews/report_mailer_preview.rb
@@ -216,12 +216,7 @@ def irs_monthly_credentials_report
report = Reports::IrsMonthlyCredMetricsReport.new(report_date)
# Build emailable report
- emailable_report = report.as_emailable_irs_report(
- iaas: IaaReportingHelper.iaas,
- partner_accounts: IaaReportingHelper.partner_accounts,
- date: report_date,
- issuers: ['test-sp-1', 'test-sp-2'],
- )
+ emailable_report = report.as_emailable_irs_report(date: report_date)
ReportMailer.tables_report(
email: 'test@example.com',