// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:convert' show utf8;

import 'package:cocoon_service/cocoon_service.dart';
import 'package:cocoon_service/src/request_handling/exceptions.dart';
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:test/test.dart';

import '../src/datastore/fake_config.dart';
import '../src/request_handling/request_handler_tester.dart';

void main() {
  group('StaticFileHandler', () {
    late RequestHandlerTester tester;
    late FileSystem fs;

    final FakeConfig config = FakeConfig();

    const String indexFileName = 'index.html';
    const String indexFileContent = 'some html';
    const String dartMapFileName = 'main.dart.js.map';

    setUp(() {
      tester = RequestHandlerTester();
      fs = MemoryFileSystem();
      fs.file('build/web/$indexFileName').createSync(recursive: true);
      fs.file('build/web/$indexFileName').writeAsStringSync(indexFileContent);
      fs.file('build/web/$dartMapFileName').writeAsStringSync('[{}]');
    });

    Future<String> decodeHandlerBody(Body body) {
      return utf8.decoder.bind(body.serialize() as Stream<List<int>>).first;
    }

    test('returns 404 response when file does not exist', () async {
      final StaticFileHandler staticFileHandler = StaticFileHandler('i do not exist as a file', config: config, fs: fs);

      expect(tester.get(staticFileHandler), throwsA(const TypeMatcher<NotFoundException>()));
    });

    test('returns body when file does exist', () async {
      final StaticFileHandler staticFileHandler = StaticFileHandler('/$indexFileName', config: config, fs: fs);

      final Body body = await tester.get(staticFileHandler);
      expect(body, isNotNull);
      final String response = await decodeHandlerBody(body);
      expect(response, indexFileContent);
    });

    test('DartMap file does not raise exception', () async {
      final StaticFileHandler staticFileHandler = StaticFileHandler('/$dartMapFileName', config: config, fs: fs);

      final Body body = await tester.get(staticFileHandler);
      expect(body, isNotNull);
      final String response = await decodeHandlerBody(body);
      expect(response, '[{}]');
    });

    test('No extension files default to plain text', () async {
      fs.file('build/web/NOTICE').writeAsStringSync('abc');
      final StaticFileHandler staticFileHandler = StaticFileHandler('/NOTICE', config: config, fs: fs);

      final Body body = await tester.get(staticFileHandler);
      expect(body, isNotNull);
      final String response = await decodeHandlerBody(body);
      expect(response, 'abc');
    });
  });
}
