mirror of
https://github.com/foss42/apidash.git
synced 2025-06-18 21:04:37 +08:00
resolved issue #178(switch from GET->POST if payload exists)
This commit is contained in:
@ -1,3 +1,6 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:apidash/providers/providers.dart';
|
||||
@ -17,6 +20,25 @@ class EditRequestBody extends ConsumerWidget {
|
||||
final contentType = ref.watch(selectedRequestModelProvider
|
||||
.select((value) => value?.httpRequestModel?.bodyContentType));
|
||||
|
||||
void changeToPostMethod() {
|
||||
RequestModel? model = ref
|
||||
.read(collectionStateNotifierProvider.notifier)
|
||||
.getRequestModel(selectedId);
|
||||
|
||||
if (model!.httpRequestModel!.method == HTTPVerb.get) {
|
||||
ref
|
||||
.read(collectionStateNotifierProvider.notifier)
|
||||
.update(selectedId, method: HTTPVerb.post);
|
||||
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
|
||||
content: Text(
|
||||
"Switched to POST method",
|
||||
style: TextStyle(color: Colors.white),
|
||||
),
|
||||
backgroundColor: Colors.black,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(
|
||||
@ -33,8 +55,11 @@ class EditRequestBody extends ConsumerWidget {
|
||||
),
|
||||
Expanded(
|
||||
child: switch (contentType) {
|
||||
ContentType.formdata =>
|
||||
const Padding(padding: kPh4, child: FormDataWidget()),
|
||||
ContentType.formdata => Padding(
|
||||
padding: kPh4,
|
||||
child: FormDataWidget(
|
||||
changeMethodToPost: changeToPostMethod,
|
||||
)),
|
||||
// TODO: Fix JsonTextFieldEditor & plug it here
|
||||
ContentType.json => Padding(
|
||||
padding: kPt5o10,
|
||||
@ -43,6 +68,7 @@ class EditRequestBody extends ConsumerWidget {
|
||||
fieldKey: "$selectedId-json-body-editor",
|
||||
initialValue: requestModel?.httpRequestModel?.body,
|
||||
onChanged: (String value) {
|
||||
changeToPostMethod();
|
||||
ref
|
||||
.read(collectionStateNotifierProvider.notifier)
|
||||
.update(selectedId, body: value);
|
||||
@ -56,6 +82,7 @@ class EditRequestBody extends ConsumerWidget {
|
||||
fieldKey: "$selectedId-body-editor",
|
||||
initialValue: requestModel?.httpRequestModel?.body,
|
||||
onChanged: (String value) {
|
||||
changeToPostMethod();
|
||||
ref
|
||||
.read(collectionStateNotifierProvider.notifier)
|
||||
.update(selectedId, body: value);
|
||||
|
@ -9,7 +9,8 @@ import 'package:apidash/utils/utils.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class FormDataWidget extends ConsumerStatefulWidget {
|
||||
const FormDataWidget({super.key});
|
||||
final Function changeMethodToPost;
|
||||
const FormDataWidget({required this.changeMethodToPost, super.key});
|
||||
@override
|
||||
ConsumerState<FormDataWidget> createState() => _FormDataBodyState();
|
||||
}
|
||||
@ -27,6 +28,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
|
||||
}
|
||||
|
||||
void _onFieldChange(String selectedId) {
|
||||
widget.changeMethodToPost();
|
||||
ref.read(collectionStateNotifierProvider.notifier).update(
|
||||
selectedId,
|
||||
formData: formRows.sublist(0, formRows.length - 1),
|
||||
@ -41,6 +43,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
|
||||
.select((value) => value?.httpRequestModel?.formData?.length));
|
||||
var rF = ref.read(selectedRequestModelProvider)?.httpRequestModel?.formData;
|
||||
bool isFormDataEmpty = rF == null || rF.isEmpty;
|
||||
|
||||
formRows = isFormDataEmpty
|
||||
? [
|
||||
kFormDataEmptyModel,
|
||||
|
@ -74,6 +74,7 @@ dependencies:
|
||||
url: https://github.com/foss42/curl_converter.git
|
||||
ref: 726e8cd04aeb326211af27f75920be5b21c90bb4
|
||||
|
||||
|
||||
dependency_overrides:
|
||||
web: ^0.5.0
|
||||
pdf_widget_wrapper: ^1.0.4
|
||||
|
50
test/providers/collection_providers_test.dart
Normal file
50
test/providers/collection_providers_test.dart
Normal file
@ -0,0 +1,50 @@
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/screens/home_page/editor_pane/details_card/request_pane/request_body.dart';
|
||||
import 'package:apidash/widgets/editor.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:apidash/providers/providers.dart';
|
||||
import 'helpers.dart';
|
||||
|
||||
void main() async {
|
||||
setUp(() async => await testSetUp());
|
||||
|
||||
testWidgets(
|
||||
'Request method changes from GET to POST when body is added and Snackbar is shown',
|
||||
(WidgetTester tester) async {
|
||||
// Set up the test environment
|
||||
final container = createContainer();
|
||||
final notifier = container.read(collectionStateNotifierProvider.notifier);
|
||||
|
||||
// Ensure the initial request is a GET request with no body
|
||||
final id = notifier.state!.entries.first.key;
|
||||
expect(
|
||||
notifier.getRequestModel(id)!.httpRequestModel!.method, HTTPVerb.get);
|
||||
expect(notifier.getRequestModel(id)!.httpRequestModel!.body, isNull);
|
||||
|
||||
// Build the EditRequestBody widget
|
||||
await tester.pumpWidget(
|
||||
ProviderScope(
|
||||
// ignore: deprecated_member_use
|
||||
parent: container,
|
||||
child: const MaterialApp(
|
||||
home: Scaffold(
|
||||
body: EditRequestBody(),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// Add a body to the request, which should trigger the method change
|
||||
await tester.enterText(find.byType(TextFieldEditor), 'new body added');
|
||||
await tester.pump(); // Process the state change
|
||||
|
||||
// Verify that the request method changed to POST
|
||||
expect(
|
||||
notifier.getRequestModel(id)!.httpRequestModel!.method, HTTPVerb.post);
|
||||
|
||||
// Verify that the Snackbar is shown
|
||||
expect(find.text('Switched to POST method'), findsOneWidget);
|
||||
});
|
||||
}
|
40
test/providers/helpers.dart
Normal file
40
test/providers/helpers.dart
Normal file
@ -0,0 +1,40 @@
|
||||
import 'package:apidash/services/hive_services.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
/// A testing utility which creates a [ProviderContainer] and automatically
|
||||
/// disposes it at the end of the test.
|
||||
ProviderContainer createContainer({
|
||||
ProviderContainer? parent,
|
||||
List<Override> overrides = const [],
|
||||
List<ProviderObserver>? observers,
|
||||
}) {
|
||||
// Create a ProviderContainer, and optionally allow specifying parameters.
|
||||
final container = ProviderContainer(
|
||||
parent: parent,
|
||||
overrides: overrides,
|
||||
observers: observers,
|
||||
);
|
||||
|
||||
// When the test ends, dispose the container.
|
||||
addTearDown(container.dispose);
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
Future<void> testSetUp() async {
|
||||
// override path_provider methodCall to point
|
||||
// path to temporary location for all unit tests
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
const MethodChannel channel =
|
||||
MethodChannel('plugins.flutter.io/path_provider');
|
||||
|
||||
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||
.setMockMethodCallHandler(channel, (MethodCall methodCall) async {
|
||||
return './test/unit-test-hive-storage/';
|
||||
});
|
||||
|
||||
await openBoxes();
|
||||
}
|
@ -1,6 +1,4 @@
|
||||
import 'dart:io';
|
||||
import 'package:spot/spot.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/providers/providers.dart';
|
||||
import 'package:apidash/screens/common_widgets/common_widgets.dart';
|
||||
import 'package:apidash/screens/dashboard.dart';
|
||||
|
Reference in New Issue
Block a user