fix an old bug: disallow duplicate linkAlias or product_code
[bse.git] / t / 130-importer / 020-article.t
1 #!perl -w
2 use strict;
3 use BSE::Test qw(base_url);
4 use File::Spec;
5 use File::Temp;
6
7 use Test::More tests => 42;
8
9 BEGIN {
10   unshift @INC, File::Spec->catdir(BSE::Test::base_dir(), "cgi-bin", "modules");
11 }
12
13 use BSE::Importer;
14 use BSE::API qw(bse_init bse_make_article);
15
16 my $base_cgi = File::Spec->catdir(BSE::Test::base_dir(), "cgi-bin");
17 ok(bse_init($base_cgi),   "initialize api")
18   or print "# failed to bse_init in $base_cgi\n";
19
20 my $when = time;
21
22 my $cfg = BSE::Cfg->new(path => $base_cgi, extra_text => <<CFG);
23 [import profile simple$when]
24 map_title=1
25 source=CSV
26 target=Article
27
28 [import profile simpleupdate$when]
29 map_linkAlias=1
30 map_body=2
31 map_file1_file=3
32 map_image1_file=4
33 source=CSV
34 target=Article
35 update_only=1
36 sep_char=\\t
37 file_path=t
38 ignore_missing=0
39
40 [import profile completefile$when]
41 map_linkAlias=1
42 map_file1_file=2
43 map_file1_name=3
44 map_file1_displayName=4
45 map_file1_storage=5
46 map_file1_description=6
47 map_file1_forSale=7
48 map_file1_download=8
49 map_file1_requireUser=9
50 map_file1_notes=10
51 map_file1_hide_from_list=11
52 skiplines=0
53 file_path=t
54 ignore_missing=0
55 update_only=1
56 source=CSV
57 target=Article
58
59 [import profile updatefile$when]
60 map_linkAlias=1
61 map_file1_name=2
62 map_file1_description=3
63 skiplines=0
64 file_path=t
65 ignore_missing=0
66 update_only=1
67 source=CSV
68 target=Article
69
70 [import profile updatefileb$when]
71 map_linkAlias=1
72 map_file1_name=2
73 map_file1_file=3
74 skiplines=0
75 file_path=t/data
76 ignore_missing=0
77 update_only=1
78 source=CSV
79 target=Article
80
81 [import profile newdup$when]
82 map_linkAlias=1
83 map_title=2
84 skiplines=0
85 source=CSV
86 target=Article
87
88 CFG
89
90 {
91   my @added;
92
93   my $imp = BSE::Importer->new(cfg => $cfg, profile => "simple$when", callback => sub { note @_ });
94   $imp->process("t/data/importer/article-simple.csv");
95   @added = sort { $a->title cmp $b->title } $imp->leaves;
96
97   is(@added, 2, "imported two articles");
98   is($added[0]->title, "test1", "check title of first import");
99   is($added[1]->title, "test2", "check title of second import");
100
101   END {
102     $_->remove($cfg) for @added;
103   }
104 }
105
106 {
107   my $testa = bse_make_article(cfg => $cfg, title => "test updates",
108                                linkAlias => "alias$when");
109
110   {
111     my $fh = File::Temp->new;
112     my $filename = $fh->filename;
113     print $fh <<EOS;
114 linkAlias\tbody\tfile1_file\timage1_file
115 "alias$when"\t"This is the body text with multiple lines
116
117 Yes, multiple lines with CSV!"\tt00smoke.t\tdata/t101.jpg
118 EOS
119     close $fh;
120     my $imp = BSE::Importer->new(cfg => $cfg, profile => "simpleupdate$when", callback => sub { note @_ });
121     $imp->process($filename);
122     my $testb = Articles->getByPkey($testa->id);
123     like($testb->body, qr/This is the body/, "check the body is updated");
124     my @images = $testb->images;
125     is(@images, 1, "have an image");
126     like($images[0]->image, qr/t101\.jpg/, "check file name");
127     is(-s $images[0]->full_filename, -s "t/data/t101.jpg",
128        "check size matches source");
129
130     my @files = $testb->files;
131     is(@files, 1, "should be 1 file");
132     is($files[0]->displayName, "t00smoke.t", "check display name");
133     is(-s $files[0]->full_filename, -s "t/t00smoke.t", "check size");
134   }
135
136  SKIP:
137   {
138     my $fh = File::Temp->new;
139     my $filename = $fh->filename;
140     print $fh <<EOS;
141 "alias$when",t00smoke.t,test,"A Test File.txt",local,"A test file from BSE",1,1,1,"Some Notes",1
142 EOS
143     close $fh;
144     my $imp = BSE::Importer->new(cfg => $cfg, profile => "completefile$when", callback => sub { note @_ });
145     $imp->process($filename);
146     my $testb = Articles->getByPkey($testa->id);
147
148     my ($file) = grep $_->name eq "test", $testb->files;
149     ok($file, "found the file with name 'test'")
150       or skip "File not found", 9;
151     is(-s $file->full_filename, -s "t/t00smoke.t", "check size");
152     is($file->displayName, "A Test File.txt", "displayName");
153     is($file->storage, "local", "storage");
154     is($file->description, "A test file from BSE", "description");
155     is($file->forSale, 1, "forSale");
156     is($file->download, 1, "download");
157     is($file->requireUser, 1, "requireUser");
158     is($file->notes, "Some Notes", "notes");
159     is($file->hide_from_list, 1, "hide_from_list");
160   }
161
162  SKIP:
163   {
164     my $fh = File::Temp->new;
165     my $filename = $fh->filename;
166     print $fh <<EOS;
167 "alias$when",test,"New description"
168 EOS
169     close $fh;
170     my $imp = BSE::Importer->new(cfg => $cfg, profile => "updatefile$when", callback => sub { note @_ });
171     $imp->process($filename);
172     my $testb = Articles->getByPkey($testa->id);
173
174     my ($file) = grep $_->name eq "test", $testb->files;
175     ok($file, "found the updated file with name 'test'")
176       or skip "File not found", 9;
177     is($file->description, "New description", "description");
178     # other fields should be unchanged
179     is(-s $file->full_filename, -s "t/t00smoke.t", "check size");
180     is($file->displayName, "A Test File.txt", "displayName");
181     is($file->storage, "local", "storage");
182     is($file->forSale, 1, "forSale");
183     is($file->download, 1, "download");
184     is($file->requireUser, 1, "requireUser");
185     is($file->notes, "Some Notes", "notes");
186     is($file->hide_from_list, 1, "hide_from_list");
187   }
188
189  SKIP:
190   {
191     my $fh = File::Temp->new;
192     my $filename = $fh->filename;
193     print $fh <<EOS;
194 "alias$when",test,t101.jpg
195 EOS
196     close $fh;
197     my $imp = BSE::Importer->new(cfg => $cfg, profile => "updatefileb$when", callback => sub { note @_ });
198     $imp->process($filename);
199     my $testb = Articles->getByPkey($testa->id);
200
201     my ($file) = grep $_->name eq "test", $testb->files;
202     ok($file, "found the updated file with name 'test'")
203       or skip "File not found", 9;
204     is(-s $file->full_filename, -s "t/data/t101.jpg", "check size");
205     is($file->displayName, "t101.jpg", "new displayName");
206     # other fields should be unchanged
207     is($file->storage, "local", "storage");
208     is($file->description, "New description", "description");
209     is($file->forSale, 1, "forSale");
210     is($file->download, 1, "download");
211     is($file->requireUser, 1, "requireUser");
212     is($file->notes, "Some Notes", "notes");
213     is($file->hide_from_list, 1, "hide_from_list");
214   }
215
216   { # fail to duplicate a link alias
217     my $fh = File::Temp->new;
218     my $filename = $fh->filename;
219     my $id = $testa->id;
220     print $fh <<EOS;
221 "alias$when",test,t101.jpg
222 EOS
223     close $fh;
224     my $imp = BSE::Importer->new(cfg => $cfg, profile => "newdup$when", callback => sub { note @_ });
225     $imp->process($filename);
226     is_deeply([ $imp->leaves ], [], "should be no updated articles");
227   }
228
229   END {
230     $testa->remove($cfg) if $testa;
231   }
232 }