diff --git a/lib/widgets/markdown.dart b/lib/widgets/markdown.dart index c1467fba..ce06efa0 100644 --- a/lib/widgets/markdown.dart +++ b/lib/widgets/markdown.dart @@ -9,9 +9,12 @@ class CustomMarkdown extends StatelessWidget { super.key, required this.data, this.padding = const EdgeInsets.all(16.0), + this.onTapLink, }); + final String data; final EdgeInsets padding; + final void Function(String text, String? href, String title)? onTapLink; @override Widget build(BuildContext context) { @@ -25,9 +28,10 @@ class CustomMarkdown extends StatelessWidget { data: data, selectable: true, extensionSet: md.ExtensionSet.gitHubFlavored, - onTapLink: (text, href, title) { - launchUrl(Uri.parse(href ?? "")); - }, + onTapLink: onTapLink ?? + (text, href, title) { + launchUrl(Uri.parse(href ?? "")); + }, builders: { "inlineButton": InlineButton(), }, diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index 79cb579a..500dca15 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -1,16 +1,85 @@ import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:apidash/widgets/markdown.dart'; void main() { - testWidgets('Testing CustomMarkdown', (tester) async { - const markdown = CustomMarkdown(data: """Is a markdown ~`star on github`~ + group('CustomMarkdown Widget Tests', () { + testWidgets('Testing CustomMarkdown buttons and tags renders', + (tester) async { + const markdown = CustomMarkdown( + data: """Is a markdown ~`star on github`~ - #br - #br +#br +#br - ~`github repo`~ ~`Discord Server`~"""); - await tester.pumpWidget(markdown); - //expectTextStrings(tester.allWidgets, ['Data1']); - }, skip: true); +~`github repo`~ ~`Discord Server`~""", + ); + await tester.pumpWidget(const MaterialApp(home: markdown)); + + expect(find.byIcon(Icons.star), findsOneWidget); + expect(find.text("star on github"), findsOneWidget); + + expect(find.byIcon(Icons.discord), findsOneWidget); + expect(find.text("Discord Server"), findsOneWidget); + + expect(find.byIcon(Icons.code_rounded), findsOneWidget); + expect(find.text("github repo"), findsOneWidget); + + expect(find.text('#br'), findsNothing); + }); + + testWidgets('CustomMarkdown renders correctly', + (WidgetTester tester) async { + await tester.pumpWidget(const MaterialApp( + home: CustomMarkdown( + data: '# Hello World\nThis is some *markdown* text.', + ), + )); + + final headlineTextFinder = find.text('Hello World'); + final markdownTextFinder = find.text('This is some markdown text.'); + + expect(headlineTextFinder, findsOneWidget); + expect(markdownTextFinder, findsOneWidget); + }); + + testWidgets('CustomMarkdown has proper text rendered', + (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp( + home: GestureDetector( + child: const CustomMarkdown( + data: '[Link Text](https://apidash.dev/)', + ), + ), + )); + + await tester.tap(find.text('Link Text')); + await tester.pump(); + + expect(find.text('Link Text'), findsOneWidget); + + expect(find.text('https://apidash.dev/'), findsNothing); + }); + + testWidgets('CustomMarkdown creates hyperlink', + (WidgetTester tester) async { + bool linkTapped = false; + await tester.pumpWidget(MaterialApp( + home: CustomMarkdown( + data: '[Link Text](https://apidash.dev/)', + onTapLink: (text, href, title) { + linkTapped = true; + expect(text, 'Link Text'); + expect(href, 'https://apidash.dev/'); + }, + ), + )); + expect(find.byType(Markdown), findsOneWidget); + final markdownWidget = tester.widget(find.byType(Markdown)); + expect(markdownWidget.data, '[Link Text](https://apidash.dev/)'); + await tester.tap(find.text('Link Text')); + expect(linkTapped, true); + }); + }); }