#!/usr/bin/env perl

use warnings;
use strict;

use Test::Exception;
use Test::More;

use GraphQL::Client::CLI;

subtest 'get_options' => sub {
    my $expected = {
        format          => 'json:pretty',
        help            => undef,
        manual          => undef,
        operation_name  => undef,
        outfile         => undef,
        query           => 'bar',
        transport       => undef,
        unpack          => 0,
        url             => 'foo',
        variables       => undef,
        version         => undef,
    };

    my $r = GraphQL::Client::CLI->_get_options(qw{--url foo --query bar});
    is_deeply($r, $expected, '--url and --query set options') or diag explain $r;

    $r = GraphQL::Client::CLI->_get_options(qw{foo --query bar});
    is_deeply($r, $expected, '--url is optional') or diag explain $r;

    $r = GraphQL::Client::CLI->_get_options(qw{foo bar});
    is_deeply($r, $expected, '--query is also optional') or diag explain $r;
};

subtest 'expand_vars' => sub {
    my $r = GraphQL::Client::CLI::_expand_vars({
        'foo.bar'       => 'baz',
        'foo.qux.muf'   => 42,
        'arr1[1].tut'   => 'whatever',
        'arr2[1][0].meh'=> 3.1415,
    });
    is_deeply($r, {
        foo => {
            bar => 'baz',
            qux => {
                muf => 42,
            },
        },
        arr1 => [
            undef,
            {
                tut => 'whatever',
            }
        ],
        arr2 => [
            undef,
            [
                {
                    meh => 3.1415,
                },
            ],
        ],
    }, 'expand all the vars') or diag explain $r;

    throws_ok {
        GraphQL::Client::CLI::_expand_vars({
            'foo[0]'    => 'baz',
            'foo.bar'   => 'muf',
        });
    } qr/^Conflicting keys/, 'throw if conflict between hash and array';

    throws_ok {
        GraphQL::Client::CLI::_expand_vars({
            'foo'       => 'baz',
            'foo.bar'   => 'muf',
        });
    } qr/^Conflicting keys/, 'throw if conflict between hash and scalar';
};

done_testing;
