App-CSVUtils

 view release on metacpan or  search on metacpan

t/01-basic.t  view on Meta::CPAN

    require App::CSVUtils::csv_delete_fields;

    $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_fields=>["f4"]);
    is($res->[0], 400, "deleting unknown field -> error");

    subtest "deleting unknown field with ignore_unknown_fields option -> ok" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_fields=>["f4"], ignore_unknown_fields=>1) };
        is($stdout, "f1,f2,f3\n1,2,3\n4,5,6\n7,8,9\n");
    };

    subtest "exclude_field_pat option" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_field_pat => qr/.*/, exclude_field_pat=>qr/3/) };
        is($stdout, "f3\n3\n6\n9\n");
    };

    subtest "exclude_fields option" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_field_pat => qr/.*/, exclude_fields=>['f3']) };
        is($stdout, "f3\n3\n6\n9\n");
    };

    subtest "show_selected_fields option" => sub {
        $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_field_pat => qr/.*/, exclude_fields=>['f3'], show_selected_fields=>1);
        is_deeply($res, [200, "OK", ["f1","f2"]]) or diag explain $res;
    };

    $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/2.csv", include_field_pat=>qr/.*/);
    is($res->[0], 412, "deleting last remaining field -> error (1)");

    $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/3.csv", include_fields=>["f2\n0", "f1"]);
    is($res->[0], 412, "deleting last remaining field -> error (2)");

    subtest "include_fields (1)" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_fields=>["f1"]) };
        is($stdout, "f2,f3\n2,3\n5,6\n8,9\n", "output");
    };

    subtest "include_fields (2)" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_fields=>["f3", "f1"]) };
        is($stdout, "f2\n2\n5\n8\n");
    };
};

subtest csv_list_field_names => sub {
    my ($res, $stdout);

    require App::CSVUtils::csv_list_field_names;

    $res = App::CSVUtils::csv_list_field_names::csv_list_field_names(input_filename=>"$dir/1.csv");
    is_deeply($res, [200,"OK",[{name=>'f1',index=>1},{name=>'f2',index=>2},{name=>'f3',index=>3}],{'table.fields'=>[qw/name index/]}], "result");
};

subtest csv_munge_field => sub {
    my ($res, $stdout);

    require App::CSVUtils::csv_munge_field;

    $res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f1", eval=>"blah +");
    is($res->[0], 400, "error in code -> error");

    $res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f4", eval=>'1');
    is($res->[0], 404, "munging unknown field -> error");

    $stdout = capture_stdout { $res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f3", eval=>'$_ = $_*3') };
    is($stdout, "f1,f2,f3\n1,2,9\n4,5,18\n7,8,27\n", "output");
};

subtest csv_munge_rows => sub {
    my ($res, $stdout);

    require App::CSVUtils::csv_munge_rows;

    $res = App::CSVUtils::csv_munge_rows::csv_munge_rows(input_filename=>"$dir/1.csv", eval=>"blah +");
    is($res->[0], 400, "error in code -> error");

    $stdout = capture_stdout { $res = App::CSVUtils::csv_munge_rows::csv_munge_rows(input_filename=>"$dir/1.csv", eval=>'$_->[2] *= 3') };
    is($stdout, "f1,f2,f3\n1,2,9\n4,5,18\n7,8,27\n", "output");

    $stdout = capture_stdout { $res = App::CSVUtils::csv_munge_rows::csv_munge_rows(input_filename=>"$dir/1.csv", hash=>1, eval=>'$_->{f3} *= 3; delete $_->{f1}; $_->{f4} = 1') };
    is($stdout, "f1,f2,f3\n,2,9\n,5,18\n,8,27\n", "output (with --hash, new fields ignored)");
};

subtest csv_replace_newline => sub {
    my ($res, $stdout);

    require App::CSVUtils::csv_replace_newline;
    $stdout = capture_stdout { $res = App::CSVUtils::csv_replace_newline::csv_replace_newline(input_filename=>"$dir/3.csv", with=>" ") };
    is($stdout, qq(f1,"f2 0"\n1,"row 1"\n2,"row 2"\n), "output");
    # XXX opt=with
};

subtest csv_sort_fields => sub {
    my ($res, $stdout);

    require App::CSVUtils::csv_sort_fields;

    subtest "alphabetical" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv") };
        is($stdout,qq(F3,f1,f2\n2,1,3\n5,4,6\n), "output");
    };
    subtest "reverse alphabetical" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", reverse=>1) };
        is($stdout,qq(f2,f1,F3\n3,1,2\n6,4,5\n), "output");
    };
    subtest "ci alphabetical" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", ci=>1) };
        is($stdout,qq(f1,f2,F3\n1,3,2\n4,6,5\n), "output");
    };
    subtest "by_examples" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", by_examples=>["f2","F3","f1"]) };
        is($stdout,qq(f2,F3,f1\n3,2,1\n6,5,4\n), "output");
    };
    subtest "reverse by_examples" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", by_examples=>["f2","F3","f1"], reverse=>1) };
        is($stdout,qq(f1,F3,f2\n1,2,3\n4,5,6\n), "output");
    };
    subtest "by_code" => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", by_code=>sub { lc($a->[0]) cmp lc($b->[0]) }) };
        is($stdout,qq(f1,f2,F3\n1,3,2\n4,6,5\n), "output") or diag explain $res;
    };
    subtest by_sortsub => sub {
        test_needs 'Sort::Sub', 'Sort::Sub::by_length';

t/01-basic.t  view on Meta::CPAN


        $stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"diff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"], result_fields=>"f2,f1") };
        is($stdout, "f2,f1\nv5,v4\n", "opt:result_fields");
    };

    subtest symdiff => sub {
        $stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"symdiff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"]) };
        is($stdout, "f1,f2,f3\nv4,v5,v6\nv4,V5,v7\n");

        $stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"symdiff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"], compare_fields=>"f1") };
        is($stdout, "", "opt:compare_fields");

        $stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"symdiff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"], compare_fields=>"f1,f2", ignore_case=>1) };
        is($stdout, "", "opt:ignore_case");

        $stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"symdiff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"], result_fields=>"f3,f1") };
        is($stdout, "f3,f1\nv6,v4\nv7,v4\n", "opt:result_fields");
    };
};

