Skip to content

Commit 1719df3

Browse files
authored
Organize code into logical folders and namespaces (#40)
* refactor: organize code into logical folders and namespaces (#18) - Created folder structure: Core, Abstractions, Services, Metadata, MakeMkv, Models, Utilities - Updated all namespace declarations to match folder structure - Renamed Metadata class to MetadataInfo to avoid namespace conflict - Added GlobalUsings.cs to both main and test projects for cleaner imports - All 112 tests pass successfully - No functional changes, purely organizational refactoring * Fix all formatting according to editorconfig * refactor: rename vague class names for clarity - MetadataInfo → ContentMetadata (metadata about media content) - StreamInfo → MediaStream (audio/video/subtitle stream) - FileAnalysis → MediaFileAnalysis (media file analysis) All 112 tests pass successfully * refactor: organize test files into logical folders Mirrored main project structure: - Core/: RipOptionsTests - Metadata/: MetadataServiceTests, provider tests, TitleVariationGenerator tests - MakeMkv/: MakeMkvProtocolTests - Services/: DiscTypeDetectorTests - Utilities/: FileNamingTests, DurationFormatterTests Updated namespaces to match folder structure. All 112 tests pass successfully. * refactor: convert Assert statements to AwesomeAssertions Replaced xUnit Assert.* calls with fluent AwesomeAssertions syntax: - Assert.True/False → .Should().BeTrue/BeFalse() - Assert.Equal → .Should().Equal() - Assert.Contains → .Should().Contain() - Assert.Null → .Should().BeNull() - Assert.True(x >= y) → .Should().BeGreaterThanOrEqualTo() - Assert.True(x <= y) → .Should().BeLessThanOrEqualTo() - Assert.True(x > y) → .Should().BeGreaterThan() - Assert.True(range) → .Should().BeInRange() Added global using for AwesomeAssertions in test GlobalUsings.cs. All 112 tests pass successfully. * refactor: remove AAA comments from tests Removed Arrange/Act/Assert comments as they were adding clutter without providing significant value. All 112 tests pass successfully.
1 parent 155eb4b commit 1719df3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+603
-255
lines changed

.editorconfig

Lines changed: 365 additions & 0 deletions
Large diffs are not rendered by default.

src/RipSharp.Tests/RipOptionsTests.cs renamed to src/RipSharp.Tests/Core/RipOptionsTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
using System;
22
using System.IO;
3+
34
using AwesomeAssertions;
5+
46
using RipSharp;
7+
58
using Xunit;
69

7-
namespace RipSharp.Tests;
10+
namespace RipSharp.Tests.Core;
811

912
public class RipOptionsTests
1013
{

src/RipSharp.Tests/GlobalUsings.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Global using directives for test files
2+
global using AwesomeAssertions;
3+
global using RipSharp.Abstractions;
4+
global using RipSharp.Core;
5+
global using RipSharp.MakeMkv;
6+
global using RipSharp.Metadata;
7+
global using RipSharp.Models;
8+
global using RipSharp.Services;
9+
global using RipSharp.Utilities;
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
using AwesomeAssertions;
2+
23
using RipSharp;
4+
35
using Xunit;
46

5-
namespace RipSharp.Tests;
7+
namespace RipSharp.Tests.MakeMkv;
68

79
public class MakeMkvProtocolTests
810
{
911
[Fact]
1012
public void ExtractQuoted_ReturnsInnerText()
1113
{
1214
var line = "MSG:1005,0,0,\"MakeMKV v1.18.2 linux(x64-release) started\"";
15+
1316
var result = MakeMkvProtocol.ExtractQuoted(line);
17+
1418
result.Should().Be("MakeMKV v1.18.2 linux(x64-release) started");
1519
}
1620

1721
[Fact]
1822
public void ExtractQuoted_ReturnsNull_WhenNoQuotes()
1923
{
2024
var line = "CINFO:1,Blu-ray disc";
25+
2126
var result = MakeMkvProtocol.ExtractQuoted(line);
27+
2228
result.Should().BeNull();
2329
}
2430
}

src/RipSharp.Tests/MetadataServiceTests.cs renamed to src/RipSharp.Tests/Metadata/MetadataServiceTests.cs

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Threading.Tasks;
4+
45
using AwesomeAssertions;
5-
using RipSharp;
6+
67
using NSubstitute;
8+
9+
using RipSharp;
10+
711
using Xunit;
812

9-
namespace RipSharp.Tests;
13+
namespace RipSharp.Tests.Metadata;
1014

1115
public class MetadataServiceTests : IDisposable
1216
{
@@ -28,17 +32,14 @@ public void Dispose()
2832
[Fact]
2933
public async Task LookupAsync_Fallbacks_WhenNoApiKeys()
3034
{
31-
// Arrange
3235
Environment.SetEnvironmentVariable("OMDB_API_KEY", null);
3336
Environment.SetEnvironmentVariable("TMDB_API_KEY", null);
3437
var notifier = Substitute.For<IProgressNotifier>();
3538
var providers = new List<IMetadataProvider>();
3639
var svc = new MetadataService(providers, notifier);
3740

38-
// Act
3941
var md = await svc.LookupAsync("SIMPSONS_WS", isTv: false, year: null);
4042

41-
// Assert
4243
md.Should().NotBeNull();
4344
md!.Title.Should().Be("SIMPSONS_WS");
4445
md.Type.Should().Be("movie");
@@ -48,22 +49,19 @@ public async Task LookupAsync_Fallbacks_WhenNoApiKeys()
4849
[Fact]
4950
public async Task LookupAsync_ReturnsFromFirstProvider_WhenMatch()
5051
{
51-
// Arrange
5252
var notifier = Substitute.For<IProgressNotifier>();
5353
var provider1 = Substitute.For<IMetadataProvider>();
5454
provider1.Name.Returns("Provider1");
55-
provider1.LookupAsync("test", false, null).Returns(new Metadata { Title = "Test Movie", Year = 2020, Type = "movie" });
56-
55+
provider1.LookupAsync("test", false, null).Returns(new ContentMetadata { Title = "Test Movie", Year = 2020, Type = "movie" });
56+
5757
var provider2 = Substitute.For<IMetadataProvider>();
5858
provider2.Name.Returns("Provider2");
59-
59+
6060
var providers = new List<IMetadataProvider> { provider1, provider2 };
6161
var svc = new MetadataService(providers, notifier);
6262

63-
// Act
6463
var result = await svc.LookupAsync("test", isTv: false, year: null);
6564

66-
// Assert
6765
result.Should().NotBeNull();
6866
result!.Title.Should().Be("Test Movie");
6967
await provider1.Received(1).LookupAsync("test", false, null);
@@ -74,23 +72,20 @@ public async Task LookupAsync_ReturnsFromFirstProvider_WhenMatch()
7472
[Fact]
7573
public async Task LookupAsync_TriesSecondProvider_WhenFirstReturnsNull()
7674
{
77-
// Arrange
7875
var notifier = Substitute.For<IProgressNotifier>();
7976
var provider1 = Substitute.For<IMetadataProvider>();
8077
provider1.Name.Returns("Provider1");
81-
provider1.LookupAsync("test", false, null).Returns((Metadata?)null);
82-
78+
provider1.LookupAsync("test", false, null).Returns((ContentMetadata?)null);
79+
8380
var provider2 = Substitute.For<IMetadataProvider>();
8481
provider2.Name.Returns("Provider2");
85-
provider2.LookupAsync("test", false, null).Returns(new Metadata { Title = "Test Movie", Year = 2021, Type = "movie" });
86-
82+
provider2.LookupAsync("test", false, null).Returns(new ContentMetadata { Title = "Test Movie", Year = 2021, Type = "movie" });
83+
8784
var providers = new List<IMetadataProvider> { provider1, provider2 };
8885
var svc = new MetadataService(providers, notifier);
8986

90-
// Act
9187
var result = await svc.LookupAsync("test", isTv: false, year: null);
9288

93-
// Assert
9489
result.Should().NotBeNull();
9590
result!.Title.Should().Be("Test Movie");
9691
await provider1.Received(1).LookupAsync("test", false, null);
@@ -101,20 +96,17 @@ public async Task LookupAsync_TriesSecondProvider_WhenFirstReturnsNull()
10196
[Fact]
10297
public async Task LookupAsync_UsesTitleVariations_WhenOriginalFails()
10398
{
104-
// Arrange
10599
var notifier = Substitute.For<IProgressNotifier>();
106100
var provider = Substitute.For<IMetadataProvider>();
107101
provider.Name.Returns("TestProvider");
108-
provider.LookupAsync("MOVIE_TITLE_2023", Arg.Any<bool>(), Arg.Any<int?>()).Returns((Metadata?)null);
109-
provider.LookupAsync("MOVIE_TITLE", Arg.Any<bool>(), Arg.Any<int?>()).Returns(new Metadata { Title = "Movie Title", Year = 2023, Type = "movie" });
110-
102+
provider.LookupAsync("MOVIE_TITLE_2023", Arg.Any<bool>(), Arg.Any<int?>()).Returns((ContentMetadata?)null);
103+
provider.LookupAsync("MOVIE_TITLE", Arg.Any<bool>(), Arg.Any<int?>()).Returns(new ContentMetadata { Title = "Movie Title", Year = 2023, Type = "movie" });
104+
111105
var providers = new List<IMetadataProvider> { provider };
112106
var svc = new MetadataService(providers, notifier);
113107

114-
// Act
115108
var result = await svc.LookupAsync("MOVIE_TITLE_2023", isTv: false, year: null);
116109

117-
// Assert
118110
result.Should().NotBeNull();
119111
result!.Title.Should().Be("Movie Title");
120112
await provider.Received(1).LookupAsync("MOVIE_TITLE_2023", false, null);
@@ -125,44 +117,38 @@ public async Task LookupAsync_UsesTitleVariations_WhenOriginalFails()
125117
[Fact]
126118
public async Task LookupAsync_ShowsDifferentMessage_ForSimplifiedTitle()
127119
{
128-
// Arrange
129120
var notifier = Substitute.For<IProgressNotifier>();
130121
var provider = Substitute.For<IMetadataProvider>();
131122
provider.Name.Returns("TestProvider");
132-
provider.LookupAsync("SIMPSONS_WS", Arg.Any<bool>(), Arg.Any<int?>()).Returns((Metadata?)null);
133-
provider.LookupAsync("SIMPSONS", Arg.Any<bool>(), Arg.Any<int?>()).Returns(new Metadata { Title = "The Simpsons", Year = 1989, Type = "tv" });
134-
123+
provider.LookupAsync("SIMPSONS_WS", Arg.Any<bool>(), Arg.Any<int?>()).Returns((ContentMetadata?)null);
124+
provider.LookupAsync("SIMPSONS", Arg.Any<bool>(), Arg.Any<int?>()).Returns(new ContentMetadata { Title = "The Simpsons", Year = 1989, Type = "tv" });
125+
135126
var providers = new List<IMetadataProvider> { provider };
136127
var svc = new MetadataService(providers, notifier);
137128

138-
// Act
139129
await svc.LookupAsync("SIMPSONS_WS", isTv: true, year: null);
140130

141-
// Assert
142-
notifier.Received(1).Success(Arg.Is<string>(s =>
143-
s.Contains("simplified title 'SIMPSONS'") &&
131+
notifier.Received(1).Success(Arg.Is<string>(s =>
132+
s.Contains("simplified title 'SIMPSONS'") &&
144133
s.Contains("The Simpsons") &&
145134
s.Contains("(1989)")));
146135
}
147136

148137
[Fact]
149138
public async Task LookupAsync_ShowsNormalMessage_ForOriginalTitle()
150139
{
151-
// Arrange
152140
var notifier = Substitute.For<IProgressNotifier>();
153141
var provider = Substitute.For<IMetadataProvider>();
154142
provider.Name.Returns("TestProvider");
155-
provider.LookupAsync("Test Movie", Arg.Any<bool>(), Arg.Any<int?>()).Returns(new Metadata { Title = "Test Movie", Year = 2020, Type = "movie" });
156-
143+
provider.LookupAsync("Test Movie", Arg.Any<bool>(), Arg.Any<int?>()).Returns(new ContentMetadata { Title = "Test Movie", Year = 2020, Type = "movie" });
144+
157145
var providers = new List<IMetadataProvider> { provider };
158146
var svc = new MetadataService(providers, notifier);
159147

160-
// Act
161148
await svc.LookupAsync("Test Movie", isTv: false, year: null);
162149

163-
// Assert
164-
notifier.Received(1).Success(Arg.Is<string>(s =>
165-
!s.Contains("simplified") &&
150+
notifier.Received(1).Success(Arg.Is<string>(s =>
151+
!s.Contains("simplified") &&
166152
s.Contains("Test Movie") &&
167153
s.Contains("(2020)")));
168154
}

src/RipSharp.Tests/OmdbMetadataProviderTests.cs renamed to src/RipSharp.Tests/Metadata/OmdbMetadataProviderTests.cs

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,29 @@
33
using System.Net.Http;
44
using System.Threading;
55
using System.Threading.Tasks;
6+
67
using AwesomeAssertions;
7-
using RipSharp;
8+
89
using NSubstitute;
10+
11+
using RipSharp;
12+
913
using Xunit;
1014

11-
namespace RipSharp.Tests;
15+
namespace RipSharp.Tests.Metadata;
1216

1317
public class OmdbMetadataProviderTests
1418
{
1519
[Fact]
1620
public async Task LookupAsync_ReturnsMetadata_WhenMovieFound()
1721
{
18-
// Arrange
1922
var json = @"{""Response"":""True"",""Title"":""Inception"",""Year"":""2010"",""Type"":""movie""}";
2023
var httpClient = CreateHttpClient(json);
2124
var notifier = Substitute.For<IProgressNotifier>();
2225
var provider = new OmdbMetadataProvider(httpClient, "test-key", notifier);
2326

24-
// Act
2527
var result = await provider.LookupAsync("inception", isTv: false, year: null);
2628

27-
// Assert
2829
result.Should().NotBeNull();
2930
result!.Title.Should().Be("Inception");
3031
result.Year.Should().Be(2010);
@@ -34,16 +35,13 @@ public async Task LookupAsync_ReturnsMetadata_WhenMovieFound()
3435
[Fact]
3536
public async Task LookupAsync_ReturnsMetadata_WhenTvSeriesFound()
3637
{
37-
// Arrange
3838
var json = @"{""Response"":""True"",""Title"":""Breaking Bad"",""Year"":""2008-2013"",""Type"":""series""}";
3939
var httpClient = CreateHttpClient(json);
4040
var notifier = Substitute.For<IProgressNotifier>();
4141
var provider = new OmdbMetadataProvider(httpClient, "test-key", notifier);
4242

43-
// Act
4443
var result = await provider.LookupAsync("breaking bad", isTv: true, year: 2008);
4544

46-
// Assert
4745
result.Should().NotBeNull();
4846
result!.Title.Should().Be("Breaking Bad");
4947
result.Year.Should().Be(2008);
@@ -53,55 +51,45 @@ public async Task LookupAsync_ReturnsMetadata_WhenTvSeriesFound()
5351
[Fact]
5452
public async Task LookupAsync_ReturnsNull_WhenResponseIsFalse()
5553
{
56-
// Arrange
5754
var json = @"{""Response"":""False"",""Error"":""Movie not found!""}";
5855
var httpClient = CreateHttpClient(json);
5956
var notifier = Substitute.For<IProgressNotifier>();
6057
var provider = new OmdbMetadataProvider(httpClient, "test-key", notifier);
6158

62-
// Act
6359
var result = await provider.LookupAsync("nonexistent movie", isTv: false, year: null);
6460

65-
// Assert
6661
result.Should().BeNull();
6762
}
6863

6964
[Fact]
7065
public async Task LookupAsync_ReturnsNull_WhenJsonMalformed()
7166
{
72-
// Arrange
7367
var json = @"{invalid json}";
7468
var httpClient = CreateHttpClient(json);
7569
var notifier = Substitute.For<IProgressNotifier>();
7670
var provider = new OmdbMetadataProvider(httpClient, "test-key", notifier);
7771

78-
// Act
7972
var result = await provider.LookupAsync("test", isTv: false, year: null);
8073

81-
// Assert
8274
result.Should().BeNull();
8375
}
8476

8577
[Fact]
8678
public async Task LookupAsync_ReturnsNull_WhenHttpRequestFails()
8779
{
88-
// Arrange
8980
var handler = new FakeHttpMessageHandler(HttpStatusCode.ServiceUnavailable);
9081
var httpClient = new HttpClient(handler);
9182
var notifier = Substitute.For<IProgressNotifier>();
9283
var provider = new OmdbMetadataProvider(httpClient, "test-key", notifier);
9384

94-
// Act
9585
var result = await provider.LookupAsync("test", isTv: false, year: null);
9686

97-
// Assert
9887
result.Should().BeNull();
9988
}
10089

10190
[Fact]
10291
public void Name_ReturnsOMDB()
10392
{
104-
// Arrange
10593
var httpClient = new HttpClient();
10694
var notifier = Substitute.For<IProgressNotifier>();
10795
var provider = new OmdbMetadataProvider(httpClient, "test-key", notifier);
@@ -113,35 +101,29 @@ public void Name_ReturnsOMDB()
113101
[Fact]
114102
public async Task LookupAsync_IncludesYear_WhenProvided()
115103
{
116-
// Arrange
117104
var json = @"{""Response"":""True"",""Title"":""Dune"",""Year"":""2021"",""Type"":""movie""}";
118105
var handler = new FakeHttpMessageHandler(json);
119106
var httpClient = new HttpClient(handler);
120107
var notifier = Substitute.For<IProgressNotifier>();
121108
var provider = new OmdbMetadataProvider(httpClient, "test-key", notifier);
122109

123-
// Act
124110
await provider.LookupAsync("dune", isTv: false, year: 2021);
125111

126-
// Assert
127112
handler.RequestUri.Should().NotBeNull();
128113
var url = handler.RequestUri!.ToString();
129-
Assert.Contains("&y=2021", url);
114+
url.Should().Contain("&y=2021");
130115
}
131116

132117
[Fact]
133118
public async Task LookupAsync_HandlesYearParsingFailure()
134119
{
135-
// Arrange
136120
var json = @"{""Response"":""True"",""Title"":""Test"",""Year"":""N/A"",""Type"":""movie""}";
137121
var httpClient = CreateHttpClient(json);
138122
var notifier = Substitute.For<IProgressNotifier>();
139123
var provider = new OmdbMetadataProvider(httpClient, "test-key", notifier);
140124

141-
// Act
142125
var result = await provider.LookupAsync("test", isTv: false, year: 2020);
143126

144-
// Assert
145127
result.Should().NotBeNull();
146128
result!.Year.Should().Be(2020); // Falls back to provided year
147129
}
@@ -172,7 +154,7 @@ public FakeHttpMessageHandler(HttpStatusCode statusCode)
172154
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
173155
{
174156
RequestUri = request.RequestUri;
175-
157+
176158
if (_statusCode != HttpStatusCode.OK)
177159
{
178160
return Task.FromResult(new HttpResponseMessage(_statusCode));

0 commit comments

Comments
 (0)