library shelf_static.alternative_root_test;

import 'dart:io';
import 'package:scheduled_test/descriptor.dart' as d;
import 'package:scheduled_test/scheduled_test.dart';

import 'package:shelf_static/shelf_static.dart';
import 'test_util.dart';

void main() {
  setUp(() {
    var tempDir;
    schedule(() {
      return Directory.systemTemp.createTemp('shelf_static-test-').then((dir) {
        tempDir = dir;
        d.defaultRoot = tempDir.path;
      });
    });

    d.file('root.txt', 'root txt').create();
    d.dir('files', [
        d.file('test.txt', 'test txt content'),
        d.file('with space.txt', 'with space content')
    ]).create();

    currentSchedule.onComplete.schedule(() {
      d.defaultRoot = null;
      return tempDir.delete(recursive: true);
    });
  });

  test('access root file', () {
    schedule(() {
      var handler = getHandler(d.defaultRoot);

      return makeRequest(handler, '/static/root.txt', scriptName: '/static')
          .then((response) {
        expect(response.statusCode, HttpStatus.OK);
        expect(response.headers[HttpHeaders.CONTENT_LENGTH], '8');
        expect(response.readAsString(), completion('root txt'));
      });
    });
  });

  test('access root file with space', () {
    schedule(() {
      var handler = getHandler(d.defaultRoot);

      return makeRequest(handler, '/static/files/with%20space.txt',
          scriptName: '/static').then((response) {
        expect(response.statusCode, HttpStatus.OK);
        expect(response.headers[HttpHeaders.CONTENT_LENGTH], '18');
        expect(response.readAsString(), completion('with space content'));
      });
    });
  });

  test('access root file with unencoded space', () {
    schedule(() {
      var handler = getHandler(d.defaultRoot);

      return makeRequest(handler, '/static/files/with space.txt',
          scriptName: '/static').then((response) {
        expect(response.statusCode, HttpStatus.FORBIDDEN);
      });
    });
  });

  test('access file under directory', () {
    schedule(() {
      var handler = getHandler(d.defaultRoot);

      return makeRequest(handler, '/static/files/test.txt',
          scriptName: '/static').then((response) {
        expect(response.statusCode, HttpStatus.OK);
        expect(response.headers[HttpHeaders.CONTENT_LENGTH], '16');
        expect(response.readAsString(), completion('test txt content'));
      });
    });
  });

  test('file not found', () {
    schedule(() {
      var handler = getHandler(d.defaultRoot);

      return makeRequest(handler, '/static/not_here.txt',
          scriptName: '/static').then((response) {
        expect(response.statusCode, HttpStatus.NOT_FOUND);
      });
    });
  });
}
