Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da299cb0 authored by David Luhmer's avatar David Luhmer
Browse files

add support for "FormUrlEncoded", "Field" and "FieldMap"

parent 37fff4a0
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -33,6 +33,9 @@ import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
@@ -58,6 +61,7 @@ public class NextcloudRetrofitServiceMethod<T> {
    private @Nullable Headers headers;
    private Type returnType;
    private boolean followRedirects = false;
    private boolean formUrlEncoded = false;

    private final NextcloudRequest.Builder requestBuilder;

@@ -118,6 +122,18 @@ public class NextcloudRetrofitServiceMethod<T> {
                    headers.put(((Header) annotation).value(), arg);
                }
                rBuilder.setHeader(headers);
            } else if(annotation instanceof FieldMap) {
                if(args[i] != null) {
                    Map<String, Object> fieldMap = (HashMap<String, Object>) args[i];
                    for (String key : fieldMap.keySet()) {
                        parameters.put(key, fieldMap.get(key).toString());
                    }
                }
            } else if(annotation instanceof Field) {
                if(args[i] != null) {
                    String field = args[i].toString();
                    parameters.put(((Field)annotation).value(), field);
                }
            } else {
                throw new UnsupportedOperationException("don't know this type yet.. [" + String.valueOf(annotation) + "]");
            }
@@ -173,6 +189,8 @@ public class NextcloudRetrofitServiceMethod<T> {
                throw methodError(method, "@Headers annotation is empty.");
            }
            headers = parseHeaders(headersToParse);
        } else if(annotation instanceof FormUrlEncoded) {
            formUrlEncoded = true;
        } else if(annotation instanceof NextcloudAPI.FollowRedirects) {
            followRedirects = true;
        } else {
+11 −0
Original line number Diff line number Diff line
@@ -8,6 +8,9 @@ import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
@@ -91,4 +94,12 @@ public interface API {
    @GET("/test")
    Call<Void> getFollowRedirects();

    @FormUrlEncoded
    @POST("/test")
    Call<ResponseBody> postFormUrlEncodedFieldMap(@FieldMap Map<String, String> fields);

    @FormUrlEncoded
    @POST("/test")
    Call<ResponseBody> postFormUrlEncodedField(@Field("name") String name);

}
+53 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import java.util.List;
import java.util.Map;

import io.reactivex.Completable;
import okhttp3.ResponseBody;
import retrofit2.NextcloudRetrofitApiBuilder;

import static junit.framework.TestCase.fail;
@@ -362,4 +363,56 @@ public class TestRetrofitAPI {
            fail(e.getMessage());
        }
    }


    @Test
    public void testFormUrlEncodedFieldMap() {
        Map<String, String> map = new HashMap<>();
        try {
            map.put("key", "value");
            mApi.postFormUrlEncodedFieldMap(map).execute();
        } catch (IOException e) {
            fail(e.getMessage());
        }

        NextcloudRequest request = new NextcloudRequest.Builder()
                .setMethod("POST")
                .setUrl(mApiEndpoint + "test")
                .setParameter(map)
                .build();

        Type type = new TypeToken<ResponseBody>() {}.getType();
        try {
            verify(nextcloudApiMock).performRequest(eq(type), eq(request));
        } catch (Exception e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void testFormUrlEncodedField() {
        String name = "myname";
        try {
            mApi.postFormUrlEncodedField(name).execute();
        } catch (IOException e) {
            fail(e.getMessage());
        }

        Map<String, String> map = new HashMap<>();
        map.put("name", name);

        NextcloudRequest request = new NextcloudRequest.Builder()
                .setMethod("POST")
                .setUrl(mApiEndpoint + "test")
                .setParameter(map)
                .build();

        Type type = new TypeToken<ResponseBody>() {}.getType();
        try {
            verify(nextcloudApiMock).performRequest(eq(type), eq(request));
        } catch (Exception e) {
            fail(e.getMessage());
        }
    }

}