-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Expand file tree
/
Copy pathDownloadFileTests.cs
More file actions
139 lines (110 loc) · 4.86 KB
/
DownloadFileTests.cs
File metadata and controls
139 lines (110 loc) · 4.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System.Net;
using System.Text;
using RestSharp.Extensions;
using RestSharp.Tests.Shared.Fixtures;
namespace RestSharp.Tests.Integrated;
public sealed class DownloadFileTests : IDisposable {
public DownloadFileTests() {
_server = HttpServerFixture.StartServer("Assets/Koala.jpg", FileHandler);
var options = new RestClientOptions(_server.Url) { ThrowOnAnyError = true };
_client = new RestClient(options);
_clientNoThrow = new RestClient(_server.Url);
}
public void Dispose() => _server.Dispose();
void FileHandler(HttpListenerRequest request, HttpListenerResponse response) {
var pathToFile = Path.Combine(
_path,
Path.Combine(
request.Url!.Segments.Select(s => s.Replace("/", "")).ToArray()
)
);
using var reader = new StreamReader(pathToFile);
reader.BaseStream.CopyTo(response.OutputStream);
}
readonly HttpServerFixture _server;
readonly RestClient _client;
readonly RestClient _clientNoThrow;
readonly string _path = AppDomain.CurrentDomain.BaseDirectory;
[Fact]
public async Task AdvancedResponseWriter_without_ResponseWriter_reads_stream() {
var tag = string.Empty;
// ReSharper disable once UseObjectOrCollectionInitializer
var rr = new RestRequest("Assets/Koala.jpg");
rr.AdvancedResponseWriter = (response, request) => {
var buf = new byte[16];
// ReSharper disable once MustUseReturnValue
response.Content.ReadAsStream().Read(buf, 0, buf.Length);
tag = Encoding.ASCII.GetString(buf, 6, 4);
return new RestResponse(request);
};
await _client.ExecuteAsync(rr);
Assert.True(string.Compare("JFIF", tag, StringComparison.Ordinal) == 0);
}
[Fact]
public async Task Handles_File_Download_Failure() {
var request = new RestRequest("Assets/Koala1.jpg");
var task = () => _client.DownloadDataAsync(request);
await task.Should().ThrowAsync<HttpRequestException>().WithMessage("Request failed with status code NotFound");
}
[Fact]
public async Task Handles_Binary_File_Download() {
var request = new RestRequest("Assets/Koala.jpg");
var response = await _client.DownloadDataAsync(request);
var expected = await File.ReadAllBytesAsync(Path.Combine(_path, "Assets", "Koala.jpg"));
Assert.Equal(expected, response);
}
[Fact]
public async Task Runs_ErrorHandler_On_Download_Request_Failure() {
var client = new RestClient("http://localhost:12345");
var request = new RestRequest("nonexisting");
RestResponse? errorResponse = null;
var stream = await client.DownloadStreamAsync(request, (r) => {
errorResponse = r;
});
Assert.Null(stream);
Assert.NotNull(errorResponse);
Assert.Equal(ResponseStatus.Error, errorResponse.ResponseStatus);
}
[Fact]
public async Task Runs_ErrorHandler_On_Download_Response_StatusCode_Not_Successful() {
var request = new RestRequest("Assets/Koala1.jpg");
RestResponse? errorResponse = null;
var stream = await _clientNoThrow.DownloadStreamAsync(request, (r) => {
errorResponse = r;
});
Assert.Null(stream);
Assert.NotNull(errorResponse);
Assert.Equal(ResponseStatus.Completed, errorResponse.ResponseStatus);
Assert.False(errorResponse.IsSuccessStatusCode);
Assert.Equal(HttpStatusCode.NotFound, errorResponse.StatusCode);
}
[Fact]
public async Task Doesnt_Run_ErrorHandler_On_Download_Success() {
var request = new RestRequest("Assets/Koala.jpg");
RestResponse? errorResponse = null;
var stream = await _clientNoThrow.DownloadStreamAsync(request, (r) => {
errorResponse = r;
});
Assert.NotNull(stream);
Assert.Null(errorResponse);
var expected = await File.ReadAllBytesAsync(Path.Combine(_path, "Assets", "Koala.jpg"));
var bytes = await stream.ReadAsBytes(CancellationToken.None);
Assert.Equal(expected, bytes);
}
[Fact]
public async Task Writes_Response_To_Stream() {
var tempFile = Path.GetTempFileName();
// ReSharper disable once UseObjectOrCollectionInitializer
var request = new RestRequest("Assets/Koala.jpg");
request.ResponseWriter = responseStream => {
using var writer = File.OpenWrite(tempFile);
responseStream.CopyTo(writer);
return null;
};
var response = await _client.DownloadDataAsync(request);
Assert.Null(response);
var fromTemp = await File.ReadAllBytesAsync(tempFile);
var expected = await File.ReadAllBytesAsync(Path.Combine(_path, "Assets", "Koala.jpg"));
Assert.Equal(expected, fromTemp);
}
}