the metadata fetcher
[bse.git] / t / 140-fetch / 010-fetcher.t
1 #!perl -w
2 use strict;
3 use BSE::Test ();
4 use BSE::Cfg;
5 use BSE::API qw(bse_init bse_cfg);
6 use BSE::Util::Fetcher;
7
8 use Test::More;
9
10 my $base_cgi = File::Spec->catdir(BSE::Test::base_dir(), "cgi-bin");
11 BSE::API::bse_init($base_cgi);
12 my $cfg = bse_cfg();
13
14 my $art = BSE::API::bse_make_article
15   (
16    cfg => $cfg,
17    title => "010-fetcher.t",
18   );
19
20 my $html = $cfg->entryVar("paths", "public_html");
21
22 my $base_cfg = <<EOS;
23 [basic]
24 access_control=1
25
26 [paths]
27 public_html=$html
28
29 EOS
30
31 note "article ". $art->id;
32
33 SKIP:
34 {
35   my $wcfg = BSE::Cfg->new_from_text(text => <<EOS);
36 $base_cfg
37
38 [automatic data]
39 data_test=test
40 EOS
41
42   my $url_meta = $art->add_meta
43     (
44      value => "http://test.develop-help.com/test.json",
45      name => "test_url",
46      content_type => "text/plain",
47     );
48   ok($url_meta, "add url metadata");
49
50   my $f = BSE::Util::Fetcher->new
51     (
52      cfg => $wcfg,
53      save => 1,
54      log => 0,
55      section => "automatic data",
56      articles => [ $art->id ],
57     );
58   ok($f->run(), "do the fetch")
59     or do { diag "@$_" for @{$f->errors}; skip "No data", 1 };
60
61   my $meta = $art->meta_by_name("test");
62   ok($meta, "data stored in meta")
63     or skip "no data stored", 1;
64   like($meta->value, qr/\A\[\s+5\s+\]\s+\z/, "check content")
65     or skip "wrong data stored", 1;
66   is($meta->content_type, "application/json",
67      "check content type");
68   my $data = $meta->retrieve_json;
69   ok($data, "decoded json")
70     or skip "No decoded data to look at", 1;
71   is($data->[0], 5, "check stored data");
72
73   $url_meta->remove;
74   $meta->remove;
75
76   $url_meta = $art->add_meta
77     (
78      value => "http://test.develop-help.com/test-not.json",
79      name => "test_url",
80      content_type => "text/plain",
81     );
82   ok($url_meta, "add invalid json metadata url");
83   ok(!$f->run(), "do the fetch");
84   $meta = $art->meta_by_name("test");
85   ok(!$meta, "should be no data");
86   my @msgs = map $_->[1], @{$f->{errors}};
87   ok(grep(/^Content failed JSON validation/, @msgs),
88      "check json validation failed");
89 }
90
91 SKIP:
92 {
93   my $badcfg = BSE::Cfg->new_from_text(text => <<EOS);
94 $base_cfg
95
96 [automatic data]
97 data_test=test*
98 url_test=other*
99 url_pattern_test=foo
100 types_test=(
101 validate_test=unknown
102 max_length_test=x
103 on_fail_test=foo
104 on_success_test=x
105 EOS
106
107   my $f = BSE::Util::Fetcher->new
108     (
109      cfg => $badcfg,
110      save => 1,
111      log => 0,
112      section => "automatic data",
113      articles => [ $art->id ],
114     );
115   ok(!$f->run(), "do the fetch (and fail)")
116     or skip "It didn't fail", 1;
117   my @errors = @{$f->errors};
118   my @msgs = map $_->[1], @errors;
119   ok(grep(/Invalid metadata name 'test\*'/, @msgs),
120      "Invalid name errored");
121   ok(grep(/Invalid metadata url 'other\*'/, @msgs),
122      "Invalid url errored");
123   ok(grep(/Invalid url pattern 'foo'/, @msgs),
124      "Invalid url_pattern errored");
125   ok(grep(/Cannot compile regexp \/\(\/ for/, @msgs),
126      "Invalid test re errored");
127   ok(grep(/Invalid validate 'unknown'/, @msgs),
128      "Invalid validate errored");
129   ok(grep(/Invalid max_length 'x'/, @msgs),
130      "Invalid max length errored");
131   ok(grep(/Invalid on_fail 'foo'/, @msgs),
132      "Invalid on_fail errored");
133   ok(grep(/Invalid on_success 'x'/, @msgs),
134      "Invalid on_success errored");
135 }
136
137 END {
138   $art->remove($cfg);
139 }
140
141 done_testing();