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