Bug 27631: circ folder
[koha.git] / t / db_dependent / Acquisition / FillWithDefaultValues.t
1 use Modern::Perl;
2 use Test::More tests => 12;
3 use Test::MockModule;
4
5 use MARC::Record;
6 use MARC::Field;
7
8 use C4::Context;
9 use C4::Acquisition qw( FillWithDefaultValues );
10 use Koha::Database;
11
12 my $schema = Koha::Database->new->schema;
13 $schema->storage->txn_begin;
14
15 my $biblio_module  = Test::MockModule->new('C4::Biblio');
16 my $default_author = 'default author';
17 my $default_x      = 'my default value';
18 $biblio_module->mock(
19     'GetMarcStructure',
20     sub {
21         {
22             # default for a control field
23             '008' => {
24                 x => { defaultvalue => $default_x },
25             },
26
27             # default value for an existing field
28             '245' => {
29                 c          => { defaultvalue => $default_author, mandatory => 1 },
30                 mandatory  => 0,
31                 repeatable => 0,
32                 tab        => 0,
33                 lib        => 'a lib',
34               },
35
36             # default for a nonexisting field
37             '099' => {
38                 x => { defaultvalue => $default_x },
39             },
40             '942' => {
41                 c => { defaultvalue => 'BK', mandatory => 1 },
42                 d => { defaultvalue => '942d_val' },
43                 f => { defaultvalue => '942f_val' },
44             },
45         };
46     }
47 );
48
49 my $record = MARC::Record->new;
50 $record->leader('03174nam a2200445 a 4500');
51 my @fields = (
52     MARC::Field->new(
53         '008', '1', ' ',
54         '@' => '120829t20132012nyu bk 001 0ceng',
55     ),
56     MARC::Field->new(
57         100, '1', ' ',
58         a => 'Knuth, Donald Ervin',
59         d => '1938',
60     ),
61     MARC::Field->new(
62         245, '1', '4',
63         a => 'The art of computer programming',
64         c => 'Donald E. Knuth.',
65     ),
66     MARC::Field->new(
67         245, '1', '4', a => 'my second title',
68     ),
69 );
70
71 $record->append_fields(@fields);
72
73 C4::Acquisition::FillWithDefaultValues($record);
74
75 my @fields_245 = $record->field(245);
76 is( scalar(@fields_245), 2, 'No new 245 field has been created' );
77 my @subfields_245_0 = $fields_245[0]->subfields;
78 my @subfields_245_1 = $fields_245[1]->subfields;
79 is_deeply(
80     \@subfields_245_0,
81     [ [ 'a', 'The art of computer programming' ], [ 'c', 'Donald E. Knuth.' ] ],
82     'first 245 field has not been updated'
83 );
84 is_deeply(
85     \@subfields_245_1,
86     [ [ 'a', 'my second title' ], [ 'c', $default_author ] ],
87     'second 245 field has a new subfield c with a default value'
88 );
89
90 my @fields_099 = $record->field('099');
91 is( scalar(@fields_099), 1, '1 new 099 field has been created' );
92 my @subfields_099 = $fields_099[0]->subfields;
93 is_deeply(
94     \@subfields_099,
95     [ [ 'x', $default_x ] ],
96     '099$x contains the default value'
97 );
98
99 # Test controlfield default
100 $record->field('008')->update( undef );
101 C4::Acquisition::FillWithDefaultValues($record);
102 is( $record->field('008')->data, $default_x, 'Controlfield got default' );
103
104 is( $record->subfield('942','d'), '942d_val', 'Check 942d' );
105
106 # Now test only_mandatory parameter
107 $record->delete_fields( $record->field('245') );
108 $record->delete_fields( $record->field('942') );
109 $record->append_fields( MARC::Field->new('942','','','f'=>'f val') );
110 # We deleted 245 and replaced 942. If we only apply mandatories, we should get
111 # back 245c again and 942c but not 942d. 942f should be left alone.
112 C4::Acquisition::FillWithDefaultValues($record, { only_mandatory => 1 });
113 @fields_245 = $record->field(245);
114 is( scalar @fields_245, 1, 'Only one 245 expected' );
115 is( $record->subfield('245','c'), $default_author, '245c restored' );
116 is( $record->subfield('942','c'), 'BK', '942c also restored' );
117 is( $record->subfield('942','d'), undef, '942d should not be there' );
118 is( $record->subfield('942','f'), 'f val', '942f untouched' );
119
120 $schema->storage->txn_rollback;