| # Run against an isolated example-model server: DEREKOVECS_TEST_URL=http://... prove ... |
| use strict; |
| use warnings; |
| use utf8; |
| use Test::More; |
| use Mojo::UserAgent; |
| plan skip_all => 'Set DEREKOVECS_TEST_URL to an isolated example-model server' unless $ENV{DEREKOVECS_TEST_URL}; |
| my $url = $ENV{DEREKOVECS_TEST_URL}; |
| my $ua = Mojo::UserAgent->new; |
| my $presets = $ua->get("$url/semanticDimensions")->result; |
| is($presets->code,200,'load presets'); |
| ok(@{$presets->json->{Valenz}} > 500,'largest supplied preset is intact'); |
| my $all = $presets->json; |
| for my $name (sort keys %$all) { |
| my $r=$ua->post("$url/semanticDimensions" => json => [{name=>$name,pairs=>$all->{$name}}])->result; |
| is($r->code,200,"preset $name accepted"); |
| my $d=$r->json->{models}[0][0]; |
| is(@{$d->{used}}+@{$d->{skipped}},scalar @{$all->{$name}},'every pair is accounted for'); |
| } |
| my $input=[{name=>'Gender',pairs=>[['Mann','Frau'],['Männer','Frauen'],['does-not-exist','Frau']]}]; |
| my $r=$ua->post("$url/semanticDimensions" => json => $input)->result; |
| is($r->code,200,'custom pairs'); |
| my $d=$r->json->{models}[0][0]; |
| is(scalar @{$d->{vector}},200,'model vector size'); |
| ok(grep($_->[0] eq 'Männer',@{$d->{used}}),'Unicode vocabulary lookup'); |
| is_deeply($d->{skipped},[['does-not-exist','Frau']],'missing word excludes pair'); |
| my $sum=0; $sum += $_*$_ for @{$d->{vector}}; |
| cmp_ok(abs($sum-1),'<',1e-9,'unit dimension'); |
| my $neighbors=$ua->get("$url/?word=Mann&n=4&json=1")->result->json->{list}[0]; |
| my $man=(grep {$_->{word} eq 'Mann'} @$neighbors)[0]; |
| my $woman=$ua->get("$url/?word=Frau&n=4&json=1")->result->json->{list}[0][0]; |
| my $single=$ua->post("$url/semanticDimensions" => json => [{name=>'literal',pairs=>[['Mann','Frau']]}])->result->json->{models}[0][0]{vector}; |
| my @delta=map {$man->{vector}[$_]-$woman->{vector}[$_]} 0..$#$single; |
| my $norm=0; $norm += $_*$_ for @delta; $norm=sqrt($norm); |
| my $error=0; $error+=abs($single->[$_]-$delta[$_]/$norm) for 0..$#$single; |
| cmp_ok($error,'<',1e-8,'dimension agrees with independently retrieved neighbor vectors'); |
| for my $invalid ([],{},[{name=>'bad',pairs=>[['a']]}]) { |
| is($ua->post("$url/semanticDimensions" => json => $invalid)->result->code,400,'invalid input rejected'); |
| } |
| is($ua->post("$url/derekovecs/semanticDimensions" => json => $input)->result->code,200,'reverse proxy prefix route'); |
| my $page=$ua->get("$url/?word=Arzt&n=5" => {'Accept-Language'=>'de'})->result; |
| is($page->code,200,'search still renders'); |
| like($page->body,qr/Semantische Dimensionen/,'localized tab'); |
| done_testing; |