subtest csv_lookup_fields => sub {
    require App::CSVUtils::csv_lookup_fields;
    write_text("$dir/report.csv", <<'_');
client_id,followup_staff,followup_note,client_email,client_phone
101,Jerry,not renewing,
299,Jerry,still thinking over,
734,Elaine,renewing,
_

    write_text("$dir/clients.csv", <<'_');
id,name,email,client_phone
101,Andy,andy@example.com,555-2983
102,Bob,bob@acme.example.com,555-2523
299,Cindy,cindy@example.com,555-7892
400,Derek,derek@example.com,555-9018
701,Edward,edward@example.com,555-5833
734,Felipe,felipe@example.com,555-9067
_

    my ($res, $stdout);

    $stdout = capture_stdout { $res = App::CSVUtils::csv_lookup_fields::csv_lookup_fields(input_filenames=>["$dir/report.csv", "$dir/clients.csv"], lookup_fields=>"client_id:id", fill_fields=>"client_email:email,client_phone") };
    is($stdout, <<'_');
client_id,followup_staff,followup_note,client_email,client_phone
101,Jerry,"not renewing",andy@example.com,555-2983
299,Jerry,"still thinking over",cindy@example.com,555-7892
734,Elaine,renewing,felipe@example.com,555-9067
_

    # XXX test opt:ignore_case
};

subtest "csv_uniq" => sub {
    require App::CSVUtils::csv_uniq;

    my ($res, $stdout);

    write_text("$dir/uniq.csv", "f1,f2,f3\n1,2,a\n4,5,b\n4,7,B\n");

    $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["foo"]);
    is($res->[0], 404, "unknown field -> error") or diag explain $res;

    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f2"]) }), "", "no duplicate values in field f2");
    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1"]) }), "csv-uniq: Duplicate value '4'\n", "duplicate values in field f1 reported");
    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1","f3"]) }), "", "no duplicate values in fields f1+f3");
    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1","f3"], ignore_case=>1) }), "csv-uniq: Duplicate value '4|b'\n", "Duplicate values (ignore_case) in fields f1+f3");
    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f2"], unique=>1) }), "csv-uniq: Unique value '2'\ncsv-uniq: Unique value '5'\ncsv-uniq: Unique value '7'\n", "unique values reported");
};

subtest "csv_csv, opt: --inplace" => sub {
    require App::CSVUtils::csv_csv;

    App::CSVUtils::csv_csv::csv_csv(input_filename=>"$dir/4.csv", output_always_quote=>1, inplace=>1);
    is(read_text("$dir/4.csv"), qq("f1","F3","f2"\n"1","2","3"\n"4","5","6"\n));
    App::CSVUtils::csv_csv::csv_csv(input_filename=>"$dir/4.csv", output_always_quote=>0, inplace=>1, inplace_backup_ext=>"~");
    is(read_text("$dir/4.csv"), qq(f1,F3,f2\n1,2,3\n4,5,6\n));
    is(read_text("$dir/4.csv~"), qq("f1","F3","f2"\n"1","2","3"\n"4","5","6"\n));

    # TODO: test with util that reads multiple csv
    # TODO: test with util that writes multiple csv
};

subtest "csv_fill_cells" => sub {
    require App::CSVUtils::csv_fill_cells;

    my ($res, $stdout);

    # layout=left_to_right_then_top_to_bottom
    $stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3) };
    is($stdout, "field0,field1,field2\n1,2,3\n4,5,6\n7,8,9\n");

    # layout=left_to_right_then_bottom_to_top
    $stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
        input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"left_to_right_then_bottom_to_top") };
    is($stdout, "field0,field1,field2\n7,8,9\n4,5,6\n1,2,3\n");

    # layout=right_to_left_then_top_to_bottom
    $stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
        input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"right_to_left_then_top_to_bottom") };
    is($stdout, "field0,field1,field2\n3,2,1\n6,5,4\n9,8,7\n");

    # layout=right_to_left_then_bottom_to_top
    $stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
        input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"right_to_left_then_bottom_to_top") };
    is($stdout, "field0,field1,field2\n9,8,7\n6,5,4\n3,2,1\n");

    # layout=top_to_bottom_then_left_to_right
    $stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
        input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"top_to_bottom_then_left_to_right") };
    is($stdout, "field0,field1,field2\n1,4,7\n2,5,8\n3,6,9\n");

    # layout=top_to_bottom_then_right_to_left
    $stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
        input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"top_to_bottom_then_right_to_left") };
    is($stdout, "field0,field1,field2\n7,4,1\n8,5,2\n9,6,3\n");

    # layout=bottom_to_top_then_left_to_right
    $stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
        input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"bottom_to_top_then_left_to_right") };
    is($stdout, "field0,field1,field2\n3,6,9\n2,5,8\n1,4,7\n");



( run in 1.045 second using v1.01-cache-2.11-cpan-39bf76dae61 )