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