blob: d7c6e6f555611ae7d4fce91abf73a523567f0127 [file] [log] [blame]
// Copyright (c) 2014, 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 shelf.hijack_test;
import 'dart:async';
import 'package:unittest/unittest.dart';
import 'package:shelf/shelf.dart';
import 'test_util.dart';
void main() {
test('hijacking a non-hijackable request throws a StateError', () {
expect(() => new Request('GET', LOCALHOST_URI).hijack((_, __) => null),
throwsStateError);
});
test('hijacking a hijackable request throws a HijackException and calls '
'onHijack', () {
var request = new Request('GET', LOCALHOST_URI,
onHijack: expectAsync((callback) {
var streamController = new StreamController();
streamController.add([1, 2, 3]);
streamController.close();
var sinkController = new StreamController();
expect(sinkController.stream.first, completion(equals([4, 5, 6])));
callback(streamController.stream, sinkController);
}));
expect(() => request.hijack(expectAsync((stream, sink) {
expect(stream.first, completion(equals([1, 2, 3])));
sink.add([4, 5, 6]);
sink.close();
})), throwsA(new isInstanceOf<HijackException>()));
});
test('hijacking a hijackable request twice throws a StateError', () {
// Assert that the [onHijack] callback is only called once.
var request = new Request('GET', LOCALHOST_URI,
onHijack: expectAsync((_) => null, count: 1));
expect(() => request.hijack((_, __) => null),
throwsA(new isInstanceOf<HijackException>()));
expect(() => request.hijack((_, __) => null), throwsStateError);
});
group('calling change', () {
test('hijacking a non-hijackable request throws a StateError', () {
var request = new Request('GET', LOCALHOST_URI);
var newRequest = request.change();
expect(() => newRequest.hijack((_, __) => null), throwsStateError);
});
test('hijacking a hijackable request throws a HijackException and calls '
'onHijack', () {
var request = new Request('GET', LOCALHOST_URI,
onHijack: expectAsync((callback) {
var streamController = new StreamController();
streamController.add([1, 2, 3]);
streamController.close();
var sinkController = new StreamController();
expect(sinkController.stream.first, completion(equals([4, 5, 6])));
callback(streamController.stream, sinkController);
}));
var newRequest = request.change();
expect(() => newRequest.hijack(expectAsync((stream, sink) {
expect(stream.first, completion(equals([1, 2, 3])));
sink.add([4, 5, 6]);
sink.close();
})), throwsA(new isInstanceOf<HijackException>()));
});
test('hijacking the original request after calling change throws a '
'StateError', () {
// Assert that the [onHijack] callback is only called once.
var request = new Request('GET', LOCALHOST_URI,
onHijack: expectAsync((_) => null, count: 1));
var newRequest = request.change();
expect(() => newRequest.hijack((_, __) => null),
throwsA(new isInstanceOf<HijackException>()));
expect(() => request.hijack((_, __) => null), throwsStateError);
});
});
}