// Copyright 2024 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:auto_submit/revert/revert_discord_message.dart';
import 'package:test/test.dart';

void main() {
  void checkExpectedOutput(
    String originalPrUrl,
    String originalPrDisplayText,
    String revertPrUrl,
    String revertPrDisplayText,
    String initiatingAuthor,
    String reasonForRevert,
    String realOutput,
  ) {
    final String expectedFormattedOutput = '''
Pull Request [$originalPrDisplayText](<$originalPrUrl>) has been reverted by $initiatingAuthor.
Please see the revert PR here: [$revertPrDisplayText](<$revertPrUrl>).
Reason for reverting: $reasonForRevert''';
    expect(expectedFormattedOutput, equals(realOutput));
  }

  test('generateMessage truncates content when necessary', () {
    const String originalPrUrl = 'https://example.com/pr/1';
    const String originalPrDisplayText = 'flutter/coconut#1234';
    const String revertPrUrl = 'https://example.com/pr/2';
    const String revertPrDisplayText = 'flutter/coconut#1235';
    const String initiatingAuthor = 'John Doe';
    const String reasonForRevert = '''Test failed very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     very long reason that will exceed the character limit
     ''';

    final RevertDiscordMessage message = RevertDiscordMessage.generateMessage(
      originalPrUrl,
      originalPrDisplayText,
      revertPrUrl,
      revertPrDisplayText,
      initiatingAuthor,
      reasonForRevert,
    );

    expect(message.content!.contains('...'), isTrue);
  });

  test('generateMessage does not truncate short content', () {
    const String originalPrUrl = 'https://example.com/pr/1';
    const String originalPrDisplayText = 'flutter/coconut#1234';
    const String revertPrUrl = 'https://example.com/pr/2';
    const String revertPrDisplayText = 'flutter/coconut#1235';
    const String initiatingAuthor = 'John Doe';
    const String reasonForRevert = 'Test failed';

    final RevertDiscordMessage message = RevertDiscordMessage.generateMessage(
      originalPrUrl,
      originalPrDisplayText,
      revertPrUrl,
      revertPrDisplayText,
      initiatingAuthor,
      reasonForRevert,
    );

    checkExpectedOutput(
      originalPrUrl,
      originalPrDisplayText,
      revertPrUrl,
      revertPrDisplayText,
      initiatingAuthor,
      reasonForRevert,
      message.content!,
    );
  });

  test('RevertDiscordMessage generates a RevertDiscordMessage', () {
    const String originalPrUrl = 'https://example.com/pr/1';
    const String originalPrDisplayText = 'flutter/coconut#1234';
    const String revertPrUrl = 'https://example.com/pr/2';
    const String revertPrDisplayText = 'flutter/coconut#1235';
    const String initiatingAuthor = 'John Doe';
    const String reasonForRevert = 'Test failed';

    final RevertDiscordMessage message = RevertDiscordMessage.generateMessage(
      originalPrUrl,
      originalPrDisplayText,
      revertPrUrl,
      revertPrDisplayText,
      initiatingAuthor,
      reasonForRevert,
    );

    checkExpectedOutput(
      originalPrUrl,
      originalPrDisplayText,
      revertPrUrl,
      revertPrDisplayText,
      initiatingAuthor,
      reasonForRevert,
      message.content!,
    );
  });
}
