Convert-Pheno

 view release on metacpan or  search on metacpan

t/21-term-audit.t  view on Meta::CPAN

    cmp_ok( scalar @lines, '>', 1, 'gzipped terminology audit TSV contains at least one mapped row' );
}

{
    my $audit_file = temp_output_file( suffix => '.xlsx', dir => $tmpdir );
    my $convert = build_convert(
        in_file         => 't/csv2bff/in/csv_data.csv',
        mapping_file    => 't/csv2bff/in/csv_mapping.yaml',
        sep             => ',',
        out_file        => temp_output_file(),
        method          => 'csv2bff',
        term_audit_file => $audit_file,
    );

    my $data = $convert->csv2bff;
    ok( ref $data eq 'ARRAY' && @{$data}, 'csv2bff still returns data when XLSX terminology audit is enabled' );
    ok( -f $audit_file, 'XLSX terminology audit is written when requested' );

    my $workbook_xml = slurp_zip_member( $audit_file, 'xl/workbook.xml' );
    like( $workbook_xml, qr/name="Summary"/, 'XLSX audit contains a Summary sheet' );
    like( $workbook_xml, qr/name="Terminology Audit"/, 'XLSX audit contains a Terminology Audit sheet' );

    my $shared_strings = slurp_zip_member( $audit_file, 'xl/sharedStrings.xml' );
    like( $shared_strings, qr/decision_reason/, 'XLSX audit contains decision provenance columns' );
    like( $shared_strings, qr/review_action/, 'XLSX audit contains an explicit review recommendation' );
    like( $shared_strings, qr/Colors prioritize review/, 'XLSX summary explains how to interpret colors' );
    like( $shared_strings, qr/Technical audit columns are present but hidden/, 'XLSX summary explains its focused default view' );

    my $audit_sheet = slurp_zip_member( $audit_file, 'xl/worksheets/sheet2.xml' );
    like( $audit_sheet, qr/<pane\b/, 'XLSX audit freezes its header and source columns' );
    like( $audit_sheet, qr/<autoFilter\b/, 'XLSX audit enables filtering' );
    like( $audit_sheet, qr/<conditionalFormatting\b/, 'XLSX audit color-codes rows by review category' );
    like( $audit_sheet, qr/hidden="1"/, 'XLSX audit hides technical columns by default' );
}

{
    my $audit_file = temp_output_file( suffix => '.xlsx', dir => $tmpdir );
    my $writer = Convert::Pheno::Audit::Terminology->new(
        path   => $audit_file,
        config => {
            search                    => 'exact',
            text_similarity_method    => 'cosine',
            min_text_similarity_score => 0.8,
            levenshtein_weight        => 0.1,
        },
    );
    $writer->write_row(
        {
            row                    => 1,
            source_value           => '=1+1',
            match_status           => 'matched',
            decision_reason        => 'exact_match',
            lookup_resolution      => 'exact',
            retrieval_path         => 'exact_lookup',
            best_candidate_score   => 1,
        }
    );
    $writer->close;

    my $shared_strings = slurp_zip_member( $audit_file, 'xl/sharedStrings.xml' );
    like( $shared_strings, qr/=1\+1/, 'XLSX audit preserves formula-like source text as a string' );
    my $audit_sheet = slurp_zip_member( $audit_file, 'xl/worksheets/sheet2.xml' );
    unlike( $audit_sheet, qr/<f>/, 'XLSX audit does not create formulas from source values' );
}

throws_ok(
    sub {
        local *STDERR;
        open STDERR, '>', \my $stderr
          or die "Could not capture STDERR: $!";
        build_cli_request(
            argv => [
                '-icsv', 't/csv2bff/in/csv_data.csv',
                '--mapping-file', 't/csv2bff/in/csv_mapping.yaml',
                '-obff', 'individuals.json',
                '--search-audit-tsv', 'legacy.tsv',
            ],
            usage_error => sub { die @_ },
            schema_file => 'share/schema/mapping-v2.json',
            out_dir     => $tmpdir,
            color       => 1,
        );
    },
    qr/Invalid command-line arguments/,
    'the replaced --search-audit-tsv option is rejected'
);

throws_ok(
    sub {
        local *STDERR;
        open STDERR, '>', \my $stderr
          or die "Could not capture STDERR: $!";
        build_cli_request(
            argv => [
                '-icsv', 't/csv2bff/in/csv_data.csv',
                '--mapping-file', 't/csv2bff/in/csv_mapping.yaml',
                '-obff', 'individuals.json',
                '--term-audit-tsv', 'legacy.tsv',
            ],
            usage_error => sub { die @_ },
            schema_file => 'share/schema/mapping-v2.json',
            out_dir     => $tmpdir,
            color       => 1,
        );
    },
    qr/Invalid command-line arguments/,
    'the superseded --term-audit-tsv option is rejected'
);

{
    my $audit_file = temp_output_file( suffix => '.tsv', dir => $tmpdir );
    my $self = bless(
        {
            current_row               => 4,
            term_audit_file           => $audit_file,
            search                    => 'fuzzy',
            text_similarity_method    => 'cosine',
            min_text_similarity_score => 0.8,
            levenshtein_weight        => 0.1,
        },
        'Convert::Pheno'
    );
    record_term_audit(



( run in 1.297 second using v1.01-cache-2.11-cpan-364913b4093 )