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

import 'package:cocoon_service/src/model/common/json_converters.dart';
import 'package:cocoon_service/src/model/luci/buildbucket.dart';
import 'package:test/test.dart';

void main() {
  const String tagsJson = '['
      '{"key":"tag_a","value":"chrome/win32-builder-perf"},'
      '{"key":"tag_b","value":"true"},'
      '{"key":"tag_b","value":"9083774268329986752"}'
      ']';

  const Map<String, List<String>> tags = <String, List<String>>{
    'tag_a': <String>['chrome/win32-builder-perf'],
    'tag_b': <String>['true', '9083774268329986752'],
  };

  test('Deserializes tags', () {
    final List<dynamic>? decodedTags = json.decode(tagsJson) as List<dynamic>?;
    expect(const TagsConverter().fromJson(decodedTags), tags);
  });

  test('Serializes tags', () {
    final List<Map<String, String>> encodedTags =
        const TagsConverter().toJson(tags)!.cast<Map<String, String>>().toList();
    expect(encodedTags.length, 3);
    expect(json.encode(encodedTags), tagsJson);
  });

  test('Handles Build id correctly', () {
    final String id = 0xFFFFFFFFFFFFFFFF.toString(); // would overflow a 32 bit int
    final Build build = Build(id: id, builderId: const BuilderId());
    final Map<String, dynamic> buildJson = build.toJson();
    expect(buildJson['id'], id.toString());
    expect(buildJson['id'].runtimeType, String);

    final Build deserializedBuild = Build.fromJson(json.decode(json.encode(buildJson)) as Map<String, dynamic>);
    expect(deserializedBuild.id, id);

    final GetBuildRequest request = GetBuildRequest(id: id);
    final Map<String, dynamic> requestBuildJson = request.toJson();
    expect(requestBuildJson['id'], id.toString());
    expect(requestBuildJson['id'].runtimeType, String);

    final GetBuildRequest deserializedRequest = GetBuildRequest.fromJson(requestBuildJson);
    expect(deserializedRequest.id, id);
  });

  test('Handles fields correctly', () {
    GetBuildRequest request = const GetBuildRequest(id: '9083774268329986752');
    Map<String, dynamic> requestBuildJson = request.toJson();
    expect(requestBuildJson['id'], request.id.toString());
    request = const GetBuildRequest(id: '9083774268329986752', fields: 'summaryMarkDown');
    requestBuildJson = request.toJson();
    expect(requestBuildJson['id'], request.id.toString());
    expect(requestBuildJson['fields'], 'summaryMarkDown');
  });

  test('Creates a ScheduleBuildRequest', () {
    const ScheduleBuildRequest req = ScheduleBuildRequest(
      builderId: BuilderId(
        project: 'flutter',
        bucket: 'try',
        builder: 'fake_builder',
      ),
      properties: <String, String>{
        'git_url': 'https://github.com/flutter/flutter',
        'git_ref': 'refs/pull/63834/head',
      },
      dimensions: <RequestedDimension>[RequestedDimension(key: 'a', value: 'b', expiration: '120s')],
      priority: 100,
    );
    expect(
        json.encode(req.toJson()),
        '{"builder":{"project":"flutter","bucket":"try","builder":"fake_builder"},'
        '"properties":{"git_url":"https://github.com/flutter/flutter","git_ref":"refs/pull/63834/head"},'
        '"dimensions":[{"key":"a","value":"b","expiration":"120s"}],"priority":100}');
  });
}
