The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package main;

use 5.006002;

use strict;
use warnings;

use Astro::SpaceTrack;
use Test::More 0.88;	# Because of done_testing();

use lib qw{ inc };
use My::Module::Test qw{ spacetrack_skip_no_prompt };

spacetrack_skip_no_prompt();

my $st = Astro::SpaceTrack->new(
    pretty	=> 1,
    space_track_version	=> 2,
);

my $base_url = $st->_make_space_track_base_url();

note <<'EOD';
The purpose of this test is to demonstrate that ranges work in the Space
Track REST interface.
EOD

{
    # Iridiums, per T. S. Kelso
    my @oids = qw{
	24792-24796 24836 24837 24839-24842 24869-24873 24903-24907
	24925 24926 24944-24946 24948-24950 24965-24969 25039-25043
	25077 25078 25104-25106 25108 25169-25173 25262 25263
	25272-25276 25285-25291 25319 25320 25342-25346 25431 25432
	25467-25469 25471 25527 25528 25530 25531 25577 25578 25777
	25778 27372-27376 27450 27451
    };
    local $ENV{SPACETRACK_REST_RANGE_OPERATOR} = 1;

    $st->set( dump_headers => 6 );

    my $rslt = $st->retrieve( @oids );

    # Method _get_json_object() is unsupported and undocumented.
    my $json = $st->_get_json_object();

    {
	my $data = $json->decode( $rslt->content() );

	is_deeply $data, [
	   {
	      "args" => [
		 "basicspacedata",
		 "query",
		 "class",
		 "tle_latest",
		 "format",
		 "tle",
		 "orderby",
		 "OBJECT_NUMBER asc",
		 "OBJECT_NUMBER",
		 "24792--24796,24836,24837,24839--24842,24869--24873,24903--24907,24925,24926,24944--24946,24948--24950,24965--24969,25039--25043,25077,25078,25104--25106,25108,25169--25173,25262,25263,25272--25276,25285--25291,25319,25320,25342--25346,25431,25432,25467--25469,25471,25527,25528,25530,25531,25577,25578,25777,25778,27372--27376,27450,27451",
		 "ORDINAL",
		 1
	      ],
	      "method" => "GET",
	      "url" => "$base_url/basicspacedata/query/class/tle_latest/format/tle/orderby/OBJECT_NUMBER%20asc/OBJECT_NUMBER/24792--24796,24836,24837,24839--24842,24869--24873,24903--24907,24925,24926,24944--24946,24948--24950,24965--24969,25039--25043,25077,25078,25104--25106,25108,25169--25173,25262,25263,25272--25276,25285--25291,25319,25320,25342--25346,25431,25432,25467--25469,25471,25527,25528,25530,25531,25577,25578,25777,25778,27372--27376,27450,27451/ORDINAL/1",
	      "version" => 2,
	   },
	], 'Generated correct query';
    }

    $st->set( dump_headers => 0 );

    $rslt = $st->retrieve( { json => 1 }, @oids );

    ok $rslt->is_success(), "Retrieve OIDs"
	or diag $rslt->status_line();

    if ( $rslt->is_success() ) {
	my $data = $json->decode( $rslt->content() );
	# Method _expand_oid_list() is unsupported and undocumented.
	my @expect = $st->_expand_oid_list( @oids );

	cmp_ok scalar @{ $data }, '==', scalar @expect,
	'Got expected number of OIDs';

	my %got;
	foreach ( map { $_->{OBJECT_NUMBER} } @{ $data } ) {
	    $got{$_}++;
	}

	foreach my $oid ( @expect ) {
	    cmp_ok $got{$oid}, '==', 1, "Got exactly one of OID $oid";
	    delete $got{$oid};
	}

	my $extra = join ', ', sort { $a <=> $b } keys %got;

	ok !%got, 'No OIDs other than the ones expected'
	    or diag "Extra OIDs: $extra";

    }
}

done_testing;

1;

# ex: set textwidth=72 :