// Copyright 2023 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 'package:cocoon_service/src/model/appengine/commit.dart';
import 'package:cocoon_service/src/service/datastore.dart';
import 'package:gcloud/db.dart';
import 'package:github/github.dart';
import 'package:test/test.dart';

import '../src/datastore/fake_config.dart';
import '../src/datastore/fake_datastore.dart';
import '../src/utilities/entity_generators.dart';

void main() {
  group('Commit.composeKey', () {
    test('creates valid key', () {
      final FakeDatastoreDB db = FakeDatastoreDB();
      final RepositorySlug slug = RepositorySlug('flutter', 'flutter');
      const String gitBranch = 'main';
      const String sha = 'abc';
      final key = Commit.createKey(db: db, slug: slug, gitBranch: gitBranch, sha: sha);
      expect(key.id, equals('flutter/flutter/main/abc'));
    });
  });

  group('Commit.fromDatastore', () {
    late FakeConfig config;
    late Commit expectedCommit;

    setUp(() {
      config = FakeConfig();
      expectedCommit = generateCommit(1);
      config.db.values[expectedCommit.key] = expectedCommit;
    });

    test('look up by id', () async {
      final Commit commit = await Commit.fromDatastore(
        datastore: DatastoreService(config.db, 5),
        key: expectedCommit.key,
      );
      expect(commit, expectedCommit);
    });

    test('look up by id fails if cannot be found', () async {
      final datastore = DatastoreService(config.db, 5);
      expect(
        Commit.fromDatastore(
          datastore: datastore,
          key: Commit.createKey(
            db: datastore.db,
            slug: RepositorySlug('abc', 'test'),
            gitBranch: 'main',
            sha: 'def',
          ),
        ),
        throwsA(isA<KeyNotFoundException>()),
      );
    });
  });
}
