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',