Skip to content

Commit 28a8593

Browse files
committedSep 20, 2022
Merge branch 'ishanpranav-dev' into dev
2 parents 92daa16 + 0f2e55d commit 28a8593

File tree

9 files changed

+396
-29
lines changed

9 files changed

+396
-29
lines changed
 

‎RestSharp.sln

+82-16
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,39 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 15
4-
VisualStudioVersion = 15.0.26730.16
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.3.32811.315
55
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp", "src\RestSharp\RestSharp.csproj", "{43A1D5D2-650D-40DD-A6C0-14F92689C70B}"
6+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp", "src\RestSharp\RestSharp.csproj", "{43A1D5D2-650D-40DD-A6C0-14F92689C70B}"
77
EndProject
88
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9051DDA0-E563-45D5-9504-085EBAACF469}"
99
EndProject
10-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests", "test\RestSharp.Tests\RestSharp.Tests.csproj", "{B1C55C9B-3287-4EB2-8ADD-795DBC77013D}"
10+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Tests", "test\RestSharp.Tests\RestSharp.Tests.csproj", "{B1C55C9B-3287-4EB2-8ADD-795DBC77013D}"
1111
EndProject
12-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests.Integrated", "test\RestSharp.Tests.Integrated\RestSharp.Tests.Integrated.csproj", "{AC3B3DDC-F011-4E19-8C9B-F748B19ED3C0}"
12+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Tests.Integrated", "test\RestSharp.Tests.Integrated\RestSharp.Tests.Integrated.csproj", "{AC3B3DDC-F011-4E19-8C9B-F748B19ED3C0}"
1313
EndProject
14-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Serializers.NewtonsoftJson", "src\RestSharp.Serializers.NewtonsoftJson\RestSharp.Serializers.NewtonsoftJson.csproj", "{4205A187-9732-4DA8-B0BE-77A2C6B8C6A1}"
14+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Serializers.NewtonsoftJson", "src\RestSharp.Serializers.NewtonsoftJson\RestSharp.Serializers.NewtonsoftJson.csproj", "{4205A187-9732-4DA8-B0BE-77A2C6B8C6A1}"
1515
EndProject
1616
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Serializers", "Serializers", "{8C7B43EB-2F93-483C-B433-E28F9386AD67}"
1717
EndProject
18-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests.Shared", "test\RestSharp.Tests.Shared\RestSharp.Tests.Shared.csproj", "{73896669-F05C-41AC-9F6F-A11F549EDEDC}"
18+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Tests.Shared", "test\RestSharp.Tests.Shared\RestSharp.Tests.Shared.csproj", "{73896669-F05C-41AC-9F6F-A11F549EDEDC}"
1919
EndProject
20-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests.Serializers.Json", "test\RestSharp.Tests.Serializers.Json\RestSharp.Tests.Serializers.Json.csproj", "{8BF81225-2F85-4412-AD18-6579CBA1879B}"
20+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Tests.Serializers.Json", "test\RestSharp.Tests.Serializers.Json\RestSharp.Tests.Serializers.Json.csproj", "{8BF81225-2F85-4412-AD18-6579CBA1879B}"
2121
EndProject
2222
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Perf", "Perf", "{1C42C435-8826-4044-8775-A1DA40EF4866}"
2323
EndProject
24-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Benchmarks", "benchmarks\RestSharp.Benchmarks\RestSharp.Benchmarks.csproj", "{997AEFE5-D7D4-4033-A31A-07F476D6FE5D}"
24+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Benchmarks", "benchmarks\RestSharp.Benchmarks\RestSharp.Benchmarks.csproj", "{997AEFE5-D7D4-4033-A31A-07F476D6FE5D}"
2525
EndProject
26-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.InteractiveTests", "test\RestSharp.InteractiveTests\RestSharp.InteractiveTests.csproj", "{6D7D1D60-4473-4C52-800C-9B892C6640A5}"
26+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.InteractiveTests", "test\RestSharp.InteractiveTests\RestSharp.InteractiveTests.csproj", "{6D7D1D60-4473-4C52-800C-9B892C6640A5}"
2727
EndProject
28-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests.Serializers.Xml", "test\RestSharp.Tests.Serializers.Xml\RestSharp.Tests.Serializers.Xml.csproj", "{E6D94C12-9AD7-46E6-AB62-3676F25FDE51}"
28+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Tests.Serializers.Xml", "test\RestSharp.Tests.Serializers.Xml\RestSharp.Tests.Serializers.Xml.csproj", "{E6D94C12-9AD7-46E6-AB62-3676F25FDE51}"
2929
EndProject
30-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Serializers.Xml", "src\RestSharp.Serializers.Xml\RestSharp.Serializers.Xml.csproj", "{4A35B1C5-520D-4267-BA70-2DCEAC0A5662}"
30+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Serializers.Xml", "src\RestSharp.Serializers.Xml\RestSharp.Serializers.Xml.csproj", "{4A35B1C5-520D-4267-BA70-2DCEAC0A5662}"
3131
EndProject
32-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests.Legacy", "test\RestSharp.Tests.Legacy\RestSharp.Tests.Legacy.csproj", "{5A8A5BBE-28DA-4C89-B393-BE39A96E8DC0}"
32+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Tests.Legacy", "test\RestSharp.Tests.Legacy\RestSharp.Tests.Legacy.csproj", "{5A8A5BBE-28DA-4C89-B393-BE39A96E8DC0}"
33+
EndProject
34+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Serializers.CsvHelper", "src\RestSharp.Serializers.CsvHelper\RestSharp.Serializers.CsvHelper.csproj", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}"
35+
EndProject
36+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RestSharp.Tests.Serializers.Csv", "test\RestSharp.Tests.Serializers.Csv\RestSharp.Tests.Serializers.Csv.csproj", "{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}"
3337
EndProject
3438
Global
3539
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -380,13 +384,70 @@ Global
380384
{5A8A5BBE-28DA-4C89-B393-BE39A96E8DC0}.Release|x64.Build.0 = Release|Any CPU
381385
{5A8A5BBE-28DA-4C89-B393-BE39A96E8DC0}.Release|x86.ActiveCfg = Release|Any CPU
382386
{5A8A5BBE-28DA-4C89-B393-BE39A96E8DC0}.Release|x86.Build.0 = Release|Any CPU
387+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|Any CPU.ActiveCfg = Debug|Any CPU
388+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|Any CPU.Build.0 = Debug|Any CPU
389+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|ARM.ActiveCfg = Debug|Any CPU
390+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|ARM.Build.0 = Debug|Any CPU
391+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU
392+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|Mixed Platforms.Build.0 = Debug|Any CPU
393+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|x64.ActiveCfg = Debug|Any CPU
394+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|x64.Build.0 = Debug|Any CPU
395+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|x86.ActiveCfg = Debug|Any CPU
396+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug.Appveyor|x86.Build.0 = Debug|Any CPU
397+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
398+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
399+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|ARM.ActiveCfg = Debug|Any CPU
400+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|ARM.Build.0 = Debug|Any CPU
401+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
402+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
403+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|x64.ActiveCfg = Debug|Any CPU
404+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|x64.Build.0 = Debug|Any CPU
405+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|x86.ActiveCfg = Debug|Any CPU
406+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Debug|x86.Build.0 = Debug|Any CPU
407+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
408+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|Any CPU.Build.0 = Release|Any CPU
409+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|ARM.ActiveCfg = Release|Any CPU
410+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|ARM.Build.0 = Release|Any CPU
411+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
412+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
413+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|x64.ActiveCfg = Release|Any CPU
414+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|x64.Build.0 = Release|Any CPU
415+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|x86.ActiveCfg = Release|Any CPU
416+
{2150E333-8FDC-42A3-9474-1A3956D46DE8}.Release|x86.Build.0 = Release|Any CPU
417+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|Any CPU.ActiveCfg = Debug|Any CPU
418+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|Any CPU.Build.0 = Debug|Any CPU
419+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|ARM.ActiveCfg = Debug|Any CPU
420+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|ARM.Build.0 = Debug|Any CPU
421+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU
422+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|Mixed Platforms.Build.0 = Debug|Any CPU
423+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|x64.ActiveCfg = Debug|Any CPU
424+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|x64.Build.0 = Debug|Any CPU
425+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|x86.ActiveCfg = Debug|Any CPU
426+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug.Appveyor|x86.Build.0 = Debug|Any CPU
427+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
428+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|Any CPU.Build.0 = Debug|Any CPU
429+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|ARM.ActiveCfg = Debug|Any CPU
430+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|ARM.Build.0 = Debug|Any CPU
431+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
432+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
433+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|x64.ActiveCfg = Debug|Any CPU
434+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|x64.Build.0 = Debug|Any CPU
435+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|x86.ActiveCfg = Debug|Any CPU
436+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Debug|x86.Build.0 = Debug|Any CPU
437+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|Any CPU.ActiveCfg = Release|Any CPU
438+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|Any CPU.Build.0 = Release|Any CPU
439+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|ARM.ActiveCfg = Release|Any CPU
440+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|ARM.Build.0 = Release|Any CPU
441+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
442+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|Mixed Platforms.Build.0 = Release|Any CPU
443+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|x64.ActiveCfg = Release|Any CPU
444+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|x64.Build.0 = Release|Any CPU
445+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|x86.ActiveCfg = Release|Any CPU
446+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060}.Release|x86.Build.0 = Release|Any CPU
383447
EndGlobalSection
384448
GlobalSection(SolutionProperties) = preSolution
385449
HideSolutionNode = FALSE
386450
EndGlobalSection
387-
GlobalSection(ExtensibilityGlobals) = postSolution
388-
SolutionGuid = {77FF357B-03FA-4FA5-A68F-BFBE5800FEBA}
389-
EndGlobalSection
390451
GlobalSection(NestedProjects) = preSolution
391452
{B1C55C9B-3287-4EB2-8ADD-795DBC77013D} = {9051DDA0-E563-45D5-9504-085EBAACF469}
392453
{AC3B3DDC-F011-4E19-8C9B-F748B19ED3C0} = {9051DDA0-E563-45D5-9504-085EBAACF469}
@@ -398,5 +459,10 @@ Global
398459
{E6D94C12-9AD7-46E6-AB62-3676F25FDE51} = {9051DDA0-E563-45D5-9504-085EBAACF469}
399460
{4A35B1C5-520D-4267-BA70-2DCEAC0A5662} = {8C7B43EB-2F93-483C-B433-E28F9386AD67}
400461
{5A8A5BBE-28DA-4C89-B393-BE39A96E8DC0} = {9051DDA0-E563-45D5-9504-085EBAACF469}
462+
{2150E333-8FDC-42A3-9474-1A3956D46DE8} = {8C7B43EB-2F93-483C-B433-E28F9386AD67}
463+
{E6D94FFD-7811-40BE-ABC4-6D6AB41F0060} = {9051DDA0-E563-45D5-9504-085EBAACF469}
464+
EndGlobalSection
465+
GlobalSection(ExtensibilityGlobals) = postSolution
466+
SolutionGuid = {77FF357B-03FA-4FA5-A68F-BFBE5800FEBA}
401467
EndGlobalSection
402468
EndGlobal
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
using CsvHelper;
2+
using CsvHelper.Configuration;
3+
using System.Collections;
4+
using System.Globalization;
5+
6+
namespace RestSharp.Serializers.CsvHelper;
7+
8+
public class CsvHelperSerializer : IDeserializer, IRestSerializer, ISerializer {
9+
const string TextCsvContentType = "text/csv";
10+
11+
readonly CsvConfiguration _configuration;
12+
13+
public ISerializer Serializer => this;
14+
15+
public IDeserializer Deserializer => this;
16+
17+
public string[] AcceptedContentTypes => new[] { TextCsvContentType, "application/x-download" };
18+
19+
public SupportsContentType SupportsContentType => x => Array.IndexOf(AcceptedContentTypes, x) != -1 || x.Contains("csv");
20+
21+
public DataFormat DataFormat => DataFormat.None;
22+
23+
public string ContentType { get; set; } = TextCsvContentType;
24+
25+
public CsvHelperSerializer() => _configuration = new CsvConfiguration(CultureInfo.InvariantCulture);
26+
27+
public CsvHelperSerializer(CsvConfiguration configuration) => _configuration = configuration;
28+
29+
public T? Deserialize<T>(RestResponse response) {
30+
try {
31+
if (response.Content == null)
32+
throw new InvalidOperationException(message: "Response content is null");
33+
34+
using var stringReader = new StringReader(response.Content);
35+
36+
using var csvReader = new CsvReader(stringReader, CultureInfo.CurrentCulture);
37+
38+
var @interface = typeof(T).GetInterface("IEnumerable`1");
39+
40+
if (@interface == null) {
41+
csvReader.Read();
42+
43+
return csvReader.GetRecord<T>();
44+
}
45+
46+
var itemType = @interface.GenericTypeArguments[0];
47+
T result;
48+
49+
try {
50+
result = Activator.CreateInstance<T>();
51+
}
52+
catch (MissingMethodException) {
53+
throw new InvalidOperationException(message: "The type must contain a public, parameterless constructor.");
54+
}
55+
56+
var method = typeof(T).GetMethod(name: "Add");
57+
58+
if (method == null) {
59+
throw new InvalidOperationException(
60+
message: "If the type implements IEnumerable<T>, then it must contain a public \"Add(T)\" method."
61+
);
62+
}
63+
64+
foreach (var record in csvReader.GetRecords(itemType)) {
65+
method.Invoke(result, new[] { record });
66+
}
67+
68+
return result;
69+
}
70+
catch (Exception exception) {
71+
throw new DeserializationException(response, exception);
72+
}
73+
}
74+
75+
public string? Serialize(Parameter parameter) => Serialize(parameter.Value);
76+
77+
public string? Serialize(object? obj) {
78+
if (obj == null) {
79+
return null;
80+
}
81+
82+
using var stringWriter = new StringWriter();
83+
84+
using var csvWriter = new CsvWriter(stringWriter, _configuration);
85+
86+
if (obj is IEnumerable records) {
87+
// ReSharper disable once PossibleMultipleEnumeration
88+
var enumerator = records.GetEnumerator();
89+
90+
if (enumerator.MoveNext() && enumerator.Current != null) {
91+
csvWriter.WriteHeader(enumerator.Current.GetType());
92+
csvWriter.NextRecord();
93+
// ReSharper disable once PossibleMultipleEnumeration
94+
csvWriter.WriteRecords(records);
95+
}
96+
97+
if (enumerator is IDisposable disposable) {
98+
disposable.Dispose();
99+
}
100+
}
101+
else {
102+
csvWriter.WriteHeader(obj.GetType());
103+
csvWriter.NextRecord();
104+
csvWriter.WriteRecord(obj);
105+
csvWriter.NextRecord();
106+
}
107+
108+
return stringWriter.ToString();
109+
}
110+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using CsvHelper.Configuration;
2+
3+
namespace RestSharp.Serializers.CsvHelper;
4+
5+
[PublicAPI]
6+
public static class RestClientExtensions {
7+
public static RestClient UseCsvHelper(this RestClient client) => client.UseSerializer<CsvHelperSerializer>();
8+
9+
public static RestClient UseCsvHelper(this RestClient client, CsvConfiguration configuration)
10+
=> client.UseSerializer(() => new CsvHelperSerializer(configuration));
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<ItemGroup>
3+
<PackageReference Include="CsvHelper" Version="28.0.1"/>
4+
</ItemGroup>
5+
<ItemGroup>
6+
<ProjectReference Include="..\RestSharp\RestSharp.csproj"/>
7+
</ItemGroup>
8+
</Project>
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<Project Sdk="Microsoft.NET.Sdk">
2-
<ItemGroup>
3-
<PackageReference Include="Newtonsoft.Json" Version="[12.0.1,)" />
4-
</ItemGroup>
5-
<ItemGroup>
6-
<ProjectReference Include="..\RestSharp\RestSharp.csproj" />
7-
</ItemGroup>
8-
<ItemGroup>
9-
<Using Include="Newtonsoft.Json" />
10-
</ItemGroup>
2+
<ItemGroup>
3+
<PackageReference Include="Newtonsoft.Json" Version="12.0.1"/>
4+
</ItemGroup>
5+
<ItemGroup>
6+
<ProjectReference Include="..\RestSharp\RestSharp.csproj"/>
7+
</ItemGroup>
8+
<ItemGroup>
9+
<Using Include="Newtonsoft.Json"/>
10+
</ItemGroup>
1111
</Project>
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
<Project Sdk="Microsoft.NET.Sdk">
2-
32
<PropertyGroup>
43
<RootNamespace>RestSharp.Serializers.Xml</RootNamespace>
54
</PropertyGroup>
6-
75
<ItemGroup>
8-
<ProjectReference Include="..\RestSharp\RestSharp.csproj" />
6+
<ProjectReference Include="..\RestSharp\RestSharp.csproj"/>
97
</ItemGroup>
10-
118
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
using CsvHelper.Configuration;
2+
using RestSharp.Serializers.CsvHelper;
3+
using RestSharp.Serializers.Json;
4+
using RestSharp.Tests.Shared.Extensions;
5+
using RestSharp.Tests.Shared.Fixtures;
6+
using System.Globalization;
7+
using System.Net;
8+
using System.Text;
9+
10+
namespace RestSharp.Tests.Serializers.Csv {
11+
public class CsvHelperTests {
12+
private static readonly Fixture Fixture = new Fixture();
13+
14+
[Fact]
15+
public async Task Use_CsvHelper_For_Response() {
16+
var expected = Fixture.Create<TestObject>();
17+
18+
expected.DateTimeValue = new DateTime(expected.DateTimeValue.Year, expected.DateTimeValue.Month, expected.DateTimeValue.Day, expected.DateTimeValue.Hour, expected.DateTimeValue.Minute, expected.DateTimeValue.Second);
19+
20+
using var server = HttpServerFixture.StartServer(
21+
(_, response) => {
22+
var serializer = new CsvHelperSerializer();
23+
24+
response.ContentType = "text/csv";
25+
response.ContentEncoding = Encoding.UTF8;
26+
response.OutputStream.WriteStringUtf8(serializer.Serialize(expected)!);
27+
}
28+
);
29+
30+
var client = new RestClient(server.Url).UseCsvHelper();
31+
32+
var actual = await client.GetAsync<TestObject>(new RestRequest());
33+
34+
actual.Should().BeEquivalentTo(expected);
35+
}
36+
37+
[Fact]
38+
public async Task Use_CsvHelper_For_Collection_Response() {
39+
var count = Fixture.Create<int>();
40+
var expected = new List<TestObject>(count);
41+
42+
for (int i = 0; i < count; i++) {
43+
var item = Fixture.Create<TestObject>();
44+
45+
item.DateTimeValue = new DateTime(item.DateTimeValue.Year, item.DateTimeValue.Month, item.DateTimeValue.Day, item.DateTimeValue.Hour, item.DateTimeValue.Minute, item.DateTimeValue.Second);
46+
47+
expected.Add(item);
48+
}
49+
50+
using var server = HttpServerFixture.StartServer(
51+
(_, response) => {
52+
var serializer = new CsvHelperSerializer();
53+
54+
response.ContentType = "text/csv";
55+
response.ContentEncoding = Encoding.UTF8;
56+
response.OutputStream.WriteStringUtf8(serializer.Serialize(expected));
57+
}
58+
);
59+
60+
var client = new RestClient(server.Url).UseCsvHelper();
61+
62+
var actual = await client.GetAsync<List<TestObject>>(new RestRequest());
63+
64+
actual.Should().BeEquivalentTo(expected);
65+
}
66+
67+
[Fact]
68+
public async Task DeserilizationFails_IsSuccessfull_Should_BeFalse() {
69+
using var server = HttpServerFixture.StartServer(
70+
(_, response) => {
71+
response.StatusCode = (int)HttpStatusCode.OK;
72+
response.ContentType = "text/csv";
73+
response.ContentEncoding = Encoding.UTF8;
74+
response.OutputStream.WriteStringUtf8("invalid csv");
75+
}
76+
);
77+
78+
var client = new RestClient(server.Url).UseCsvHelper();
79+
80+
var response = await client.ExecuteAsync<TestObject>(new RestRequest());
81+
82+
response.IsSuccessStatusCode.Should().BeTrue();
83+
response.IsSuccessful.Should().BeFalse();
84+
}
85+
86+
[Fact]
87+
public async Task DeserilizationSucceeds_IsSuccessfull_Should_BeTrue() {
88+
var item = Fixture.Create<TestObject>();
89+
90+
using var server = HttpServerFixture.StartServer(
91+
(_, response) => {
92+
var serializer = new SystemTextJsonSerializer();
93+
94+
response.StatusCode = (int)HttpStatusCode.OK;
95+
response.ContentType = "text/csv";
96+
response.ContentEncoding = Encoding.UTF8;
97+
response.OutputStream.WriteStringUtf8(serializer.Serialize(item)!);
98+
}
99+
);
100+
101+
var client = new RestClient(server.Url).UseSystemTextJson();
102+
103+
var response = await client.ExecuteAsync<TestObject>(new RestRequest());
104+
105+
response.IsSuccessStatusCode.Should().BeTrue();
106+
response.IsSuccessful.Should().BeTrue();
107+
}
108+
109+
[Fact]
110+
public async Task SerializedObject_Should_Be() {
111+
var serializer = new CsvHelperSerializer(new CsvConfiguration(CultureInfo.InvariantCulture) {
112+
NewLine = ";"
113+
});
114+
115+
var item = new TestObject() {
116+
Int32Value = 32,
117+
SingleValue = 16.5f,
118+
StringValue = "hello",
119+
TimeSpanValue = TimeSpan.FromMinutes(10),
120+
DateTimeValue = new DateTime(2024, 1, 20)
121+
};
122+
123+
serializer.Serialize(item).Should().Be("StringValue,Int32Value,DecimalValue,DoubleValue,SingleValue,DateTimeValue,TimeSpanValue;hello,32,0,0,16.5,01/20/2024 00:00:00,00:10:00;");
124+
}
125+
126+
[Fact]
127+
public async Task SerializedCollection_Should_Be() {
128+
var serializer = new CsvHelperSerializer(new CsvConfiguration(CultureInfo.InvariantCulture) {
129+
NewLine = ";"
130+
});
131+
132+
var items = new TestObject[] {
133+
new TestObject() {
134+
Int32Value = 32,
135+
SingleValue = 16.5f,
136+
StringValue = "hello",
137+
TimeSpanValue = TimeSpan.FromMinutes(10),
138+
DateTimeValue = new DateTime(2024, 1, 20)
139+
},
140+
new TestObject() {
141+
Int32Value = 65,
142+
DecimalValue = 89.555m,
143+
TimeSpanValue = TimeSpan.FromSeconds(61),
144+
DateTimeValue = new DateTime(2022, 8, 19, 5, 15, 21)
145+
},
146+
new TestObject() {
147+
SingleValue = 80000,
148+
DoubleValue = 20.00001,
149+
StringValue = "String, with comma"
150+
}
151+
};
152+
153+
serializer.Serialize(items).Should().Be("StringValue,Int32Value,DecimalValue,DoubleValue,SingleValue,DateTimeValue,TimeSpanValue;hello,32,0,0,16.5,01/20/2024 00:00:00,00:10:00;,65,89.555,0,0,08/19/2022 05:15:21,00:01:01;\"String, with comma\",0,0,20.00001,80000,01/01/0001 00:00:00,00:00:00;");
154+
}
155+
}
156+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<ItemGroup>
4+
<ProjectReference Include="..\..\src\RestSharp.Serializers.CsvHelper\RestSharp.Serializers.CsvHelper.csproj" />
5+
<ProjectReference Include="..\RestSharp.Tests.Shared\RestSharp.Tests.Shared.csproj" />
6+
</ItemGroup>
7+
8+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace RestSharp.Tests.Serializers.Csv {
2+
internal class TestObject {
3+
public string StringValue { get; set; }
4+
public int Int32Value { get; set; }
5+
public decimal DecimalValue { get; set; }
6+
public double DoubleValue { get; set; }
7+
public float SingleValue { get; set; }
8+
public DateTime DateTimeValue { get; set; }
9+
public TimeSpan TimeSpanValue { get; set; }
10+
}
11+
}

0 commit comments

Comments
 (0)
Please sign in to comment.