update tests to skip when optional modules aren't available
[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 => 42;
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 CFG
94
95 {
96   my @added;
97
98   my $imp = BSE::Importer->new(cfg => $cfg, profile => "simple$when", callback => sub { note @_ });
99   $imp->process("t/data/importer/article-simple.csv");
100   @added = sort { $a->title cmp $b->title } $imp->leaves;
101
102   is(@added, 2, "imported two articles");
103   is($added[0]->title, "test1", "check title of first import");
104   is($added[1]->title, "test2", "check title of second import");
105
106   END {
107     $_->remove($cfg) for @added;
108   }
109 }
110
111 {
112   my $testa = bse_make_article(cfg => $cfg, title => "test updates",
113                                linkAlias => "alias$when");
114
115   {
116     my $fh = File::Temp->new;
117     my $filename = $fh->filename;
118     print $fh <<EOS;
119 linkAlias\tbody\tfile1_file\timage1_file
120 "alias$when"\t"This is the body text with multiple lines
121
122 Yes, multiple lines with CSV!"\tt00smoke.t\tdata/t101.jpg
123 EOS
124     close $fh;
125     my $imp = BSE::Importer->new(cfg => $cfg, profile => "simpleupdate$when", callback => sub { note @_ });
126     $imp->process($filename);
127     my $testb = Articles->getByPkey($testa->id);
128     like($testb->body, qr/This is the body/, "check the body is updated");
129     my @images = $testb->images;
130     is(@images, 1, "have an image");
131     like($images[0]->image, qr/t101\.jpg/, "check file name");
132     is(-s $images[0]->full_filename, -s "t/data/t101.jpg",
133        "check size matches source");
134
135     my @files = $testb->files;
136     is(@files, 1, "should be 1 file");
137     is($files[0]->displayName, "t00smoke.t", "check display name");
138     is(-s $files[0]->full_filename, -s "t/t00smoke.t", "check size");
139   }
140
141  SKIP:
142   {
143     my $fh = File::Temp->new;
144     my $filename = $fh->filename;
145     print $fh <<EOS;
146 "alias$when",t00smoke.t,test,"A Test File.txt",local,"A test file from BSE",1,1,1,"Some Notes",1
147 EOS
148     close $fh;
149     my $imp = BSE::Importer->new(cfg => $cfg, profile => "completefile$when", callback => sub { note @_ });
150     $imp->process($filename);
151     my $testb = Articles->getByPkey($testa->id);
152
153     my ($file) = grep $_->name eq "test", $testb->files;
154     ok($file, "found the file with name 'test'")
155       or skip "File not found", 9;
156     is(-s $file->full_filename, -s "t/t00smoke.t", "check size");
157     is($file->displayName, "A Test File.txt", "displayName");
158     is($file->storage, "local", "storage");
159     is($file->description, "A test file from BSE", "description");
160     is($file->forSale, 1, "forSale");
161     is($file->download, 1, "download");
162     is($file->requireUser, 1, "requireUser");
163     is($file->notes, "Some Notes", "notes");
164     is($file->hide_from_list, 1, "hide_from_list");
165   }
166
167  SKIP:
168   {
169     my $fh = File::Temp->new;
170     my $filename = $fh->filename;
171     print $fh <<EOS;
172 "alias$when",test,"New description"
173 EOS
174     close $fh;
175     my $imp = BSE::Importer->new(cfg => $cfg, profile => "updatefile$when", callback => sub { note @_ });
176     $imp->process($filename);
177     my $testb = Articles->getByPkey($testa->id);
178
179     my ($file) = grep $_->name eq "test", $testb->files;
180     ok($file, "found the updated file with name 'test'")
181       or skip "File not found", 9;
182     is($file->description, "New description", "description");
183     # other fields should be unchanged
184     is(-s $file->full_filename, -s "t/t00smoke.t", "check size");
185     is($file->displayName, "A Test File.txt", "displayName");
186     is($file->storage, "local", "storage");
187     is($file->forSale, 1, "forSale");
188     is($file->download, 1, "download");
189     is($file->requireUser, 1, "requireUser");
190     is($file->notes, "Some Notes", "notes");
191     is($file->hide_from_list, 1, "hide_from_list");
192   }
193
194  SKIP:
195   {
196     my $fh = File::Temp->new;
197     my $filename = $fh->filename;
198     print $fh <<EOS;
199 "alias$when",test,t101.jpg
200 EOS
201     close $fh;
202     my $imp = BSE::Importer->new(cfg => $cfg, profile => "updatefileb$when", callback => sub { note @_ });
203     $imp->process($filename);
204     my $testb = Articles->getByPkey($testa->id);
205
206     my ($file) = grep $_->name eq "test", $testb->files;
207     ok($file, "found the updated file with name 'test'")
208       or skip "File not found", 9;
209     is(-s $file->full_filename, -s "t/data/t101.jpg", "check size");
210     is($file->displayName, "t101.jpg", "new displayName");
211     # other fields should be unchanged
212     is($file->storage, "local", "storage");
213     is($file->description, "New description", "description");
214     is($file->forSale, 1, "forSale");
215     is($file->download, 1, "download");
216     is($file->requireUser, 1, "requireUser");
217     is($file->notes, "Some Notes", "notes");
218     is($file->hide_from_list, 1, "hide_from_list");
219   }
220
221   { # fail to duplicate a link alias
222     my $fh = File::Temp->new;
223     my $filename = $fh->filename;
224     my $id = $testa->id;
225     print $fh <<EOS;
226 "alias$when",test,t101.jpg
227 EOS
228     close $fh;
229     my $imp = BSE::Importer->new(cfg => $cfg, profile => "newdup$when", callback => sub { note @_ });
230     $imp->process($filename);
231     is_deeply([ $imp->leaves ], [], "should be no updated articles");
232   }
233
234   END {
235     $testa->remove($cfg) if $testa;
236   }
237 }