blob: 42dc5d9a55f33c2bce899ea577a6da88282ac55f [file] [log] [blame]
# 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;