Skip to content

Commit 453d2a7

Browse files
committed
Merge branch 'develop'
2 parents 29d798f + 7fbb0e5 commit 453d2a7

File tree

27 files changed

+372
-114
lines changed

27 files changed

+372
-114
lines changed

ReversoAPI.Web.Tests/Clients/SpellingClientTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using ReversoAPI.Web.GrammarCheckFeature.Application.Services;
1212
using ReversoAPI.Web.Shared.Infrastructure.Http;
1313
using ReversoAPI.Web.Shared.Infrastructure.Http.Interfaces;
14+
using System.Net;
1415

1516
namespace ReversoAPI.Web.Tests.Clients
1617
{
@@ -22,15 +23,15 @@ public class SpellingClientTests
2223
public SpellingClientTests()
2324
{
2425
_apiConnector = new Mock<IAPIConnector>();
25-
_client = new SpellingService(_apiConnector.Object);
26+
_client = new SpellingService(_apiConnector.Object, null);
2627
}
2728

2829
[Theory]
2930
[MemberData(nameof(SpellingDataForTest))]
3031
public async Task GetAsync_Success(string text, Language language, Locale locale, Stream json, SpellingData expectedResult)
3132
{
3233
// Arrange
33-
var response = new HttpResponse() { Content = json };
34+
var response = new HttpResponse("text/html", json, HttpStatusCode.OK);
3435
_apiConnector
3536
.Setup(c => c.PostAsync(It.IsAny<Uri>(), It.IsAny<SpellingRequest>(), It.IsAny<CancellationToken>()))
3637
.ReturnsAsync(response);

ReversoAPI.Web.Tests/Clients/TranslationClientTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using FluentAssertions;
44
using System;
55
using System.IO;
6+
using System.Net;
67
using System.Threading;
78
using System.Threading.Tasks;
89
using System.Collections.Generic;
@@ -22,15 +23,15 @@ public class TranslationClientTests
2223
public TranslationClientTests()
2324
{
2425
_apiConnector = new Mock<IAPIConnector>();
25-
_client = new TranslationService(_apiConnector.Object);
26+
_client = new TranslationService(_apiConnector.Object, null);
2627
}
2728

2829
[Theory]
2930
[MemberData(nameof(SpellingDataForTest))]
3031
public async Task GetFromOneWordAsync_Success(string text, Language source, Language target, Stream json, TranslationData expectedResult)
3132
{
3233
// Arrange
33-
var response = new HttpResponse() { Content = json };
34+
var response = new HttpResponse("text/html", json, HttpStatusCode.OK);
3435
_apiConnector
3536
.Setup(c => c.PostAsync(It.IsAny<Uri>(), It.IsAny<TranslationRequest>(), It.IsAny<CancellationToken>()))
3637
.ReturnsAsync(response);

ReversoAPI.Web.Tests/Parsers/ConjugationResponseParserTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class ConjugationResponseParserTest
1414
public void Invoke_Test(ConjugationData expectedResult, Stream html)
1515
{
1616
// Arrange
17-
var parser = new ConjugationParserService();
17+
var parser = new ConjugationParseService(null);
1818

1919
// Act
2020
var result = parser.Invoke(html);

ReversoAPI.Web.Tests/Parsers/ContextResponseParserTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class ContextResponseParserTest
1414
public void Invoke_Test(ContextData expectedResult, Stream html)
1515
{
1616
// Arrange
17-
var parser = new ContextParserService();
17+
var parser = new ContextParseService(null);
1818

1919
// Act
2020
var result = parser.Invoke(html);

ReversoAPI.Web.Tests/Parsers/SynonymsResponseParserTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class SynonymsResponseParserTest
1414
public void Invoke_Test(SynonymsData expectedResult, Stream html)
1515
{
1616
// Arrange
17-
var parser = new SynonymsParserService();
17+
var parser = new SynonymsParseService(null);
1818

1919
// Act
2020
var result = parser.Invoke(html);

ReversoAPI.Web/ConjugationFeature/Application/Services/ConjugationService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ public class ConjugationService : IConjugationService
1414
private string ConjugationURL = "https://conjugator.reverso.net/conjugation-";
1515

1616
private readonly IAPIConnector _apiConnector;
17-
private readonly IParser<ConjugationData> _parser;
17+
private readonly IParseService<ConjugationData> _parser;
1818

1919
public ConjugationService(
2020
IAPIConnector apiConnector,
21-
IParser<ConjugationData> parser)
21+
IParseService<ConjugationData> parser)
2222
{
2323
_apiConnector = apiConnector;
2424
_parser = parser;

ReversoAPI.Web/ConjugationFeature/Domain/Core/Services/ConjugationParserService.cs renamed to ReversoAPI.Web/ConjugationFeature/Domain/Core/Services/ConjugationParseService.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
using System.IO;
22
using ReversoAPI.Web.ConjugationFeature.Domain.Supporting.Builders;
33
using ReversoAPI.Web.Shared.Domain.Services;
4+
using ReversoAPI.Web.Shared.Infrastructure.Logger;
45

56
namespace ReversoAPI.Web.ConjugationFeature.Domain.Core.Services
67
{
7-
public class ConjugationParserService : BaseParser<ConjugationData>
8+
public class ConjugationParseService : BaseParser<ConjugationData>
89
{
10+
private readonly ILogger _log;
11+
12+
public ConjugationParseService(ILogger log)
13+
{
14+
_log = log;
15+
}
16+
917
protected override ConjugationData Parse(Stream htmlStream)
1018
{
1119
try
@@ -16,8 +24,9 @@ protected override ConjugationData Parse(Stream htmlStream)
1624
.WithConjugations()
1725
.Build();
1826
}
19-
catch (ParsingException)
27+
catch (ParsingException ex)
2028
{
29+
_log?.Error(ex.Message);
2130
return null;
2231
}
2332
}

ReversoAPI.Web/ContextFeature/Application/Services/ContextService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ public class ContextService : IContextService
1212
private const string ContextURL = "https://context.reverso.net/translation/";
1313

1414
private readonly IAPIConnector _apiConnector;
15-
private readonly IParser<ContextData> _parser;
15+
private readonly IParseService<ContextData> _parser;
1616

1717
public ContextService(IAPIConnector apiConnector,
18-
IParser<ContextData> parser)
18+
IParseService<ContextData> parser)
1919
{
2020
_apiConnector = apiConnector;
2121
_parser = parser;

ReversoAPI.Web/ContextFeature/Domain/Core/Services/ContextParserService.cs renamed to ReversoAPI.Web/ContextFeature/Domain/Core/Services/ContextParseService.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
using System.IO;
22
using ReversoAPI.Web.ContextFeature.Domain.Supporting.Builders;
33
using ReversoAPI.Web.Shared.Domain.Services;
4+
using ReversoAPI.Web.Shared.Infrastructure.Logger;
45

56
namespace ReversoAPI.Web.ContextFeature.Domain.Core.Services
67
{
7-
public class ContextParserService : BaseParser<ContextData>
8+
public class ContextParseService : BaseParser<ContextData>
89
{
10+
private readonly ILogger _log;
11+
public ContextParseService(ILogger log)
12+
{
13+
_log = log;
14+
}
15+
916
protected override ContextData Parse(Stream htmlStream)
1017
{
1118
try
@@ -16,8 +23,9 @@ protected override ContextData Parse(Stream htmlStream)
1623
.WithExamples()
1724
.Build();
1825
}
19-
catch (ParsingException)
26+
catch (ParsingException ex)
2027
{
28+
_log?.Error(ex.Message);
2129
return null;
2230
}
2331
}

ReversoAPI.Web/GrammarCheckFeature/Application/DTOs/SpellingRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public SpellingRequest(string text, Language language, Locale locale)
1717
AutoReplace = true;
1818
EnglishDialect = "indifferent";
1919
GetCorrectionDetails = true;
20-
InterfaceLanguage = "eu";
20+
InterfaceLanguage = "en";
2121
IsHtml = false;
2222
Locale = locale == ReversoAPI.Locale.None ? string.Empty : locale.ToString();
2323
Origin = "interactive";

ReversoAPI.Web/GrammarCheckFeature/Application/Services/SpellingService.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,22 @@
66
using ReversoAPI.Web.GrammarCheckFeature.Application.Validators;
77
using ReversoAPI.Web.Shared.Application.Extensions;
88
using ReversoAPI.Web.Shared.Infrastructure.Http.Interfaces;
9+
using ReversoAPI.Web.Shared.Infrastructure.Logger;
910

1011
namespace ReversoAPI.Web.GrammarCheckFeature.Application.Services
1112
{
1213
public class SpellingService : ISpellingService
1314
{
1415
private const string SpellingURL = "https://orthographe.reverso.net/api/v1/Spelling/";
1516

17+
private readonly ILogger _log;
1618
private readonly IAPIConnector _apiConnector;
17-
public SpellingService(IAPIConnector apiConnector) => _apiConnector = apiConnector;
19+
20+
public SpellingService(IAPIConnector apiConnector, ILogger log)
21+
{
22+
_log = log;
23+
_apiConnector = apiConnector;
24+
}
1825

1926
public async Task<SpellingData> GetAsync(string text, Language language, Locale locale = Locale.None, CancellationToken cancellationToken = default)
2027
{
@@ -27,7 +34,11 @@ public async Task<SpellingData> GetAsync(string text, Language language, Locale
2734
var spellingDto = response.Content.Deserialize<SpellingResponse>();
2835

2936
var validationResult = new SpellingResponseValidator(spellingDto).Validate();
30-
if (!validationResult.IsValid) return null;
37+
if (!validationResult.IsValid)
38+
{
39+
_log?.Error(validationResult.Message);
40+
return null;
41+
}
3142

3243
return spellingDto.ToModel();
3344
}

ReversoAPI.Web/ReversoClient.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
using ReversoAPI.Web.ConjugationFeature.Application.Services;
2-
using ReversoAPI.Web.ConjugationFeature.Domain.Core.Services;
32
using ReversoAPI.Web.ContextFeature.Application.Services;
4-
using ReversoAPI.Web.ContextFeature.Domain.Core.Services;
53
using ReversoAPI.Web.GrammarCheckFeature.Application.Services;
64
using ReversoAPI.Web.PronunciationFeature.Application.Services;
75
using ReversoAPI.Web.SynonymsFeature.Application.Services;
8-
using ReversoAPI.Web.SynonymsFeature.Domain.Core.Services;
96
using ReversoAPI.Web.TranslationFeature.Application.Services;
10-
using ReversoAPI.Web.Shared.Infrastructure.Http;
117

128
namespace ReversoAPI
139
{
1410
public class ReversoClient : IReversoClient
1511
{
16-
public ReversoClient()
12+
public ReversoClient(ReversoClientConfig config)
1713
{
18-
var apiConnector = APIConnector.Create(HttpClientCacheWrapper.GetInstance());
14+
var apiConnector = config.APIConnector;
1915

20-
Context = new ContextClient(new ContextService(apiConnector, new ContextParserService()));
21-
Synonyms = new SynonymsClient(new SynonymsService(apiConnector, new SynonymsParserService()));
22-
Conjugation = new ConjugationClient(new ConjugationService(apiConnector, new ConjugationParserService()));
16+
Context = new ContextClient(new ContextService(apiConnector, config.ContextParser));
17+
Synonyms = new SynonymsClient(new SynonymsService(apiConnector, config.SynonymsParser));
18+
Conjugation = new ConjugationClient(new ConjugationService(apiConnector, config.ConjugationParser));
2319

24-
Spelling = new SpellingClient(new SpellingService(apiConnector));
25-
Translation = new TranslationClient(new TranslationService(apiConnector));
20+
Spelling = new SpellingClient(new SpellingService(apiConnector, config.Logger));
21+
Translation = new TranslationClient(new TranslationService(apiConnector, config.Logger));
2622
Pronunciation = new PronunciationClient(new PronunciationService(apiConnector));
2723
}
2824

25+
public ReversoClient() : this(new ReversoClientConfig().CreateDefault())
26+
{
27+
}
28+
2929
public IContextClient Context { get; }
3030
public ISynonymsClient Synonyms { get; }
3131
public ISpellingClient Spelling { get; }

ReversoAPI.Web/ReversoClientConfig.cs

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
using System;
2+
using ReversoAPI.Web.ConjugationFeature.Domain.Core.Services;
3+
using ReversoAPI.Web.ContextFeature.Domain.Core.Services;
4+
using ReversoAPI.Web.SynonymsFeature.Domain.Core.Services;
5+
using ReversoAPI.Web.Shared.Domain.Interfaces.Services;
6+
using ReversoAPI.Web.Shared.Infrastructure.Http;
7+
using ReversoAPI.Web.Shared.Infrastructure.Http.Interfaces;
8+
using ReversoAPI.Web.Shared.Infrastructure.Logger;
9+
10+
namespace ReversoAPI.Web
11+
{
12+
public class ReversoClientConfig
13+
{
14+
// General
15+
private IHttpClient _httpClient;
16+
public IHttpClient HttpClient
17+
{
18+
get => _httpClient ?? new CachedHttpClient();
19+
private set => _httpClient = value;
20+
}
21+
22+
private IAPIConnector _apiConnector;
23+
public IAPIConnector APIConnector
24+
{
25+
get => _apiConnector ?? new APIConnector(new CachedHttpClient());
26+
private set => _apiConnector = value;
27+
}
28+
29+
private IParseService<ContextData> _contextParser;
30+
public IParseService<ContextData> ContextParser
31+
{
32+
get => _contextParser ?? new ContextParseService(Logger);
33+
private set => _contextParser = value;
34+
}
35+
36+
private IParseService<SynonymsData> _synonymsParser;
37+
public IParseService<SynonymsData> SynonymsParser
38+
{
39+
get => _synonymsParser ?? new SynonymsParseService(Logger);
40+
private set => _synonymsParser = value;
41+
}
42+
43+
private IParseService<ConjugationData> _conjugationParser;
44+
public IParseService<ConjugationData> ConjugationParser
45+
{
46+
get => _conjugationParser ?? new ConjugationParseService(Logger);
47+
private set => _conjugationParser = value;
48+
}
49+
50+
// Extra
51+
public ILogger Logger { get; private set; }
52+
53+
public ReversoClientConfig() { }
54+
55+
public ReversoClientConfig(
56+
IHttpClient httpClient,
57+
IAPIConnector apiConnector,
58+
IParseService<ContextData> contextParser,
59+
IParseService<SynonymsData> synonymsParser,
60+
IParseService<ConjugationData> conjugationParser,
61+
ILogger logger)
62+
{
63+
HttpClient = httpClient;
64+
APIConnector = apiConnector;
65+
ContextParser = contextParser;
66+
SynonymsParser = synonymsParser;
67+
ConjugationParser = conjugationParser;
68+
Logger = logger;
69+
}
70+
71+
public ReversoClientConfig CreateDefault()
72+
{
73+
var httpClient = new CachedHttpClient();
74+
75+
return new ReversoClientConfig(
76+
httpClient,
77+
new APIConnector(httpClient),
78+
new ContextParseService(null),
79+
new SynonymsParseService(null),
80+
new ConjugationParseService(null),
81+
null);
82+
}
83+
84+
public ReversoClientConfig WithHttpClient(IHttpClient httpClient)
85+
{
86+
if(httpClient is null) throw new ArgumentNullException(nameof(httpClient));
87+
88+
HttpClient = httpClient;
89+
return this;
90+
}
91+
92+
public ReversoClientConfig WithApiConnector(IAPIConnector apiConnector)
93+
{
94+
if (apiConnector is null) throw new ArgumentNullException(nameof(apiConnector));
95+
96+
APIConnector = apiConnector;
97+
return this;
98+
}
99+
100+
public ReversoClientConfig WithContextParseService(IParseService<ContextData> contextParser)
101+
{
102+
if (contextParser is null) throw new ArgumentNullException(nameof(contextParser));
103+
104+
ContextParser = contextParser;
105+
return this;
106+
}
107+
108+
public ReversoClientConfig WithSynonymsParseService(IParseService<SynonymsData> synonymsParser)
109+
{
110+
if (synonymsParser is null) throw new ArgumentNullException(nameof(synonymsParser));
111+
112+
SynonymsParser = synonymsParser;
113+
return this;
114+
}
115+
116+
public ReversoClientConfig WithConjugationParseService(IParseService<ConjugationData> conjugationParser)
117+
{
118+
if (conjugationParser is null) throw new ArgumentNullException(nameof(conjugationParser));
119+
120+
ConjugationParser = conjugationParser;
121+
return this;
122+
}
123+
124+
public ReversoClientConfig WithLogger(ILogger logger)
125+
{
126+
Logger = logger;
127+
return this;
128+
}
129+
}
130+
}

ReversoAPI.Web/Shared/Domain/Interfaces/Services/IParser.cs renamed to ReversoAPI.Web/Shared/Domain/Interfaces/Services/IParseService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace ReversoAPI.Web.Shared.Domain.Interfaces.Services
44
{
5-
public interface IParser<TResult>
5+
public interface IParseService<TResult>
66
{
77
TResult Invoke(Stream html);
88
}

0 commit comments

Comments
 (0)