Merge branch 'master' of git.curoverse.com:arvados into 11876-r-sdk
[arvados.git] / sdk / R / tests / testthat / fakes / FakeHttpRequest.R
1 FakeHttpRequest <- R6::R6Class(
2
3     "FakeHttpRequest",
4
5     public = list(
6
7         serverMaxElementsPerRequest = NULL,
8
9         content                                 = NULL,
10         expectedURL                             = NULL,
11         URLIsProperlyConfigured                 = NULL,
12         expectedQueryFilters                    = NULL,
13         queryFiltersAreCorrect                  = NULL,
14         requestHeaderContainsAuthorizationField = NULL,
15         requestHeaderContainsDestinationField   = NULL,
16         requestHeaderContainsRangeField         = NULL,
17         requestHeaderContainsContentTypeField   = NULL,
18         JSONEncodedBodyIsProvided               = NULL,
19         requestBodyIsProvided                   = NULL,
20
21         numberOfGETRequests    = NULL,
22         numberOfDELETERequests = NULL,
23         numberOfPUTRequests    = NULL,
24         numberOfPOSTRequests   = NULL,
25         numberOfMOVERequests   = NULL,
26
27         initialize = function(expectedURL      = NULL,
28                               serverResponse   = NULL,
29                               expectedFilters  = NULL)
30         {
31             if(is.null(serverResponse))
32             {
33                 self$content <- list()
34                 self$content$status_code <- 200
35             }
36             else
37                 self$content <- serverResponse
38
39             self$expectedURL <- expectedURL
40             self$URLIsProperlyConfigured <- FALSE
41             self$expectedQueryFilters <- expectedFilters
42             self$queryFiltersAreCorrect <- FALSE
43             self$requestHeaderContainsAuthorizationField <- FALSE
44             self$requestHeaderContainsDestinationField <- FALSE
45             self$requestHeaderContainsRangeField <- FALSE
46             self$requestHeaderContainsContentTypeField <- FALSE
47             self$JSONEncodedBodyIsProvided <- FALSE
48             self$requestBodyIsProvided <- FALSE
49
50             self$numberOfGETRequests <- 0
51             self$numberOfDELETERequests <- 0
52             self$numberOfPUTRequests <- 0
53             self$numberOfPOSTRequests <- 0
54             self$numberOfMOVERequests <- 0
55
56             self$serverMaxElementsPerRequest <- 5
57         },
58
59         GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
60         {
61             private$validateURL(url)
62             private$validateHeaders(headers)
63             private$validateFilters(queryFilters)
64             self$numberOfGETRequests <- self$numberOfGETRequests + 1
65
66             if(!is.null(self$content$items_available))
67             {
68                 return(private$getElements(offset, limit))
69             }
70             else
71                 return(self$content)
72         },
73
74         PUT = function(url, headers = NULL, body = NULL,
75                        queryFilters = NULL, limit = NULL, offset = NULL)
76         {
77             private$validateURL(url)
78             private$validateHeaders(headers)
79             private$validateBody(body)
80             self$numberOfPUTRequests <- self$numberOfPUTRequests + 1
81
82             self$content
83         },
84
85         POST = function(url, headers = NULL, body = NULL,
86                         queryFilters = NULL, limit = NULL, offset = NULL)
87         {
88             private$validateURL(url)
89             private$validateHeaders(headers)
90             private$validateBody(body)
91             self$numberOfPOSTRequests <- self$numberOfPOSTRequests + 1
92
93             self$content
94         },
95
96         DELETE = function(url, headers = NULL, body = NULL,
97                           queryFilters = NULL, limit = NULL, offset = NULL)
98         {
99             private$validateURL(url)
100             private$validateHeaders(headers)
101             self$numberOfDELETERequests <- self$numberOfDELETERequests + 1
102             self$content
103         },
104
105         PROPFIND = function(url, headers = NULL)
106         {
107             private$validateURL(url)
108             private$validateHeaders(headers)
109             self$content
110         },
111
112         MOVE = function(url, headers = NULL)
113         {
114             private$validateURL(url)
115             private$validateHeaders(headers)
116             self$numberOfMOVERequests <- self$numberOfMOVERequests + 1
117             self$content
118         }
119     ),
120
121     private = list(
122
123         validateURL = function(url) 
124         {
125             if(!is.null(self$expectedURL) && url == self$expectedURL)
126                 self$URLIsProperlyConfigured <- TRUE
127         },
128
129         validateHeaders = function(headers) 
130         {
131             if(!is.null(headers$Authorization))
132                 self$requestHeaderContainsAuthorizationField <- TRUE
133
134             if(!is.null(headers$Destination))
135                 self$requestHeaderContainsDestinationField <- TRUE
136
137             if(!is.null(headers$Range))
138                 self$requestHeaderContainsRangeField <- TRUE
139
140             if(!is.null(headers[["Content-Type"]]))
141                 self$requestHeaderContainsContentTypeField <- TRUE
142         },
143
144         validateBody = function(body)
145         {
146             if(!is.null(body) && class(body) == "json")           
147                 self$JSONEncodedBodyIsProvided <- TRUE
148
149             if(!is.null(body))           
150             {
151                 self$requestBodyIsProvided <- TRUE
152
153                 if(class(body) == "json")           
154                     self$JSONEncodedBodyIsProvided <- TRUE
155             }
156         },
157
158         validateFilters = function(filters)
159         {
160             if(!is.null(self$expectedQueryFilters) &&
161                !is.null(filters) &&
162                all.equal(unname(filters), self$expectedQueryFilters))
163             {
164                 self$queryFiltersAreCorrect <- TRUE
165             }
166         },
167
168         getElements = function(offset, limit)
169         {
170             start <- 1
171             elementCount <- self$serverMaxElementsPerRequest
172
173             if(!is.null(offset))
174             {
175                 if(offset > self$content$items_available)
176                     stop("Invalid offset")
177                 
178                 start <- offset + 1
179             }
180
181             if(!is.null(limit))
182                 if(limit < self$serverMaxElementsPerRequest)
183                     elementCount <- limit - 1
184
185
186             serverResponse <- list()
187             serverResponse$items_available <- self$content$items_available
188             serverResponse$items <- self$content$items[start:(start + elementCount - 1)]
189
190             if(start + elementCount > self$content$items_available)
191             {
192                 elementCount = self$content$items_available - start
193                 serverResponse$items <- self$content$items[start:(start + elementCount)]
194             }
195
196             serverResponse
197         }
198     ),
199
200     cloneable = FALSE
201 )