// Copyright (c) 2012, 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.

library FormDataTest;

import 'package:unittest/unittest.dart';
import 'dart:html';

void main() {
  // TODO(efortuna): This is a bad test. Revisit when we have tests that can run
  // both a server and fire up a browser.
  group('supported', () {
    test('supported', () {
      expect(FormData.supported, isTrue);
    });
  });

  group('functional', () {
    test('unsupported throws', () {
      var expectation = FormData.supported ? returnsNormally : throws;
      expect(() {
        new FormData();
      }, expectation);
    });

    var isFormData = predicate((x) => x is FormData, 'is a FormData');

    if (FormData.supported) {
      test('constructorTest1', () {
        var form = new FormData();
        expect(form, isNotNull);
        expect(form, isFormData);
      });

      test('constructorTest2', () {
        var form = new FormData(new FormElement());
        expect(form, isNotNull);
        expect(form, isFormData);
      });

      test('appendTest', () {
        var form = new FormData();
        form.append('test', '1');
        form.append('username', 'Elmo');
        form.append('address', '1 Sesame Street');
        form.append('password', '123456');
        expect(form, isNotNull);
      });

      test('appendBlob', () {
        var form = new FormData();
        var blob = new Blob(
            ['Indescribable... Indestructible! Nothing can stop it!'],
            'text/plain');
        form.appendBlob('theBlob', blob, 'theBlob.txt');
      });

      test('send', () {
        var form = new FormData();
        var blobString =
            'Indescribable... Indestructible! Nothing can stop it!';
        var blob = new Blob([blobString], 'text/plain');
        form.appendBlob('theBlob', blob, 'theBlob.txt');

        var xhr = new HttpRequest();
        xhr.open('POST',
            '${window.location.protocol}//${window.location.host}/echo');

        xhr.onLoad.listen(expectAsync((e) {
          expect(xhr.responseText, contains(blobString));
        }));
        xhr.onError.listen((e) {
          fail('$e');
        });
        xhr.send(form);
      });
    }
  });
}
