diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 721b55e6..04873dba 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -16,4 +16,3 @@ _We encourage you to add relevant test cases._ - [ ] Yes - [ ] No, and this is why: _please replace this line with details on why tests have not been included_ -- [ ] I need help with writing tests diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 58fd388d..46a9b053 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -128,3 +128,23 @@ flutter test test/widgets/codegen_previewer_test.dart ### How to add a new package to pubspec.yaml? Instead of copy pasting from pub.dev, it is recommended that you use `flutter pub add package_name` to add a new package to `pubspec.yaml`. You can read more [here](https://docs.flutter.dev/packages-and-plugins/using-packages#adding-a-package-dependency-to-an-app-using-flutter-pub-add). + +## Troubleshooting Common Issues + +### Network Connection Issues on macOS + +If you encounter a network connection error similar to the following while running your Flutter app on macOS: + +``` +ClientException with SocketException: Connection failed (OS Error: Operation not permitted, errno = 1) +``` +Add below key to `macos/Runner/DebugProfile.entitlements` and `macos/Runner/Release.entitlements`. + +``` + com.apple.security.network.client + +``` + +You can read more [here](https://docs.flutter.dev/platform-integration/macos/building#setting-up-entitlements) + + diff --git a/README.md b/README.md index 15dc46e1..d8b258e5 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ Here is the complete list of mimetypes that can be directly previewed in API Das | File Type | Mimetype | Extension | Comment | | --------- | -------------------------- | ----------------- | -------- | | PDF | `application/pdf` | `.pdf` | | +| CSV | `text/csv` | `.csv` | Can be improved | | Image | `image/apng` | `.apng` | Animated | | Image | `image/avif` | `.avif` | | | Image | `image/bmp` | `.bmp` | | @@ -177,14 +178,14 @@ Here is the complete list of mimetypes that are syntax highlighted in API Dash: | ------------------ | --------- | ------------------------------------------------------------------------------------------------------------------ | | `application/json` | `.json` | Other mimetypes like `application/geo+json`, `application/vcard+json` that are based on `json` are also supported. | | `application/xml` | `.xml` | Other mimetypes like `application/xhtml+xml`, `application/vcard+xml` that are based on `xml` are also supported. | -| `text/xml` | `.xml` | | -| `application/yaml` | `.yaml` | Others - `application/x-yaml` or `application/x-yml` | -| `text/yaml` | `.yaml` | Others - `text/yml` | -| `application/sql` | `.sql` | | -| `text/css` | `.css` | | -| `text/html` | `.html` | Only syntax highlighting, no web preview. | -| `text/javascript` | `.js` | | -| `text/markdown` | `.md` | | +| `text/xml` | `.xml` | | +| `application/yaml` | `.yaml` | Others - `application/x-yaml` or `application/x-yml` | +| `text/yaml` | `.yaml` | Others - `text/yml` | +| `application/sql` | `.sql` | | +| `text/css` | `.css` | | +| `text/html` | `.html` | Only syntax highlighting, no web preview. | +| `text/javascript` | `.js` | | +| `text/markdown` | `.md` | | ## What's new in v0.3.0? diff --git a/analysis_options.yaml b/analysis_options.yaml index 1d5eafa4..9a1eabb4 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -3,8 +3,9 @@ include: package:flutter_lints/flutter.yaml analyzer: errors: invalid_annotation_target: ignore - enable-experiment: - - records + exclude: + - "**/*.freezed.dart" + - "**/*.g.dart" linter: rules: diff --git a/lib/consts.dart b/lib/consts.dart index 90096f83..d7c2689c 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -378,6 +378,7 @@ const Map>> kSubTypeDefaultViewOptions: kRawBodyViewOptions, kSubTypeCss: kCodeRawBodyViewOptions, kSubTypeHtml: kCodeRawBodyViewOptions, + kSubTypeCsv: kPreviewRawBodyViewOptions, kSubTypeJavascript: kCodeRawBodyViewOptions, kSubTypeMarkdown: kCodeRawBodyViewOptions, kSubTypeTextXml: kCodeRawBodyViewOptions, @@ -495,7 +496,11 @@ const kAudioError = const kRaiseIssue = "\nPlease raise an issue in API Dash GitHub repo so that we can resolve it."; -const kHintTextUrlCard = "Enter API endpoint like api.foss42.com/country/codes"; +const kCsvError = + "There seems to be an issue rendering this CSV. Please raise an issue in API Dash GitHub repo so that we can resolve it."; + +const kHintTextUrlCard = + "Enter API endpoint like api.apidash.dev/country/codes"; const kLabelPlusNew = "+ New"; const kLabelSend = "Send"; const kLabelSending = "Sending.."; diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index 9154e428..a8d3569a 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -29,6 +29,7 @@ class RequestModel { this.responseStatus, this.message, this.responseModel, + this.isWorking = false, }); final String id; @@ -47,6 +48,7 @@ class RequestModel { final int? responseStatus; final String? message; final ResponseModel? responseModel; + final bool isWorking; List? get enabledRequestHeaders => getEnabledRows(requestHeaders, isHeaderEnabledList); @@ -106,6 +108,7 @@ class RequestModel { int? responseStatus, String? message, ResponseModel? responseModel, + bool? isWorking, }) { var headers = requestHeaders ?? this.requestHeaders; var params = requestParams ?? this.requestParams; @@ -129,6 +132,7 @@ class RequestModel { responseStatus: responseStatus ?? this.responseStatus, message: message ?? this.message, responseModel: responseModel ?? this.responseModel, + isWorking: isWorking ?? this.isWorking, ); } diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 0432b0e4..a1afa070 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -156,11 +156,20 @@ class CollectionStateNotifier } Future sendRequest(String id) async { - ref.read(sentRequestIdStateProvider.notifier).state = id; ref.read(codePaneVisibleStateProvider.notifier).state = false; - final defaultUriScheme = - ref.read(settingsProvider.select((value) => value.defaultUriScheme)); + final defaultUriScheme = ref.read( + settingsProvider.select( + (value) => value.defaultUriScheme, + ), + ); + RequestModel requestModel = state![id]!; + + // set current model's isWorking to true and update state + var map = {...state!}; + map[id] = requestModel.copyWith(isWorking: true); + state = map; + (http.Response?, Duration?, String?)? responseRec = await request( requestModel, defaultUriScheme: defaultUriScheme, @@ -172,6 +181,7 @@ class CollectionStateNotifier newRequestModel = requestModel.copyWith( responseStatus: -1, message: responseRec.$3, + isWorking: false, ); } else { final responseModel = baseResponseModel.fromResponse( @@ -183,10 +193,12 @@ class CollectionStateNotifier responseStatus: statusCode, message: kResponseCodeReasons[statusCode], responseModel: responseModel, + isWorking: false, ); } - ref.read(sentRequestIdStateProvider.notifier).state = null; - var map = {...state!}; + + // update state with response data + map = {...state!}; map[id] = newRequestModel; state = map; } diff --git a/lib/providers/ui_providers.dart b/lib/providers/ui_providers.dart index ef576974..2fddb2ad 100644 --- a/lib/providers/ui_providers.dart +++ b/lib/providers/ui_providers.dart @@ -3,7 +3,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; final navRailIndexStateProvider = StateProvider((ref) => 0); final selectedIdEditStateProvider = StateProvider((ref) => null); -final sentRequestIdStateProvider = StateProvider((ref) => null); final codePaneVisibleStateProvider = StateProvider((ref) => false); final saveDataStateProvider = StateProvider((ref) => false); final clearDataStateProvider = StateProvider((ref) => false); diff --git a/lib/screens/home_page/editor_pane/details_card/response_pane.dart b/lib/screens/home_page/editor_pane/details_card/response_pane.dart index e7fc9f09..548d17a8 100644 --- a/lib/screens/home_page/editor_pane/details_card/response_pane.dart +++ b/lib/screens/home_page/editor_pane/details_card/response_pane.dart @@ -9,13 +9,14 @@ class ResponsePane extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final selectedId = ref.watch(selectedIdStateProvider); - final sentRequestId = ref.watch(sentRequestIdStateProvider); + final isWorking = ref.watch( + selectedRequestModelProvider.select((value) => value?.isWorking)) ?? + false; final responseStatus = ref.watch( selectedRequestModelProvider.select((value) => value?.responseStatus)); final message = ref .watch(selectedRequestModelProvider.select((value) => value?.message)); - if (sentRequestId != null && sentRequestId == selectedId) { + if (isWorking) { return const SendingWidget(); } if (responseStatus == null) { diff --git a/lib/screens/home_page/editor_pane/editor_request.dart b/lib/screens/home_page/editor_pane/editor_request.dart index ce567483..90a60349 100644 --- a/lib/screens/home_page/editor_pane/editor_request.dart +++ b/lib/screens/home_page/editor_pane/editor_request.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:apidash/providers/collection_providers.dart'; import 'package:apidash/consts.dart'; import 'details_card/details_card.dart'; import 'url_card.dart'; @@ -10,6 +12,7 @@ class RequestEditor extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ + RequestEditorTopBar(), EditorPaneRequestURLCard(), kVSpacer10, Expanded( @@ -19,3 +22,91 @@ class RequestEditor extends StatelessWidget { ); } } + +class RequestEditorTopBar extends ConsumerWidget { + const RequestEditorTopBar({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final id = ref.watch(selectedIdStateProvider); + final name = + ref.watch(selectedRequestModelProvider.select((value) => value?.name)); + return Padding( + padding: const EdgeInsets.only( + left: 12.0, + top: 4.0, + right: 8.0, + bottom: 4.0, + ), + child: Row( + children: [ + Expanded( + child: Text( + name ?? "", + style: Theme.of(context).textTheme.bodyMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + const SizedBox( + width: 6, + ), + SizedBox( + width: 90, + height: 24, + child: FilledButton.tonalIcon( + style: const ButtonStyle( + padding: MaterialStatePropertyAll(EdgeInsets.zero), + ), + onPressed: () { + showDialog( + context: context, + builder: (context) { + final controller = + TextEditingController(text: name ?? ""); + controller.selection = TextSelection( + baseOffset: 0, extentOffset: controller.text.length); + return AlertDialog( + title: const Text('Rename Request'), + content: TextField( + autofocus: true, + controller: controller, + decoration: + const InputDecoration(hintText: "Enter new name"), + ), + actions: [ + OutlinedButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text('CANCEL')), + FilledButton( + onPressed: () { + final val = controller.text.trim(); + ref + .read(collectionStateNotifierProvider + .notifier) + .update(id!, name: val); + Navigator.pop(context); + controller.dispose(); + }, + child: const Text('OK')), + ], + ); + }); + }, + icon: const Icon( + Icons.edit, + size: 12, + ), + label: Text( + "Rename", + style: Theme.of(context).textTheme.bodySmall, + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index 5fa4b404..012d067c 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -81,6 +81,11 @@ class URLTextField extends ConsumerWidget { .read(collectionStateNotifierProvider.notifier) .update(selectedId, url: value); }, + onFieldSubmitted: (value) { + ref + .read(collectionStateNotifierProvider.notifier) + .sendRequest(selectedId); + }, ); } } @@ -93,10 +98,11 @@ class SendButton extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final selectedId = ref.watch(selectedIdStateProvider); - final sentRequestId = ref.watch(sentRequestIdStateProvider); + final isWorking = ref.watch( + selectedRequestModelProvider.select((value) => value?.isWorking)); + return SendRequestButton( - selectedId: selectedId, - sentRequestId: sentRequestId, + isWorking: isWorking ?? false, onTap: () { ref .read(collectionStateNotifierProvider.notifier) diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index 4a7cb302..44e67330 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -65,7 +65,7 @@ class SettingsPage extends ConsumerWidget { hoverColor: kColorTransparent, title: const Text('Default URI Scheme'), subtitle: Text( - 'api.foss42.com → ${settings.defaultUriScheme}://api.foss42.com'), + 'api.apidash.dev → ${settings.defaultUriScheme}://api.apidash.dev'), trailing: DropdownMenu( onSelected: (value) { ref diff --git a/lib/utils/file_utils.dart b/lib/utils/file_utils.dart index 69306b7f..41a6d4a3 100644 --- a/lib/utils/file_utils.dart +++ b/lib/utils/file_utils.dart @@ -43,7 +43,7 @@ String getShortPath(String path) { var f = p.split(path); if (f.length > 2) { f = f.sublist(f.length - 2); - return ".../${p.joinAll(f)}"; + return p.join("...", p.joinAll(f)); } return path; } diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index 45a24fe9..1450cc01 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -2,6 +2,7 @@ Map headers = { "Accept": "Specifies the media types that are acceptable for the response.", "Accept-Encoding": "Indicates the encoding methods the client can understand.", + "Accept-Charset": "Specifies the character sets that are acceptable.", "Access-Control-Allow-Headers": "Specifies a list of HTTP headers that can be used in an actual request after a preflight request including the Access-Control-Request-Headers header is made.", "Access-Control-Allow-Methods": @@ -41,11 +42,16 @@ Map headers = { "Cross-Origin-Resource-Policy": "Controls how cross-origin requests for resources are handled.", "Date": "Indicates the date and time at which the message was sent.", + "Device-Memory": + "Indicates the approximate amount of device memory in gigabytes.", "DNT": "Informs websites whether the user's preference is to opt out of online tracking.", "Expect": "Indicates certain expectations that need to be met by the server.", "Expires": "Contains the date/time after which the response is considered expired", + "Forwarded": + "Contains information from the client-facing side of proxy servers that is altered or lost when a proxy is involved in the path of the request.", + "From": "Contains an Internet email address for a human user who controls the requesting user agent.", "Host": "Specifies the domain name of the server and the port number.", "If-Match": "Used for conditional requests, allows the server to respond based on certain conditions.", @@ -57,9 +63,15 @@ Map headers = { "Used in conjunction with the Range header to conditionally request a partial resource.", "If-Unmodified-Since": "Used for conditional requests, allows the server to respond based on certain conditions.", + "Keep-Alive": + "Used to allow the connection to be reused for further requests.", "Location": "Indicates the URL a client should redirect to for further interaction.", + "Max-Forwards": + "Indicates the remaining number of times a request can be forwarded by proxies.", "Origin": "Specifies the origin of a cross-origin request.", + "Proxy-Authorization": + "Contains credentials for authenticating a client with a proxy server.", "Range": "Used to request only part of a resource, typically in the context of downloading large files.", "Referer": @@ -68,10 +80,14 @@ Map headers = { "Specifies how much information the browser should include in the Referer header when navigating to other pages.", "Retry-After": "Informs the client how long it should wait before making another request after a server has responded with a rate-limiting status code.", + "Save-Data": + "Indicates the client's preference for reduced data usage.", "Server": "Indicates the software used by the origin server.", "Strict-Transport-Security": "Instructs the browser to always use HTTPS for the given domain.", "TE": "Specifies the transfer encodings that are acceptable to the client.", + "Upgrade-Insecure-Requests": + "Instructs the browser to prefer secure connections when available.", "User-Agent": "Identifies the client software and version making the request.", "Via": diff --git a/lib/widgets/buttons.dart b/lib/widgets/buttons.dart index 2d63ede7..f9baf0c4 100644 --- a/lib/widgets/buttons.dart +++ b/lib/widgets/buttons.dart @@ -47,36 +47,37 @@ class CopyButton extends StatelessWidget { class SendRequestButton extends StatelessWidget { const SendRequestButton({ super.key, - required this.selectedId, - required this.sentRequestId, + required this.isWorking, required this.onTap, }); - final String? selectedId; - final String? sentRequestId; + final bool isWorking; final void Function() onTap; @override Widget build(BuildContext context) { - bool disable = sentRequestId != null; return FilledButton( - onPressed: disable ? null : onTap, + onPressed: isWorking ? null : onTap, child: Row( mainAxisSize: MainAxisSize.min, - children: [ - Text( - disable - ? (selectedId == sentRequestId ? kLabelSending : kLabelBusy) - : kLabelSend, - style: kTextStyleButton, - ), - if (!disable) kHSpacer10, - if (!disable) - const Icon( - size: 16, - Icons.send, - ), - ], + children: isWorking + ? const [ + Text( + kLabelSending, + style: kTextStyleButton, + ), + ] + : const [ + Text( + kLabelSend, + style: kTextStyleButton, + ), + kHSpacer10, + Icon( + size: 16, + Icons.send, + ), + ], ), ); } diff --git a/lib/widgets/cards.dart b/lib/widgets/cards.dart index 740ddbc8..943227ce 100644 --- a/lib/widgets/cards.dart +++ b/lib/widgets/cards.dart @@ -97,6 +97,9 @@ class SidebarRequestCard extends StatelessWidget { onTapOutsideNameEditor?.call(); //FocusScope.of(context).unfocus(); }, + onFieldSubmitted: (value) { + onTapOutsideNameEditor?.call(); + }, onChanged: onChangedNameEditor, decoration: const InputDecoration( isCollapsed: true, diff --git a/lib/widgets/csv_previewer.dart b/lib/widgets/csv_previewer.dart new file mode 100644 index 00000000..17e8dd48 --- /dev/null +++ b/lib/widgets/csv_previewer.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:csv/csv.dart'; +import 'error_message.dart'; +import '../consts.dart'; + +class CsvPreviewer extends StatelessWidget { + const CsvPreviewer({super.key, required this.body}); + + final String body; + + @override + Widget build(BuildContext context) { + try { + final List> csvData = + const CsvToListConverter().convert(body, eol: '\n'); + return SingleChildScrollView( + scrollDirection: Axis.vertical, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + columns: csvData[0] + .map( + (item) => DataColumn( + label: Text( + item.toString(), + ), + ), + ) + .toList(), + rows: csvData + .skip(1) + .map( + (csvrow) => DataRow( + cells: csvrow + .map( + (csvItem) => DataCell( + Text( + csvItem.toString(), + ), + ), + ) + .toList(), + ), + ) + .toList(), + ), + ), + ); + } catch (e) { + return const ErrorMessage(message: kCsvError); + } + } +} diff --git a/lib/widgets/form_data_field.dart b/lib/widgets/form_data_field.dart index eb4c8862..29f210c4 100644 --- a/lib/widgets/form_data_field.dart +++ b/lib/widgets/form_data_field.dart @@ -46,32 +46,34 @@ class _FormDataFieldState extends State { color: colorScheme.onSurface, ), decoration: InputDecoration( - hintStyle: kCodeStyle.copyWith( - color: colorScheme.outline.withOpacity( + hintStyle: kCodeStyle.copyWith( + color: colorScheme.outline.withOpacity( + kHintOpacity, + ), + ), + hintText: widget.hintText, + contentPadding: const EdgeInsets.only(bottom: 16), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: colorScheme.primary.withOpacity( kHintOpacity, ), ), - hintText: widget.hintText, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: colorScheme.primary.withOpacity( - kHintOpacity, - ), - ), + ), + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: colorScheme.surfaceVariant, ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: colorScheme.surfaceVariant, - ), - ), - suffixIcon: DropdownButtonFormData( - formDataType: widget.formDataType, - onChanged: (p0) { - if (widget.onFormDataTypeChanged != null) { - widget.onFormDataTypeChanged!(p0); - } - }, - )), + ), + suffixIcon: DropdownButtonFormData( + formDataType: widget.formDataType, + onChanged: (p0) { + if (widget.onFormDataTypeChanged != null) { + widget.onFormDataTypeChanged!(p0); + } + }, + ), + ), onChanged: widget.onChanged, ), ), diff --git a/lib/widgets/headerfield.dart b/lib/widgets/headerfield.dart index 9c678ee3..5bce6c8f 100644 --- a/lib/widgets/headerfield.dart +++ b/lib/widgets/headerfield.dart @@ -1,6 +1,6 @@ +import 'package:apidash/consts.dart'; import 'package:apidash/utils/header_utils.dart'; import 'package:flutter/material.dart'; -import 'package:apidash/consts.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; class HeaderField extends StatefulWidget { @@ -41,6 +41,7 @@ class _HeaderFieldState extends State { @override void didUpdateWidget(HeaderField oldWidget) { + super.didUpdateWidget(oldWidget); if (oldWidget.initialValue != widget.initialValue) { controller.text = widget.initialValue ?? ""; controller.selection = @@ -54,8 +55,8 @@ class _HeaderFieldState extends State { return TypeAheadField( key: Key(widget.keyId), hideOnEmpty: true, - minCharsForSuggestions: 1, - onSuggestionSelected: (value) { + controller: controller, + onSelected: (value) { setState(() { controller.text = value; }); @@ -68,19 +69,17 @@ class _HeaderFieldState extends State { ); }, suggestionsCallback: headerSuggestionCallback, - suggestionsBoxDecoration: suggestionBoxDecorations(context), - textFieldConfiguration: TextFieldConfiguration( + decorationBuilder: (context, child) => + suggestionBoxDecorations(context, child, colorScheme), + constraints: const BoxConstraints(maxHeight: 400), + builder: (context, controller, focusNode) => TextField( onChanged: widget.onChanged, controller: controller, - style: kCodeStyle.copyWith( - color: colorScheme.onSurface, - ), + focusNode: focusNode, + style: kCodeStyle.copyWith(color: colorScheme.onSurface), decoration: InputDecoration( hintStyle: kCodeStyle.copyWith( - color: colorScheme.outline.withOpacity( - kHintOpacity, - ), - ), + color: colorScheme.outline.withOpacity(kHintOpacity)), hintText: widget.hintText, focusedBorder: UnderlineInputBorder( borderSide: BorderSide( @@ -99,22 +98,26 @@ class _HeaderFieldState extends State { ); } - SuggestionsBoxDecoration suggestionBoxDecorations(BuildContext context) { - return SuggestionsBoxDecoration( - elevation: 4, - constraints: const BoxConstraints(maxHeight: 400), - shape: RoundedRectangleBorder( - side: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.2, + Theme suggestionBoxDecorations( + BuildContext context, Widget child, ColorScheme colorScheme) { + return Theme( + data: ThemeData(colorScheme: colorScheme), + child: Material( + elevation: 4, + shape: RoundedRectangleBorder( + side: BorderSide(color: Theme.of(context).dividerColor, width: 1.2), + borderRadius: const BorderRadius.vertical(bottom: Radius.circular(8)), ), - borderRadius: const BorderRadius.vertical(bottom: Radius.circular(8)), + clipBehavior: Clip.hardEdge, + child: child, ), - clipBehavior: Clip.hardEdge, ); } - Future> headerSuggestionCallback(String pattern) async { + Future?> headerSuggestionCallback(String pattern) async { + if (pattern.isEmpty) { + return null; + } return getHeaderSuggestions(pattern); } } diff --git a/lib/widgets/json_previewer.dart b/lib/widgets/json_previewer.dart index 078a9721..46d066bf 100644 --- a/lib/widgets/json_previewer.dart +++ b/lib/widgets/json_previewer.dart @@ -154,6 +154,7 @@ class _JsonPreviewerState extends State { @override void didUpdateWidget(JsonPreviewer oldWidget) { + super.didUpdateWidget(oldWidget); if (oldWidget.code != widget.code) { store.buildNodes(widget.code, areAllCollapsed: true); store.expandAll(); 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/lib/widgets/previewer.dart b/lib/widgets/previewer.dart index 9841ac5b..dd2f5186 100644 --- a/lib/widgets/previewer.dart +++ b/lib/widgets/previewer.dart @@ -7,6 +7,7 @@ import 'package:vector_graphics_compiler/vector_graphics_compiler.dart'; import 'error_message.dart'; import 'uint8_audio_player.dart'; import 'json_previewer.dart'; +import 'csv_previewer.dart'; import '../consts.dart'; class Previewer extends StatefulWidget { @@ -81,6 +82,9 @@ class _PreviewerState extends State { }, ); } + if (widget.type == kTypeText && widget.subtype == kSubTypeCsv) { + return CsvPreviewer(body: widget.body); + } if (widget.type == kTypeVideo) { // TODO: Video Player } diff --git a/lib/widgets/textfields.dart b/lib/widgets/textfields.dart index c288b0a6..da68f9e2 100644 --- a/lib/widgets/textfields.dart +++ b/lib/widgets/textfields.dart @@ -7,11 +7,13 @@ class URLField extends StatelessWidget { required this.selectedId, this.initialValue, this.onChanged, + this.onFieldSubmitted, }); final String selectedId; final String? initialValue; final void Function(String)? onChanged; + final void Function(String)? onFieldSubmitted; @override Widget build(BuildContext context) { @@ -29,6 +31,7 @@ class URLField extends StatelessWidget { border: InputBorder.none, ), onChanged: onChanged, + onFieldSubmitted: onFieldSubmitted, ); } } @@ -95,7 +98,6 @@ class JsonSearchField extends StatelessWidget { controller: controller, onChanged: onChanged, style: kCodeStyle, - cursorHeight: 18, decoration: const InputDecoration( isDense: true, border: InputBorder.none, diff --git a/pubspec.lock b/pubspec.lock index 2f3f7f55..4125ed98 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -217,6 +217,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + csv: + dependency: "direct main" + description: + name: csv + sha256: "63ed2871dd6471193dffc52c0e6c76fb86269c00244d244297abbb355c84a86e" + url: "https://pub.dev" + source: hosted + version: "5.1.1" dart_style: dependency: "direct main" description: @@ -306,10 +314,10 @@ packages: dependency: transitive description: name: flutter_keyboard_visibility - sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" + sha256: "98664be7be0e3ffca00de50f7f6a287ab62c763fc8c762e0a21584584a3ff4f8" url: "https://pub.dev" source: hosted - version: "5.4.1" + version: "6.0.0" flutter_keyboard_visibility_linux: dependency: transitive description: @@ -407,10 +415,10 @@ packages: dependency: "direct main" description: name: flutter_typeahead - sha256: b9942bd5b7611a6ec3f0730c477146cffa4cd4b051077983ba67ddfc9e7ee818 + sha256: d64712c65db240b1057559b952398ebb6e498077baeebf9b0731dade62438a6d url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "5.2.0" flutter_web_plugins: dependency: transitive description: flutter @@ -500,10 +508,10 @@ packages: dependency: "direct main" description: name: http - sha256: d4872660c46d929f6b8a9ef4e7a7eff7e49bbf0c4ec3f385ee32df5119175139 + sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" http_multi_server: dependency: transitive description: @@ -625,6 +633,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -661,26 +693,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" mime: dependency: transitive description: @@ -757,10 +789,10 @@ packages: dependency: "direct main" description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -853,10 +885,34 @@ packages: dependency: transitive description: name: pointer_interceptor - sha256: adf7a637f97c077041d36801b43be08559fd4322d2127b3f20bb7be1b9eebc22 + sha256: bd18321519718678d5fa98ad3a3359cbc7a31f018554eab80b73d08a7f0c165a url: "https://pub.dev" source: hosted - version: "0.9.3+7" + version: "0.10.1" + pointer_interceptor_ios: + dependency: transitive + description: + name: pointer_interceptor_ios + sha256: "2e73c39452830adc4695757130676a39412a3b7f3c34e3f752791b5384770877" + url: "https://pub.dev" + source: hosted + version: "0.10.0+2" + pointer_interceptor_platform_interface: + dependency: transitive + description: + name: pointer_interceptor_platform_interface + sha256: "0597b0560e14354baeb23f8375cd612e8bd4841bf8306ecb71fcd0bb78552506" + url: "https://pub.dev" + source: hosted + version: "0.10.0+1" + pointer_interceptor_web: + dependency: transitive + description: + name: pointer_interceptor_web + sha256: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e + url: "https://pub.dev" + source: hosted + version: "0.10.2" pointycastle: dependency: transitive description: @@ -1178,10 +1234,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "7286aec002c8feecc338cc33269e96b73955ab227456e9fb2a91f7fab8a358e9" + sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.0" url_launcher_windows: dependency: transitive description: @@ -1247,13 +1303,13 @@ packages: source: hosted version: "1.1.0" web: - dependency: transitive + dependency: "direct main" description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.5.1" web_socket_channel: dependency: transitive description: @@ -1320,5 +1376,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.3 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index 4196d007..ab250f26 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,11 +5,12 @@ version: 0.3.0+3 environment: sdk: ">=3.0.0 <4.0.0" - flutter: ">=3.7.2" + flutter: ">=3.16.0" dependencies: flutter: sdk: flutter + web: ^0.5.0 multi_split_view: ^2.4.0 url_launcher: ^6.1.12 flutter_riverpod: ^2.3.7 @@ -41,7 +42,7 @@ dependencies: json_annotation: ^4.8.1 printing: ^5.11.1 package_info_plus: ^4.1.0 - flutter_typeahead: ^4.8.0 + flutter_typeahead: ^5.2.0 provider: ^6.0.5 json_data_explorer: git: @@ -54,6 +55,7 @@ dependencies: code_builder: ^4.9.0 dart_style: ^2.3.4 json_text_field: ^1.1.0 + csv: ^5.1.1 dev_dependencies: flutter_test: diff --git a/test/codegen/codegen_test.dart b/test/codegen/codegen_test.dart index 63102e0a..2e5b58a6 100644 --- a/test/codegen/codegen_test.dart +++ b/test/codegen/codegen_test.dart @@ -8,7 +8,7 @@ void main() { group('Test various Code generators', () { test('cURL', () { - const expectedCode = r"""curl --url 'https://api.foss42.com'"""; + const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet1, "https"), expectedCode); }); @@ -18,7 +18,7 @@ void main() { void main() async { try { - final response = await dio.Dio.get('https://api.foss42.com'); + final response = await dio.Dio.get('https://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -40,7 +40,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com'); + var uri = Uri.parse('https://api.apidash.dev'); final response = await http.get(uri); @@ -62,7 +62,7 @@ void main() async { test('HAR', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -73,7 +73,7 @@ void main() async { test('JS Axios', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -95,7 +95,7 @@ axios(config) }); test('JS Fetch', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -128,7 +128,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -151,7 +151,7 @@ fun main() { const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -176,7 +176,7 @@ axios(config) test('Nodejs Fetch', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -206,7 +206,7 @@ fetch(url, options) test('Python http.client', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "") res = conn.getresponse() @@ -223,7 +223,7 @@ print(data.decode("utf-8")) test('Python requests', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' response = requests.get(url) diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index e9bb7f60..212a82ce 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -7,25 +7,25 @@ void main() { group('GET Request', () { test('GET 1', () { - const expectedCode = r"""curl --url 'https://api.foss42.com'"""; + const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; expect(curlCodeGen.getCode(requestModelGet1, "https"), expectedCode); }); test('GET 2', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/country/data?code=US'"""; + r"""curl --url 'https://api.apidash.dev/country/data?code=US'"""; expect(curlCodeGen.getCode(requestModelGet2, "https"), expectedCode); }); test('GET 3', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/country/data?code=IND'"""; + r"""curl --url 'https://api.apidash.dev/country/data?code=IND'"""; expect(curlCodeGen.getCode(requestModelGet3, "https"), expectedCode); }); test('GET 4', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'"""; + r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'"""; expect(curlCodeGen.getCode(requestModelGet4, "https"), expectedCode); }); @@ -44,7 +44,7 @@ void main() { }); test('GET 7', () { - const expectedCode = r"""curl --url 'https://api.foss42.com'"""; + const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; expect(curlCodeGen.getCode(requestModelGet7, "https"), expectedCode); }); @@ -57,13 +57,13 @@ void main() { test('GET 9', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'"""; + r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'"""; expect(curlCodeGen.getCode(requestModelGet9, "https"), expectedCode); }); test('GET 10', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social' \ + r"""curl --url 'https://api.apidash.dev/humanize/social' \ --header 'User-Agent: Test Agent'"""; expect( curlCodeGen.getCode( @@ -75,26 +75,26 @@ void main() { test('GET 11', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&digits=3' \ + r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&digits=3' \ --header 'User-Agent: Test Agent'"""; expect(curlCodeGen.getCode(requestModelGet11, "https"), expectedCode); }); test('GET 12', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social'"""; + r"""curl --url 'https://api.apidash.dev/humanize/social'"""; expect(curlCodeGen.getCode(requestModelGet12, "https"), expectedCode); }); }); group('HEAD Request', () { test('HEAD 1', () { - const expectedCode = r"""curl --head --url 'https://api.foss42.com'"""; + const expectedCode = r"""curl --head --url 'https://api.apidash.dev'"""; expect(curlCodeGen.getCode(requestModelHead1, "https"), expectedCode); }); test('HEAD 2', () { - const expectedCode = r"""curl --head --url 'http://api.foss42.com'"""; + const expectedCode = r"""curl --head --url 'http://api.apidash.dev'"""; expect(curlCodeGen.getCode(requestModelHead2, "http"), expectedCode); }); }); @@ -102,7 +102,7 @@ void main() { group('POST Request', () { test('POST 1', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.foss42.com/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: text/plain' \ --data '{ "text": "I LOVE Flutter" @@ -112,7 +112,7 @@ void main() { test('POST 2', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.foss42.com/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: application/json' \ --data '{ "text": "I LOVE Flutter" @@ -122,7 +122,7 @@ void main() { test('POST 3', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.foss42.com/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: application/json' \ --header 'User-Agent: Test Agent' \ --data '{ diff --git a/test/codegen/dart_dio_codegen_test.dart b/test/codegen/dart_dio_codegen_test.dart index 30b371fd..5b981fde 100644 --- a/test/codegen/dart_dio_codegen_test.dart +++ b/test/codegen/dart_dio_codegen_test.dart @@ -12,7 +12,7 @@ void main() { void main() async { try { - final response = await dio.Dio.get('https://api.foss42.com'); + final response = await dio.Dio.get('https://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -35,7 +35,7 @@ void main() async { try { final queryParams = {'code': 'US'}; final response = await dio.Dio.get( - 'https://api.foss42.com/country/data', + 'https://api.apidash.dev/country/data', queryParameters: queryParams, ); print(response.statusCode); @@ -60,7 +60,7 @@ void main() async { try { final queryParams = {'code': 'IND'}; final response = await dio.Dio.get( - 'https://api.foss42.com/country/data?code=US', + 'https://api.apidash.dev/country/data?code=US', queryParameters: queryParams, ); print(response.statusCode); @@ -91,7 +91,7 @@ void main() async { 'trailing_zeros': 'true', }; final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', + 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, ); print(response.statusCode); @@ -166,7 +166,7 @@ void main() async { void main() async { try { - final response = await dio.Dio.get('https://api.foss42.com'); + final response = await dio.Dio.get('https://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -219,7 +219,7 @@ void main() async { 'add_space': 'true', }; final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', + 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, ); print(response.statusCode); @@ -244,7 +244,7 @@ void main() async { try { final headers = {'User-Agent': 'Test Agent'}; final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', + 'https://api.apidash.dev/humanize/social', options: Options(headers: headers), ); print(response.statusCode); @@ -278,7 +278,7 @@ void main() async { }; final headers = {'User-Agent': 'Test Agent'}; final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', + 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, options: Options(headers: headers), ); @@ -302,7 +302,7 @@ void main() async { void main() async { try { - final response = await dio.Dio.get('https://api.foss42.com/humanize/social'); + final response = await dio.Dio.get('https://api.apidash.dev/humanize/social'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -325,7 +325,7 @@ void main() async { void main() async { try { - final response = await dio.Dio.head('https://api.foss42.com'); + final response = await dio.Dio.head('https://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -346,7 +346,7 @@ void main() async { void main() async { try { - final response = await dio.Dio.head('http://api.foss42.com'); + final response = await dio.Dio.head('http://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -373,7 +373,7 @@ void main() async { "text": "I LOVE Flutter" }'''; final response = await dio.Dio.post( - 'https://api.foss42.com/case/lower', + 'https://api.apidash.dev/case/lower', data: data, ); print(response.statusCode); @@ -401,7 +401,7 @@ void main() async { "text": "I LOVE Flutter" }'''); final response = await dio.Dio.post( - 'https://api.foss42.com/case/lower', + 'https://api.apidash.dev/case/lower', data: data, ); print(response.statusCode); @@ -430,7 +430,7 @@ void main() async { "text": "I LOVE Flutter" }'''); final response = await dio.Dio.post( - 'https://api.foss42.com/case/lower', + 'https://api.apidash.dev/case/lower', options: Options(headers: headers), data: data, ); diff --git a/test/codegen/dart_http_codegen_test.dart b/test/codegen/dart_http_codegen_test.dart index 55ab070a..790658b1 100644 --- a/test/codegen/dart_http_codegen_test.dart +++ b/test/codegen/dart_http_codegen_test.dart @@ -11,7 +11,7 @@ void main() { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com'); + var uri = Uri.parse('https://api.apidash.dev'); final response = await http.get(uri); @@ -32,7 +32,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/data'); + var uri = Uri.parse('https://api.apidash.dev/country/data'); var queryParams = {'code': 'US'}; uri = uri.replace(queryParameters: queryParams); @@ -57,7 +57,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/data?code=US'); + var uri = Uri.parse('https://api.apidash.dev/country/data?code=US'); var queryParams = {'code': 'IND'}; var urlQueryParams = Map.from(uri.queryParameters); @@ -83,7 +83,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var queryParams = { 'num': '8700000', @@ -168,7 +168,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com'); + var uri = Uri.parse('https://api.apidash.dev'); final response = await http.get(uri); @@ -218,7 +218,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var queryParams = { 'num': '8700000', @@ -245,7 +245,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var headers = {'User-Agent': 'Test Agent'}; @@ -276,7 +276,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var queryParams = { 'num': '8700000', @@ -308,7 +308,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); final response = await http.get(uri); @@ -331,7 +331,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com'); + var uri = Uri.parse('https://api.apidash.dev'); final response = await http.head(uri); @@ -352,7 +352,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('http://api.foss42.com'); + var uri = Uri.parse('http://api.apidash.dev'); final response = await http.head(uri); @@ -375,7 +375,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/case/lower'); + var uri = Uri.parse('https://api.apidash.dev/case/lower'); String body = r'''{ "text": "I LOVE Flutter" @@ -406,7 +406,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/case/lower'); + var uri = Uri.parse('https://api.apidash.dev/case/lower'); String body = r'''{ "text": "I LOVE Flutter" @@ -437,7 +437,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/case/lower'); + var uri = Uri.parse('https://api.apidash.dev/case/lower'); String body = r'''{ "text": "I LOVE Flutter" diff --git a/test/codegen/har_codegen_test.dart b/test/codegen/har_codegen_test.dart index 8e6b7bb0..ea40bf93 100644 --- a/test/codegen/har_codegen_test.dart +++ b/test/codegen/har_codegen_test.dart @@ -9,7 +9,7 @@ void main() { test('GET 1', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -20,7 +20,7 @@ void main() { test('GET 2', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/country/data?code=US", + "url": "https://api.apidash.dev/country/data?code=US", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -36,7 +36,7 @@ void main() { test('GET 3', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/country/data?code=IND", + "url": "https://api.apidash.dev/country/data?code=IND", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -52,7 +52,7 @@ void main() { test('GET 4', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + "url": "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -121,7 +121,7 @@ void main() { test('GET 7', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -153,7 +153,7 @@ void main() { test('GET 9', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social?num=8700000&add_space=true", + "url": "https://api.apidash.dev/humanize/social?num=8700000&add_space=true", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -173,7 +173,7 @@ void main() { test('GET 10', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social", + "url": "https://api.apidash.dev/humanize/social", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [ @@ -194,7 +194,7 @@ void main() { test('GET 11', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social?num=8700000&digits=3", + "url": "https://api.apidash.dev/humanize/social?num=8700000&digits=3", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -219,7 +219,7 @@ void main() { test('GET 12', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social", + "url": "https://api.apidash.dev/humanize/social", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -232,7 +232,7 @@ void main() { test('HEAD 1', () { const expectedCode = r"""{ "method": "HEAD", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -243,7 +243,7 @@ void main() { test('HEAD 2', () { const expectedCode = r"""{ "method": "HEAD", - "url": "http://api.foss42.com", + "url": "http://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -256,7 +256,7 @@ void main() { test('POST 1', () { const expectedCode = r"""{ "method": "POST", - "url": "https://api.foss42.com/case/lower", + "url": "https://api.apidash.dev/case/lower", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [ @@ -276,7 +276,7 @@ void main() { test('POST 2', () { const expectedCode = r"""{ "method": "POST", - "url": "https://api.foss42.com/case/lower", + "url": "https://api.apidash.dev/case/lower", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [ @@ -296,7 +296,7 @@ void main() { test('POST 3', () { const expectedCode = r"""{ "method": "POST", - "url": "https://api.foss42.com/case/lower", + "url": "https://api.apidash.dev/case/lower", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [ diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index 9498da1c..c364dbdb 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -8,7 +8,7 @@ void main() { group('GET Request', () { test('GET 1', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -29,7 +29,7 @@ axios(config) test('GET 2', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: 'get', params: { "code": "US" @@ -53,7 +53,7 @@ axios(config) test('GET 3', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: 'get', params: { "code": "IND" @@ -77,7 +77,7 @@ axios(config) test('GET 4', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -156,7 +156,7 @@ axios(config) test('GET 7', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -204,7 +204,7 @@ axios(config) test('GET 9', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -229,7 +229,7 @@ axios(config) test('GET 10', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', headers: { "User-Agent": "Test Agent" @@ -258,7 +258,7 @@ axios(config) test('GET 11', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -286,7 +286,7 @@ axios(config) test('GET 12', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get' }; @@ -309,7 +309,7 @@ axios(config) group('HEAD Request', () { test('HEAD 1', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'head' }; @@ -330,7 +330,7 @@ axios(config) test('HEAD 2', () { const expectedCode = r"""let config = { - url: 'http://api.foss42.com', + url: 'http://api.apidash.dev', method: 'head' }; @@ -353,7 +353,7 @@ axios(config) group('POST Request', () { test('POST 1', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "text/plain" @@ -378,7 +378,7 @@ axios(config) test('POST 2', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "application/json" @@ -403,7 +403,7 @@ axios(config) test('POST 3', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "application/json", diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index 43d053f9..c29f93b9 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -7,7 +7,7 @@ void main() { group('GET Request', () { test('GET 1', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -33,7 +33,7 @@ fetch(url, options) test('GET 2', () { const expectedCode = - r"""let url = 'https://api.foss42.com/country/data?code=US'; + r"""let url = 'https://api.apidash.dev/country/data?code=US'; let options = { method: 'GET' @@ -59,7 +59,7 @@ fetch(url, options) test('GET 3', () { const expectedCode = - r"""let url = 'https://api.foss42.com/country/data?code=IND'; + r"""let url = 'https://api.apidash.dev/country/data?code=IND'; let options = { method: 'GET' @@ -85,7 +85,7 @@ fetch(url, options) test('GET 4', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; + r"""let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; let options = { method: 'GET' @@ -168,7 +168,7 @@ fetch(url, options) }); test('GET 7', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -223,7 +223,7 @@ fetch(url, options) test('GET 9', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; + r"""let url = 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'; let options = { method: 'GET' @@ -249,7 +249,7 @@ fetch(url, options) test('GET 10', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social'; + r"""let url = 'https://api.apidash.dev/humanize/social'; let options = { method: 'GET', @@ -283,7 +283,7 @@ fetch(url, options) test('GET 11', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; + r"""let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3'; let options = { method: 'GET', @@ -312,7 +312,7 @@ fetch(url, options) test('GET 12', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social'; + r"""let url = 'https://api.apidash.dev/humanize/social'; let options = { method: 'GET' @@ -339,7 +339,7 @@ fetch(url, options) group('HEAD Request', () { test('HEAD 1', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'HEAD' @@ -364,7 +364,7 @@ fetch(url, options) }); test('HEAD 2', () { - const expectedCode = r"""let url = 'http://api.foss42.com'; + const expectedCode = r"""let url = 'http://api.apidash.dev'; let options = { method: 'HEAD' @@ -391,7 +391,7 @@ fetch(url, options) group('POST Request', () { test('POST 1', () { - const expectedCode = r"""let url = 'https://api.foss42.com/case/lower'; + const expectedCode = r"""let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', @@ -421,7 +421,7 @@ fetch(url, options) }); test('POST 2', () { - const expectedCode = r"""let url = 'https://api.foss42.com/case/lower'; + const expectedCode = r"""let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', @@ -451,7 +451,7 @@ fetch(url, options) }); test('POST 3', () { - const expectedCode = r"""let url = 'https://api.foss42.com/case/lower'; + const expectedCode = r"""let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index ef8ca190..acca0a66 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -13,7 +13,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -38,7 +38,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/country/data".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/country/data".toHttpUrl().newBuilder() .addQueryParameter("code", "US") .build() @@ -65,7 +65,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/country/data".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/country/data".toHttpUrl().newBuilder() .addQueryParameter("code", "IND") .build() @@ -92,7 +92,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/humanize/social".toHttpUrl().newBuilder() .addQueryParameter("num", "8700000") .addQueryParameter("digits", "3") .addQueryParameter("system", "SS") @@ -175,7 +175,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -228,7 +228,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/humanize/social".toHttpUrl().newBuilder() .addQueryParameter("num", "8700000") .addQueryParameter("add_space", "true") .build() @@ -255,7 +255,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social" + val url = "https://api.apidash.dev/humanize/social" val request = Request.Builder() .url(url) @@ -285,7 +285,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/humanize/social".toHttpUrl().newBuilder() .addQueryParameter("num", "8700000") .addQueryParameter("digits", "3") .build() @@ -313,7 +313,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social" + val url = "https://api.apidash.dev/humanize/social" val request = Request.Builder() .url(url) @@ -339,7 +339,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -363,7 +363,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "http://api.foss42.com" + val url = "http://api.apidash.dev" val request = Request.Builder() .url(url) @@ -391,7 +391,7 @@ import okhttp3.MediaType.Companion.toMediaType fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/case/lower" + val url = "https://api.apidash.dev/case/lower" val mediaType = "text/plain".toMediaType() @@ -423,7 +423,7 @@ import okhttp3.MediaType.Companion.toMediaType fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/case/lower" + val url = "https://api.apidash.dev/case/lower" val mediaType = "application/json".toMediaType() @@ -455,7 +455,7 @@ import okhttp3.MediaType.Companion.toMediaType fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/case/lower" + val url = "https://api.apidash.dev/case/lower" val mediaType = "application/json".toMediaType() diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index 519f5ab5..d4a12902 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -10,7 +10,7 @@ void main() { const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -33,7 +33,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: 'get', params: { "code": "US" @@ -59,7 +59,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: 'get', params: { "code": "IND" @@ -85,7 +85,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -170,7 +170,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -222,7 +222,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -249,7 +249,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', headers: { "User-Agent": "Test Agent" @@ -280,7 +280,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -310,7 +310,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get' }; @@ -335,7 +335,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'head' }; @@ -358,7 +358,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'http://api.foss42.com', + url: 'http://api.apidash.dev', method: 'head' }; @@ -383,7 +383,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "text/plain" @@ -410,7 +410,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "application/json" @@ -437,7 +437,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "application/json", diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index c06ceee5..592610ee 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -9,7 +9,7 @@ void main() { test('GET 1', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -36,7 +36,7 @@ fetch(url, options) test('GET 2', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/country/data?code=US'; +let url = 'https://api.apidash.dev/country/data?code=US'; let options = { method: 'GET' @@ -63,7 +63,7 @@ fetch(url, options) test('GET 3', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/country/data?code=IND'; +let url = 'https://api.apidash.dev/country/data?code=IND'; let options = { method: 'GET' @@ -90,7 +90,7 @@ fetch(url, options) test('GET 4', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; +let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; let options = { method: 'GET' @@ -177,7 +177,7 @@ fetch(url, options) test('GET 7', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -234,7 +234,7 @@ fetch(url, options) test('GET 9', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; +let url = 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'; let options = { method: 'GET' @@ -261,7 +261,7 @@ fetch(url, options) test('GET 10', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social'; +let url = 'https://api.apidash.dev/humanize/social'; let options = { method: 'GET', @@ -296,7 +296,7 @@ fetch(url, options) test('GET 11', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; +let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3'; let options = { method: 'GET', @@ -326,7 +326,7 @@ fetch(url, options) test('GET 12', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social'; +let url = 'https://api.apidash.dev/humanize/social'; let options = { method: 'GET' @@ -355,7 +355,7 @@ fetch(url, options) test('HEAD 1', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'HEAD' @@ -382,7 +382,7 @@ fetch(url, options) test('HEAD 2', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'http://api.foss42.com'; +let url = 'http://api.apidash.dev'; let options = { method: 'HEAD' @@ -411,7 +411,7 @@ fetch(url, options) test('POST 1', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/case/lower'; +let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', @@ -443,7 +443,7 @@ fetch(url, options) test('POST 2', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/case/lower'; +let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', @@ -475,7 +475,7 @@ fetch(url, options) test('POST 3', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/case/lower'; +let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', diff --git a/test/codegen/python_http_client_codegen_test.dart b/test/codegen/python_http_client_codegen_test.dart index c617305c..0ca712c2 100644 --- a/test/codegen/python_http_client_codegen_test.dart +++ b/test/codegen/python_http_client_codegen_test.dart @@ -9,7 +9,7 @@ void main() { test('GET 1', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "") res = conn.getresponse() @@ -30,7 +30,7 @@ queryParams = { } queryParamsStr = '?' + urlencode(queryParams) -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/country/data" + queryParamsStr) res = conn.getresponse() @@ -51,7 +51,7 @@ queryParams = { } queryParamsStr = '?' + urlencode(queryParams) -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/country/data" + queryParamsStr) res = conn.getresponse() @@ -76,7 +76,7 @@ queryParams = { } queryParamsStr = '?' + urlencode(queryParams) -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social" + queryParamsStr) res = conn.getresponse() @@ -137,7 +137,7 @@ print(data.decode("utf-8")) test('GET 7', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "") res = conn.getresponse() @@ -185,7 +185,7 @@ queryParams = { } queryParamsStr = '?' + urlencode(queryParams) -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social" + queryParamsStr) res = conn.getresponse() @@ -204,7 +204,7 @@ headers = { "User-Agent": "Test Agent" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social", headers= headers) @@ -235,7 +235,7 @@ headers = { "User-Agent": "Test Agent" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social" + queryParamsStr, headers= headers) @@ -251,7 +251,7 @@ print(data.decode("utf-8")) test('GET 12', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social") res = conn.getresponse() @@ -268,7 +268,7 @@ print(data.decode("utf-8")) test('HEAD 1', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("HEAD", "") res = conn.getresponse() @@ -283,7 +283,7 @@ print(data.decode("utf-8")) test('HEAD 2', () { const expectedCode = r"""import http.client -conn = http.client.HTTPConnection("api.foss42.com") +conn = http.client.HTTPConnection("api.apidash.dev") conn.request("HEAD", "") res = conn.getresponse() @@ -308,7 +308,7 @@ headers = { "content-type": "text/plain" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", body= body, headers= headers) @@ -333,7 +333,7 @@ headers = { "content-type": "application/json" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", body= body, headers= headers) @@ -359,7 +359,7 @@ headers = { "content-type": "application/json" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", body= body, headers= headers) diff --git a/test/codegen/python_requests_codegen_test.dart b/test/codegen/python_requests_codegen_test.dart index 1387accf..3ed0a38a 100644 --- a/test/codegen/python_requests_codegen_test.dart +++ b/test/codegen/python_requests_codegen_test.dart @@ -9,7 +9,7 @@ void main() { test('GET 1', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' response = requests.get(url) @@ -23,7 +23,7 @@ print('Response Body:', response.text) test('GET 2', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/country/data' +url = 'https://api.apidash.dev/country/data' params = { "code": "US" @@ -41,7 +41,7 @@ print('Response Body:', response.text) test('GET 3', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/country/data' +url = 'https://api.apidash.dev/country/data' params = { "code": "IND" @@ -59,7 +59,7 @@ print('Response Body:', response.text) test('GET 4', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' params = { "num": "8700000", @@ -121,7 +121,7 @@ print('Response Body:', response.text) test('GET 7', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' response = requests.get(url) @@ -157,7 +157,7 @@ print('Response Body:', response.text) test('GET 9', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' params = { "num": "8700000", @@ -176,7 +176,7 @@ print('Response Body:', response.text) test('GET 10', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' headers = { "User-Agent": "Test Agent" @@ -198,7 +198,7 @@ print('Response Body:', response.text) test('GET 11', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' params = { "num": "8700000", @@ -221,7 +221,7 @@ print('Response Body:', response.text) test('GET 12', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' response = requests.get(url) @@ -237,7 +237,7 @@ print('Response Body:', response.text) test('HEAD 1', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' response = requests.head(url) @@ -251,7 +251,7 @@ print('Response Body:', response.text) test('HEAD 2', () { const expectedCode = r"""import requests -url = 'http://api.foss42.com' +url = 'http://api.apidash.dev' response = requests.head(url) @@ -267,7 +267,7 @@ print('Response Body:', response.text) test('POST 1', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/case/lower' +url = 'https://api.apidash.dev/case/lower' payload = r'''{ "text": "I LOVE Flutter" @@ -289,7 +289,7 @@ print('Response Body:', response.text) test('POST 2', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/case/lower' +url = 'https://api.apidash.dev/case/lower' payload = { "text": "I LOVE Flutter" @@ -307,7 +307,7 @@ print('Response Body:', response.text) test('POST 3', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/case/lower' +url = 'https://api.apidash.dev/case/lower' payload = { "text": "I LOVE Flutter" diff --git a/test/models/request_model_test.dart b/test/models/request_model_test.dart index 626727de..1bb40ec7 100644 --- a/test/models/request_model_test.dart +++ b/test/models/request_model_test.dart @@ -52,7 +52,7 @@ void main() { RequestModel requestModel = RequestModel( id: '1', method: HTTPVerb.post, - url: 'api.foss42.com/case/lower', + url: 'api.apidash.dev/case/lower', name: 'foss42 api', requestHeaders: const [ NameValueModel(name: 'content-length', value: '18'), @@ -69,7 +69,7 @@ void main() { RequestModel requestModelDup = const RequestModel( id: '1', method: HTTPVerb.post, - url: 'api.foss42.com/case/lower', + url: 'api.apidash.dev/case/lower', name: 'foss42 api', requestHeaders: [ NameValueModel(name: 'content-length', value: '18'), @@ -84,7 +84,7 @@ void main() { RequestModel requestModelCopy = const RequestModel( id: '1', method: HTTPVerb.post, - url: 'api.foss42.com/case/lower', + url: 'api.apidash.dev/case/lower', name: 'foss42 api (copy)', requestHeaders: [ NameValueModel(name: 'content-length', value: '18'), @@ -99,7 +99,7 @@ void main() { Map requestModelAsJson = { "id": '1', "method": 'post', - "url": 'api.foss42.com/case/lower', + "url": 'api.apidash.dev/case/lower', "name": 'foss42 api', 'description': '', "requestHeaders": { @@ -138,7 +138,7 @@ void main() { final requestModeDupString = [ "Request Id: 1", "Request Method: post", - "Request URL: api.foss42.com/case/lower", + "Request URL: api.apidash.dev/case/lower", "Request Name: foss42 api", "Request Description: ", "Request Tab Index: 0", diff --git a/test/models/response_model_test.dart b/test/models/response_model_test.dart index 1122b833..d3553a27 100644 --- a/test/models/response_model_test.dart +++ b/test/models/response_model_test.dart @@ -81,19 +81,19 @@ void main() { test('Testing fromResponse', () async { final response = await http.get( - Uri.parse('https://api.foss42.com/'), + Uri.parse('https://api.apidash.dev/'), ); final responseData = responseModel.fromResponse(response: response); expect(responseData.statusCode, 200); expect(responseData.body, - '{"message":"Check out https://foss42.com for API docs to get started."}'); + '{"data":"Check out https://api.apidash.dev/docs to get started."}'); expect(responseData.formattedBody, '''{ - "message": "Check out https://foss42.com for API docs to get started." + "data": "Check out https://api.apidash.dev/docs to get started." }'''); }); test('Testing fromResponse for contentType not Json', () async { final response = await http.get( - Uri.parse('https://foss42.com/'), + Uri.parse('https://apidash.dev/'), ); final responseData = responseModel.fromResponse(response: response); expect(responseData.statusCode, 200); diff --git a/test/request_models.dart b/test/request_models.dart index e19c08a0..0c3d85e2 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -1,17 +1,18 @@ -import 'package:apidash/models/models.dart' show NameValueModel, RequestModel, FormDataModel; +import 'package:apidash/models/models.dart' + show FormDataModel, NameValueModel, RequestModel; import 'package:apidash/consts.dart'; /// Basic GET request model const requestModelGet1 = RequestModel( id: 'get1', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.get, ); /// GET request model with query params const requestModelGet2 = RequestModel( id: 'get2', - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'code', value: 'US'), @@ -21,7 +22,7 @@ const requestModelGet2 = RequestModel( /// GET request model with override query params const requestModelGet3 = RequestModel( id: 'get3', - url: 'https://api.foss42.com/country/data?code=US', + url: 'https://api.apidash.dev/country/data?code=US', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'code', value: 'IND'), @@ -31,7 +32,7 @@ const requestModelGet3 = RequestModel( /// GET request model with different types of query params const requestModelGet4 = RequestModel( id: 'get4', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -68,7 +69,7 @@ const requestModelGet6 = RequestModel( /// GET request model with body const requestModelGet7 = RequestModel( id: 'get7', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.get, requestBodyContentType: ContentType.text, requestBody: @@ -93,7 +94,7 @@ const requestModelGet8 = RequestModel( /// GET request model with some params enabled const requestModelGet9 = RequestModel( id: 'get9', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -112,7 +113,7 @@ const requestModelGet9 = RequestModel( /// GET Request model with some headers enabled const requestModelGet10 = RequestModel( id: 'get10', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestHeaders: [ NameValueModel(name: 'User-Agent', value: 'Test Agent'), @@ -127,7 +128,7 @@ const requestModelGet10 = RequestModel( /// GET Request model with some headers & URL parameters enabled const requestModelGet11 = RequestModel( id: 'get11', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -154,7 +155,7 @@ const requestModelGet11 = RequestModel( /// Request model with all headers & URL parameters disabled const requestModelGet12 = RequestModel( id: 'get12', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -181,21 +182,21 @@ const requestModelGet12 = RequestModel( /// Basic HEAD request model const requestModelHead1 = RequestModel( id: 'head1', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.head, ); /// Without URI Scheme (pass default as http) const requestModelHead2 = RequestModel( id: 'head2', - url: 'api.foss42.com', + url: 'api.apidash.dev', method: HTTPVerb.head, ); /// Basic POST request model (txt body) const requestModelPost1 = RequestModel( id: 'post1', - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: HTTPVerb.post, requestBody: r"""{ "text": "I LOVE Flutter" @@ -205,7 +206,7 @@ const requestModelPost1 = RequestModel( /// POST request model with JSON body const requestModelPost2 = RequestModel( id: 'post2', - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: HTTPVerb.post, requestBody: r"""{ "text": "I LOVE Flutter" @@ -215,7 +216,7 @@ const requestModelPost2 = RequestModel( /// POST request model with headers const requestModelPost3 = RequestModel( id: 'post3', - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: HTTPVerb.post, requestBody: r"""{ "text": "I LOVE Flutter" @@ -226,16 +227,103 @@ const requestModelPost3 = RequestModel( ], ); -/// POST request model with FormData +/// POST request model with multipart body(text) const requestModelPost4 = RequestModel( - id: 'post3', - url: 'https://api.foss42.com/case/lower', + id: 'post4', + url: 'https://api.apidash.dev/io/form', method: HTTPVerb.post, - requestFormDataList: [FormDataModel(name: "text", value: "I LOVE Flutter", type: FormDataType.text)], + requestFormDataList: [ + FormDataModel(name: "text", value: "API", type: FormDataType.text), + FormDataModel(name: "sep", value: "|", type: FormDataType.text), + FormDataModel(name: "times", value: "3", type: FormDataType.text), + ], requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body and headers +const requestModelPost5 = RequestModel( + id: 'post5', + url: 'https://api.apidash.dev/io/form', + method: HTTPVerb.post, + requestFormDataList: [ + FormDataModel(name: "text", value: "API", type: FormDataType.text), + FormDataModel(name: "sep", value: "|", type: FormDataType.text), + FormDataModel(name: "times", value: "3", type: FormDataType.text), + ], requestHeaders: [ NameValueModel(name: 'User-Agent', value: 'Test Agent'), ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body(text, file) +const requestModelPost6 = RequestModel( + id: 'post6', + url: 'https://api.apidash.dev/io/img', + method: HTTPVerb.post, + requestFormDataList: [ + FormDataModel(name: "token", value: "xyz", type: FormDataType.text), + FormDataModel( + name: "imfile", value: "/Documents/up/1.png", type: FormDataType.file), + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body and requestBody (the requestBody shouldn't be in codegen) +const requestModelPost7 = RequestModel( + id: 'post7', + url: 'https://api.apidash.dev/io/img', + method: HTTPVerb.post, + requestBody: r"""{ +"text": "I LOVE Flutter" +}""", + requestFormDataList: [ + FormDataModel(name: "token", value: "xyz", type: FormDataType.text), + FormDataModel( + name: "imfile", value: "/Documents/up/1.png", type: FormDataType.file), + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body and requestParams +const requestModelPost8 = RequestModel( + id: 'post8', + url: 'https://api.apidash.dev/io/form', + method: HTTPVerb.post, + requestFormDataList: [ + FormDataModel(name: "text", value: "API", type: FormDataType.text), + FormDataModel(name: "sep", value: "|", type: FormDataType.text), + FormDataModel(name: "times", value: "3", type: FormDataType.text), + ], + requestParams: [ + NameValueModel(name: 'size', value: '2'), + NameValueModel(name: 'len', value: '3'), + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body(file and text), requestParams, requestHeaders and requestBody +const requestModelPost9 = RequestModel( + id: 'post9', + url: 'https://api.apidash.dev/io/img', + method: HTTPVerb.post, + requestBody: r"""{ +"text": "I LOVE Flutter" +}""", + requestFormDataList: [ + FormDataModel(name: "token", value: "xyz", type: FormDataType.text), + FormDataModel( + name: "imfile", value: "/Documents/up/1.png", type: FormDataType.file), + ], + requestParams: [ + NameValueModel(name: 'size', value: '2'), + NameValueModel(name: 'len', value: '3'), + ], + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Keep-Alive', value: 'true'), + ], + requestBodyContentType: ContentType.formdata, ); /// PUT request model diff --git a/test/utils/file_utils_test.dart b/test/utils/file_utils_test.dart index 18e2816a..26e90e39 100644 --- a/test/utils/file_utils_test.dart +++ b/test/utils/file_utils_test.dart @@ -1,3 +1,4 @@ +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; import 'package:apidash/utils/file_utils.dart'; @@ -11,8 +12,13 @@ void main() { }); test('Test getShortPath', () { - String path = "A/B/C/D.csv"; - expect(getShortPath(path), ".../C/D.csv"); + if (kIsWindows) { + String path = r"A\B\C\D.csv"; + expect(getShortPath(path), r"...\C\D.csv"); + } else { + String path = "A/B/C/D.csv"; + expect(getShortPath(path), ".../C/D.csv"); + } }); test('Test getTempFileName', () { diff --git a/test/utils/har_utils_test.dart b/test/utils/har_utils_test.dart index e3319fad..174ab180 100644 --- a/test/utils/har_utils_test.dart +++ b/test/utils/har_utils_test.dart @@ -101,7 +101,7 @@ void main() { 'request': { 'method': 'GET', 'url': - 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true', + 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true', 'httpVersion': 'HTTP/1.1', 'queryString': [ {'name': 'num', 'value': '8700000', 'comment': ''}, @@ -162,7 +162,7 @@ void main() { }, 'request': { 'method': 'POST', - 'url': 'https://api.foss42.com/case/lower', + 'url': 'https://api.apidash.dev/case/lower', 'httpVersion': 'HTTP/1.1', 'queryString': [], 'headers': [ @@ -252,7 +252,7 @@ void main() { test('Test requestModelToHARJsonRequest exportMode=true', () { Map expectedResult = { 'method': 'POST', - 'url': 'https://api.foss42.com/case/lower', + 'url': 'https://api.apidash.dev/case/lower', 'httpVersion': 'HTTP/1.1', 'queryString': [], 'headers': [ @@ -282,7 +282,7 @@ void main() { Map expectedResult = { 'method': 'GET', 'url': - 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true', + 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true', 'httpVersion': 'HTTP/1.1', 'queryString': [ {'name': 'num', 'value': '8700000'}, @@ -301,7 +301,7 @@ void main() { test('Test requestModelToHARJsonRequest useEnabled=true', () { Map expectedResult = { 'method': 'GET', - 'url': 'https://api.foss42.com/humanize/social?num=8700000&digits=3', + 'url': 'https://api.apidash.dev/humanize/social?num=8700000&digits=3', 'httpVersion': 'HTTP/1.1', 'queryString': [ {'name': 'num', 'value': '8700000'}, diff --git a/test/utils/header_utils_test.dart b/test/utils/header_utils_test.dart index 73c15721..139ba553 100644 --- a/test/utils/header_utils_test.dart +++ b/test/utils/header_utils_test.dart @@ -115,6 +115,7 @@ void main() { String pattern = "x-"; List expected = [ "Access-Control-Max-Age", + "Max-Forwards", "X-Api-Key", "X-Content-Type-Options", "X-CSRF-Token", diff --git a/test/utils/http_utils_test.dart b/test/utils/http_utils_test.dart index 55129bcc..2b660fcb 100644 --- a/test/utils/http_utils_test.dart +++ b/test/utils/http_utils_test.dart @@ -19,14 +19,14 @@ void main() { }); test('Testing getRequestTitleFromUrl using url3', () { - String url3 = "https://api.foss42.com/country/codes"; - String title3Expected = "api.foss42.com/country/codes"; + String url3 = "https://api.apidash.dev/country/codes"; + String title3Expected = "api.apidash.dev/country/codes"; expect(getRequestTitleFromUrl(url3), title3Expected); }); test('Testing getRequestTitleFromUrl using url4', () { - String url4 = "api.foss42.com/country/data"; - String title4Expected = "api.foss42.com/country/data"; + String url4 = "api.apidash.dev/country/data"; + String title4Expected = "api.apidash.dev/country/data"; expect(getRequestTitleFromUrl(url4), title4Expected); }); @@ -175,11 +175,11 @@ void main() { group("Testing getValidRequestUri", () { test('Testing getValidRequestUri for normal values', () { - String url1 = "https://api.foss42.com/country/data"; + String url1 = "https://api.apidash.dev/country/data"; const kvRow1 = NameValueModel(name: "code", value: "US"); Uri uri1Expected = Uri( scheme: 'https', - host: 'api.foss42.com', + host: 'api.apidash.dev', path: 'country/data', queryParameters: {'code': 'US'}); expect(getValidRequestUri(url1, [kvRow1]), (uri1Expected, null)); @@ -193,11 +193,11 @@ void main() { expect(getValidRequestUri("", [kvRow3]), (null, "URL is missing!")); }); test('Testing getValidRequestUri when https is not provided in url', () { - String url4 = "api.foss42.com/country/data"; + String url4 = "api.apidash.dev/country/data"; const kvRow4 = NameValueModel(name: "code", value: "US"); Uri uri4Expected = Uri( scheme: 'https', - host: 'api.foss42.com', + host: 'api.apidash.dev', path: 'country/data', queryParameters: {'code': 'US'}); expect(getValidRequestUri(url4, [kvRow4]), (uri4Expected, null)); @@ -217,20 +217,20 @@ void main() { }); test('Testing getValidRequestUri when query params in both url and kvrow', () { - String url6 = "api.foss42.com/country/data?code=IND"; + String url6 = "api.apidash.dev/country/data?code=IND"; const kvRow6 = NameValueModel(name: "code", value: "US"); Uri uri6Expected = Uri( scheme: 'https', - host: 'api.foss42.com', + host: 'api.apidash.dev', path: 'country/data', queryParameters: {'code': 'US'}); expect(getValidRequestUri(url6, [kvRow6]), (uri6Expected, null)); }); test('Testing getValidRequestUri when kvrow is null', () { - String url7 = "api.foss42.com/country/data?code=US"; + String url7 = "api.apidash.dev/country/data?code=US"; Uri uri7Expected = Uri( scheme: 'https', - host: 'api.foss42.com', + host: 'api.apidash.dev', path: 'country/data', queryParameters: {'code': 'US'}); expect(getValidRequestUri(url7, null), (uri7Expected, null)); diff --git a/test/widget_test.dart b/test/widget_test.dart index 48eb1d93..3f806c72 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,3 +1,6 @@ +// ignore_for_file: unused_import +// TODO: Added ignore to calculate code coverage + import 'package:apidash/main.dart'; import 'package:apidash/app.dart'; import 'package:apidash/common/utils.dart'; diff --git a/test/widgets/buttons_test.dart b/test/widgets/buttons_test.dart index bc568308..2b961e07 100644 --- a/test/widgets/buttons_test.dart +++ b/test/widgets/buttons_test.dart @@ -36,8 +36,7 @@ void main() { theme: kThemeDataLight, home: Scaffold( body: SendRequestButton( - selectedId: '1', - sentRequestId: null, + isWorking: false, onTap: () { changedValue = 'Send'; }, @@ -55,7 +54,8 @@ void main() { expect(changedValue, 'Send'); }); - testWidgets('Testing for Send Request button when sentRequestId is not null', + testWidgets( + 'Testing for Send Request button when RequestModel is viewed and is waiting for response', (tester) async { await tester.pumpWidget( MaterialApp( @@ -63,32 +63,7 @@ void main() { theme: kThemeDataLight, home: Scaffold( body: SendRequestButton( - selectedId: '1', - sentRequestId: '2', - onTap: () {}, - ), - ), - ), - ); - - expect(find.byIcon(Icons.send), findsNothing); - expect(find.text(kLabelBusy), findsOneWidget); - final button1 = find.byType(FilledButton); - expect(button1, findsOneWidget); - - expect(tester.widget(button1).enabled, isFalse); - }); - - testWidgets('Testing for Send Request button when sentRequestId = selectedId', - (tester) async { - await tester.pumpWidget( - MaterialApp( - title: 'Send Request button', - theme: kThemeDataLight, - home: Scaffold( - body: SendRequestButton( - selectedId: '1', - sentRequestId: '1', + isWorking: true, onTap: () {}, ), ), diff --git a/test/widgets/cards_test.dart b/test/widgets/cards_test.dart index e364d5eb..ae62ef55 100644 --- a/test/widgets/cards_test.dart +++ b/test/widgets/cards_test.dart @@ -17,7 +17,7 @@ void main() { SidebarRequestCard( id: '23', selectedId: '2', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.get, onTap: () { changedValue = 'Single Tapped'; @@ -34,11 +34,11 @@ void main() { expect(find.byType(InkWell), findsOneWidget); - expect(find.text('api.foss42.com'), findsOneWidget); - expect(find.widgetWithText(SizedBox, 'api.foss42.com'), findsOneWidget); - expect(find.widgetWithText(Card, 'api.foss42.com'), findsOneWidget); + expect(find.text('api.apidash.dev'), findsOneWidget); + expect(find.widgetWithText(SizedBox, 'api.apidash.dev'), findsOneWidget); + expect(find.widgetWithText(Card, 'api.apidash.dev'), findsOneWidget); await tester.pumpAndSettle(); - var tappable = find.widgetWithText(Card, 'api.foss42.com'); + var tappable = find.widgetWithText(Card, 'api.apidash.dev'); await tester.tap(tappable); await tester.pumpAndSettle(const Duration(seconds: 2)); expect(changedValue, 'Single Tapped'); @@ -63,7 +63,7 @@ void main() { id: '2', selectedId: '2', editRequestId: '2', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.get, onTapOutsideNameEditor: () { changedValue = 'Tapped Outside'; diff --git a/test/widgets/code_previewer_test.dart b/test/widgets/code_previewer_test.dart index 6fd77b4f..56bb3384 100644 --- a/test/widgets/code_previewer_test.dart +++ b/test/widgets/code_previewer_test.dart @@ -9,7 +9,7 @@ void main() { String code = r'''import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/codes'); + var uri = Uri.parse('https://api.apidash.dev/country/codes'); final response = await http.get(uri); diff --git a/test/widgets/codegen_previewer_test.dart b/test/widgets/codegen_previewer_test.dart index 8310087e..cc337d2c 100644 --- a/test/widgets/codegen_previewer_test.dart +++ b/test/widgets/codegen_previewer_test.dart @@ -9,7 +9,7 @@ void main() { String code = r'''import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/codes'); + var uri = Uri.parse('https://api.apidash.dev/country/codes'); final response = await http.get(uri); diff --git a/test/widgets/intro_message_test.dart b/test/widgets/intro_message_test.dart index 798afad8..4e256c82 100644 --- a/test/widgets/intro_message_test.dart +++ b/test/widgets/intro_message_test.dart @@ -1,9 +1,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:apidash/widgets/intro_message.dart'; +import 'package:package_info_plus/package_info_plus.dart'; void main() { testWidgets('Testing Intro Message', (tester) async { + PackageInfo.setMockInitialValues( + appName: 'API Dash', + packageName: 'dev.apidash.apidash', + version: '1.0.0', + buildNumber: '1', + buildSignature: 'buildSignature'); await tester.pumpWidget( const MaterialApp( title: 'Intro Message', @@ -13,7 +20,7 @@ void main() { ), ); - await tester.pumpAndSettle(); + await tester.pump(); expect(find.text('Welcome to API Dash ⚡️'), findsOneWidget); expect(find.byType(RichText), findsAtLeastNWidgets(1)); @@ -25,5 +32,5 @@ void main() { expect(find.byIcon(Icons.star), findsOneWidget); expect(find.text('Star on GitHub'), findsOneWidget); await tester.tap(find.byIcon(Icons.star)); - }, skip: true); + }); } 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); + }); + }); } diff --git a/test/widgets/previewer_test.dart b/test/widgets/previewer_test.dart index 0d2f68cd..c26793bb 100644 --- a/test/widgets/previewer_test.dart +++ b/test/widgets/previewer_test.dart @@ -231,4 +231,26 @@ void main() { await tester.pumpAndSettle(); expect(find.text(kSvgError), findsOneWidget); }); + + testWidgets('Testing when type/subtype is text/csv', (tester) async { + String csvDataString = + 'Id,Name,Age\n1,John Doe,40\n2,Dbestech,41\n3,Voldermort,71\n4,Joe Biden,80\n5,Ryo Hanamura,35'; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Previewer( + type: kTypeText, + subtype: kSubTypeCsv, + bytes: Uint8List.fromList([]), + body: csvDataString, + ), + ), + ), + ); + + expect(find.byType(DataTable), findsOneWidget); + expect(find.text('John Doe'), findsOneWidget); + expect(find.text('41'), findsOneWidget); + }); } diff --git a/test/widgets/response_widgets_test.dart b/test/widgets/response_widgets_test.dart index 1aebc539..7877a285 100644 --- a/test/widgets/response_widgets_test.dart +++ b/test/widgets/response_widgets_test.dart @@ -201,7 +201,7 @@ void main() { RequestModel requestModel = const RequestModel( id: '1', method: HTTPVerb.post, - url: 'api.foss42.com/case/lower', + url: 'api.apidash.dev/case/lower', name: 'foss42 api', requestHeaders: [ NameValueModel(name: 'content-length', value: '18'), @@ -372,7 +372,7 @@ void main() { String code = r'''import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/codes'); + var uri = Uri.parse('https://api.apidash.dev/country/codes'); final response = await http.get(uri); diff --git a/test/widgets/textfields_test.dart b/test/widgets/textfields_test.dart index 652ec8ec..88aa6392 100644 --- a/test/widgets/textfields_test.dart +++ b/test/widgets/textfields_test.dart @@ -57,4 +57,41 @@ void main() { await tester.pumpAndSettle(); expect(find.text('entering 123 for cell field'), findsOneWidget); }); + + testWidgets('URL Field sends request on enter keystroke', (tester) async { + bool wasSubmitCalled = false; + + void testSubmit(String val) { + wasSubmitCalled = true; + } + + await tester.pumpWidget( + MaterialApp( + title: 'URL Field', + theme: kThemeDataDark, + home: Scaffold( + body: Column(children: [ + URLField( + selectedId: '2', + onFieldSubmitted: testSubmit, + ) + ]), + ), + ), + ); + + // ensure URLField is blank + expect(find.byType(TextFormField), findsOneWidget); + expect(find.textContaining('Enter API endpoint '), findsOneWidget); + expect(wasSubmitCalled, false); + + // modify value and press enter + var txtForm = find.byKey(const Key("url-2")); + await tester.enterText(txtForm, 'entering 123'); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pump(); + + // check if value was updated + expect(wasSubmitCalled, true); + }); }