% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
%   http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.

-module(couch_mrview_http_tests).

-include_lib("couch/include/couch_eunit.hrl").
-include_lib("couch_mrview/include/couch_mrview.hrl").

mrview_http_test_() ->
    [
        ?_assertEqual(
            #mrargs{group_level = undefined, group = true},
            couch_mrview_http:parse_params(
                [{"group", "true"}],
                undefined,
                #mrargs{}
            )
        ),

        ?_assertEqual(
            #mrargs{group_level = 1, group = undefined},
            couch_mrview_http:parse_params(
                [{"group_level", "1"}],
                undefined,
                #mrargs{}
            )
        ),

        ?_assertEqual(
            #mrargs{start_key = 1, end_key = 1, group_level = undefined, group = undefined},
            couch_mrview_http:parse_params(
                [{"key", "1"}],
                undefined,
                #mrargs{}
            )
        ),

        ?_assertThrow(
            {query_parse_error, <<"`key(s)` is incompatible with `start_key` and `end_key`">>},
            couch_mrview_http:parse_params(
                [{"key", "1"}, {"start_key", "2"}],
                undefined,
                #mrargs{}
            )
        ),

        ?_assertThrow(
            {query_parse_error, <<"`key(s)` is incompatible with `start_key` and `end_key`">>},
            couch_mrview_http:parse_params(
                [{"end_key", "5"}, {"key", "1"}],
                undefined,
                #mrargs{}
            )
        ),

        ?_assertThrow(
            {query_parse_error, <<"`key(s)` is incompatible with `start_key` and `end_key`">>},
            couch_mrview_http:parse_params(
                [{"keys", "[1]"}, {"end_key", "5"}],
                undefined,
                #mrargs{}
            )
        ),

        ?_assertEqual(
            #mrargs{start_key = 1, end_key = 1, group_level = undefined},
            couch_mrview_http:parse_params(
                [{"keys", "[1]"}],
                undefined,
                #mrargs{}
            )
        ),

        ?_assertEqual(
            #mrargs{
                keys = [1, 2], start_key = undefined, end_key = undefined, group_level = undefined
            },
            couch_mrview_http:parse_params(
                [{"keys", "[1, 2]"}],
                undefined,
                #mrargs{}
            )
        )
    ].
