File: 01-basic.t

package info (click to toggle)
libdata-censor-perl 0.04-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 108 kB
  • sloc: perl: 188; makefile: 2
file content (100 lines) | stat: -rw-r--r-- 2,720 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!perl -T
use 5.006;
use strict;
use warnings FATAL => 'all';
use Test::More;
use Data::Censor;

plan tests => 13;

diag( "Testing Data::Censor $Data::Censor::VERSION, Perl $], $^X" );

sub get_data {
    return {
        name => 'David Precious',
        email => 'davidp@preshweb.co.uk',
        password => 'supersecret',
        card => {
            pan => '4929000000006',
            cvv => '123',
            expiry => '03/16',
        },
    };
}

# Basic stuff.
my $censor = Data::Censor->new;

my $data = get_data();
my $count = $censor->censor($data);
my $hidden = 'Hidden (looks potentially sensitive)';
is($count, 3, "Two items censored with default config");
is($data->{password}, $hidden, 'password field censored');
is($data->{email}, 'davidp@preshweb.co.uk', 'email field not censored');
is($data->{card}{pan}, $hidden, 'pan field censored (recursion works)');
is($data->{card}{expiry}, '03/16', 'expiry field not censored');

# Test replacement callback
$censor = Data::Censor->new(
    replacement_callbacks => {
        pan => sub {
            my $pan = shift;
            return "x" x (length($pan) - 4) 
                . substr($pan, -4, 4);
        },
    },
);
$data = get_data();
$count = $censor->censor($data);
is($data->{password}, $hidden, "password censored normally");
is ($data->{card}{pan}, 'xxxxxxxxx0006', "pan censored by callback");

# Test basic clone_and_censor call
SKIP: {
    eval { require Clone };
    skip "Clone not installed", 4 if $@;
    # Test using clone_and_censor as a class method
    my $clone_and_censor = Data::Censor->clone_and_censor(get_data());
    is($clone_and_censor->{password}, $hidden,
        "clone_and_censor password censored (used as class method)");
    is($clone_and_censor->{email}, 'davidp@preshweb.co.uk',
        "clone_and_censor email not censored (used as class method)");

    # Test using clone_and_censor as an object method
    my $censor = Data::Censor->new( replacement => 'FOO' );
    $clone_and_censor = $censor->clone_and_censor(get_data());
    is ($clone_and_censor->{password}, 'FOO',
        "clone_and_censor password censored (used as object method)");
    is ($clone_and_censor->{email}, 'davidp@preshweb.co.uk',
        "clone_and_censor email not censored (used as object method)");
}

subtest 'objects as hashes' => sub {
	my $data = bless {
		password => 'hush',
	} => 'MyThing';

	$censor->censor($data);

	isnt $data->{password} => 'hush', 'can process object instances';
};


subtest 'recursive' => sub {
	my $data = {
		foo => 1,
	};

	my $y = {
		bar => 2,
		password => 'hush',
		data => $data,
	};

	$data->{y} = $y; 

	$censor->censor($data);

	isnt $data->{y}{password} => 'hush', 'password is hidden';
};