// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:http_parser/http_parser.dart';
import 'package:test/test.dart';

void main() {
  group("parse", () {
    _singleChallengeTests(
        (challenge) => new AuthenticationChallenge.parse(challenge));
  });

  group("parseHeader", () {
    group("with a single challenge", () {
      _singleChallengeTests((challenge) {
        var challenges = AuthenticationChallenge.parseHeader(challenge);
        expect(challenges, hasLength(1));
        return challenges.single;
      });
    });

    test("parses multiple challenges", () {
      var challenges = AuthenticationChallenge
          .parseHeader("scheme1 realm=fblthp, scheme2 realm=asdfg");
      expect(challenges, hasLength(2));
      expect(challenges.first.scheme, equals("scheme1"));
      expect(challenges.first.parameters, equals({"realm": "fblthp"}));
      expect(challenges.last.scheme, equals("scheme2"));
      expect(challenges.last.parameters, equals({"realm": "asdfg"}));
    });

    test("parses multiple challenges with multiple parameters", () {
      var challenges = AuthenticationChallenge.parseHeader(
          "scheme1 realm=fblthp, foo=bar, scheme2 realm=asdfg, baz=bang");
      expect(challenges, hasLength(2));

      expect(challenges.first.scheme, equals("scheme1"));
      expect(challenges.first.parameters,
          equals({"realm": "fblthp", "foo": "bar"}));

      expect(challenges.last.scheme, equals("scheme2"));
      expect(challenges.last.parameters,
          equals({"realm": "asdfg", "baz": "bang"}));
    });
  });
}

/// Tests to run for parsing a single challenge.
///
/// These are run on both [AuthenticationChallenge.parse] and
/// [AuthenticationChallenge.parseHeader], since they use almost entirely
/// separate code paths.
void _singleChallengeTests(
    AuthenticationChallenge parseChallenge(String challenge)) {
  test("parses a simple challenge", () {
    var challenge = parseChallenge("scheme realm=fblthp");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters, equals({"realm": "fblthp"}));
  });

  test("parses multiple parameters", () {
    var challenge = parseChallenge("scheme realm=fblthp, foo=bar, baz=qux");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters,
        equals({"realm": "fblthp", "foo": "bar", "baz": "qux"}));
  });

  test("parses quoted string parameters", () {
    var challenge = parseChallenge('scheme realm="fblthp, foo=bar", baz="qux"');
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters,
        equals({"realm": "fblthp, foo=bar", "baz": "qux"}));
  });

  test("normalizes the case of the scheme", () {
    var challenge = parseChallenge("ScHeMe realm=fblthp");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters, equals({"realm": "fblthp"}));
  });

  test("normalizes the case of the parameter name", () {
    var challenge = parseChallenge("scheme ReAlM=fblthp");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters, containsPair("realm", "fblthp"));
  });

  test("doesn't normalize the case of the parameter value", () {
    var challenge = parseChallenge("scheme realm=FbLtHp");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters, containsPair("realm", "FbLtHp"));
    expect(challenge.parameters, isNot(containsPair("realm", "fblthp")));
  });

  test("allows extra whitespace", () {
    var challenge = parseChallenge(
        "  scheme\t \trealm\t = \tfblthp\t, \tfoo\t\r\n =\tbar\t");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters, equals({"realm": "fblthp", "foo": "bar"}));
  });

  test("allows an empty parameter", () {
    var challenge = parseChallenge("scheme realm=fblthp, , foo=bar");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters, equals({"realm": "fblthp", "foo": "bar"}));
  });

  test("allows a leading comma", () {
    var challenge = parseChallenge("scheme , realm=fblthp, foo=bar,");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters, equals({"realm": "fblthp", "foo": "bar"}));
  });

  test("allows a trailing comma", () {
    var challenge = parseChallenge("scheme realm=fblthp, foo=bar, ,");
    expect(challenge.scheme, equals("scheme"));
    expect(challenge.parameters, equals({"realm": "fblthp", "foo": "bar"}));
  });

  test("disallows only a scheme", () {
    expect(() => parseChallenge("scheme"), throwsFormatException);
  });

  test("disallows a valueless parameter", () {
    expect(() => parseChallenge("scheme realm"), throwsFormatException);
    expect(() => parseChallenge("scheme realm="), throwsFormatException);
    expect(
        () => parseChallenge("scheme realm, foo=bar"), throwsFormatException);
  });

  test("requires a space after the scheme", () {
    expect(() => parseChallenge("scheme\trealm"), throwsFormatException);
    expect(() => parseChallenge("scheme\r\n\trealm="), throwsFormatException);
  });

  test("disallows junk after the parameters", () {
    expect(
        () => parseChallenge("scheme realm=fblthp foo"), throwsFormatException);
    expect(() => parseChallenge("scheme realm=fblthp, foo=bar baz"),
        throwsFormatException);
  });
}
