// 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:typed_data';

import 'package:cocoon_service/src/request_handlers/flush_cache.dart';
import 'package:cocoon_service/src/request_handling/exceptions.dart';
import 'package:cocoon_service/src/service/cache_service.dart';
import 'package:cocoon_service/src/service/config.dart';
import 'package:test/test.dart';

import '../src/datastore/fake_config.dart';
import '../src/request_handling/api_request_handler_tester.dart';
import '../src/request_handling/fake_authentication.dart';
import '../src/request_handling/fake_http.dart';

void main() {
  group('FlushCache', () {
    FakeConfig config;
    late ApiRequestHandlerTester tester;
    late FlushCache handler;
    late CacheService cache;

    setUp(() {
      tester = ApiRequestHandlerTester();
      cache = CacheService(inMemory: true);
      config = FakeConfig();
      handler = FlushCache(
        config: config,
        authenticationProvider: FakeAuthenticationProvider(),
        cache: cache,
      );
    });

    test('cache is empty when given an existing config key', () async {
      const String cacheKey = 'test';
      await cache.set(
        Config.configCacheName,
        cacheKey,
        Uint8List.fromList('123'.codeUnits),
      );

      tester.request = FakeHttpRequest(
        queryParametersValue: <String, String>{
          FlushCache.cacheKeyParam: cacheKey,
        },
      );
      await tester.get(handler);

      expect(await cache.getOrCreate(Config.configCacheName, cacheKey), null);
    });

    test('raises error if cache key not passed', () async {
      expect(tester.get(handler), throwsA(isA<BadRequestException>()));
    });

    test('raises error if cache key does not exist', () async {
      tester.request = FakeHttpRequest(
        queryParametersValue: <String, String>{
          FlushCache.cacheKeyParam: 'abc',
        },
      );
      expect(tester.get(handler), throwsA(isA<NotFoundException>()));
    });
  });
}
