ddclient/t/protocol_ionos.pl
2024-12-19 05:09:05 -05:00

69 lines
2 KiB
Perl

use Test::More;
BEGIN { eval { require Test::Warnings; } or skip($@, 1); }
BEGIN { eval { require 'ddclient'; } or BAIL_OUT($@); }
BEGIN {
eval { require ddclient::t::HTTPD; 1; } or plan(skip_all => $@);
ddclient::t::HTTPD->import();
plan tests => 2;
}
{
package Logger;
use parent qw(-norequire ddclient::Logger);
sub new {
my ($class, $parent) = @_;
my $self = $class->SUPER::new(undef, $parent);
$self->{logs} = [];
return $self;
}
sub _log {
my ($self, $args) = @_;
push(@{$self->{logs}}, $args)
if ($args->{label} // '') =~ qr/^(?:WARNING|FATAL|SUCCESS|FAILED)$/;
return $self->SUPER::_log($args);
}
}
# Subtest for the protocol_ionos
subtest 'Testing protocol_ionos' => sub {
# Mock HTTP server
httpd()->run(sub {
my ($req) = @_;
diag('==============================================================================');
diag("Test server received request:\n" . $req->as_string());
return undef if $req->uri()->path() eq '/control';
return [400, $textplain, ['invalid method: ' . $req->method()]] if $req->method() ne 'GET';
return undef
});
local $ddclient::globals{debug} = 1;
local $ddclient::globals{verbose} = 1;
my $l = Logger->new($ddclient::_l);
local %ddclient::config = (
'host.my.example.com' => {
'protocol' => 'ionos',
'password' => 'mytestingpassword',
'server' => httpd()->endpoint(),
'wantipv4' => '1.2.3.4',
},
);
httpd()->reset([200, $textplain, []]);
{
local $ddclient::_l = $l;
ddclient::nic_ionos_update(undef, 'host.my.example.com');
}
my @requests = httpd()->reset();
is(scalar(@requests), 1, "Single update request");
my $req = shift(@requests);
is($req->uri()->path(), '/dns/v1/dyndns', "Correct request path");
is($req->uri()->query(), 'q=mytestingpassword', "Correct request query");
};
done_testing();