Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 158 additions & 0 deletions src/Chaptarr.Core.Test/Notifications/Kavita/KavitaFixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
using System.Collections.Generic;
using System.IO;
using FluentValidation.Results;
using NLog;
using NUnit.Framework;
using NzbDrone.Core.Books;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Notifications;
using NzbDrone.Core.Notifications.Kavita;
using NzbDrone.Core.ThingiProvider;

namespace Chaptarr.Core.Test.Notifications.Kavita
{
[TestFixture]
public class KavitaFixture
{
private FakeKavitaService _kavitaService;
private NzbDrone.Core.Notifications.Kavita.Kavita _subject;

[SetUp]
public void SetUp()
{
_kavitaService = new FakeKavitaService();
_subject = new NzbDrone.Core.Notifications.Kavita.Kavita(_kavitaService, LogManager.GetCurrentClassLogger())
{
Definition = new NotificationDefinition
{
Settings = new KavitaSettings
{
Host = "kavita",
Port = 5000,
ApiKey = "test-key",
Notify = true
}
}
};
}

[Test]
public void should_send_parent_folder_path_on_release_import()
{
var filePath = Path.Combine(Path.GetTempPath(), "Books", "Author", "Title", "book.epub");
var expectedFolder = Path.GetDirectoryName(filePath);

var message = new BookDownloadMessage
{
BookFiles = new List<BookFile>
{
new BookFile { Path = filePath }
}
};

_subject.OnReleaseImport(message);

Assert.That(_kavitaService.NotifiedFolders, Has.Count.EqualTo(1));
Assert.That(_kavitaService.NotifiedFolders[0], Is.EqualTo(expectedFolder));
}

[Test]
public void should_not_notify_on_release_import_with_empty_book_files()
{
var message = new BookDownloadMessage
{
BookFiles = new List<BookFile>()
};

Assert.DoesNotThrow(() => _subject.OnReleaseImport(message));
Assert.That(_kavitaService.NotifiedFolders, Is.Empty);
}

[Test]
public void should_send_parent_folder_path_on_book_delete()
{
var filePath = Path.Combine(Path.GetTempPath(), "Books", "Author", "Title", "book.epub");
var expectedFolder = Path.GetDirectoryName(filePath);

var book = new Book
{
BookFiles = new List<BookFile>
{
new BookFile { Path = filePath }
}
};
var message = new BookDeleteMessage(book, true);

_subject.OnBookDelete(message);

Assert.That(_kavitaService.NotifiedFolders, Has.Count.EqualTo(1));
Assert.That(_kavitaService.NotifiedFolders[0], Is.EqualTo(expectedFolder));
}

[Test]
public void should_send_parent_folder_path_on_book_file_delete()
{
var filePath = Path.Combine(Path.GetTempPath(), "Books", "Author", "Title", "book.epub");
var expectedFolder = Path.GetDirectoryName(filePath);

var message = new BookFileDeleteMessage
{
BookFile = new BookFile { Path = filePath }
};

_subject.OnBookFileDelete(message);

Assert.That(_kavitaService.NotifiedFolders, Has.Count.EqualTo(1));
Assert.That(_kavitaService.NotifiedFolders[0], Is.EqualTo(expectedFolder));
}

[Test]
public void should_send_parent_folder_path_on_book_retag()
{
var filePath = Path.Combine(Path.GetTempPath(), "Books", "Author", "Title", "book.epub");
var expectedFolder = Path.GetDirectoryName(filePath);

var message = new BookRetagMessage
{
BookFile = new BookFile { Path = filePath }
};

_subject.OnBookRetag(message);

Assert.That(_kavitaService.NotifiedFolders, Has.Count.EqualTo(1));
Assert.That(_kavitaService.NotifiedFolders[0], Is.EqualTo(expectedFolder));
}

[Test]
public void should_not_notify_when_notify_setting_is_disabled()
{
var settings = (KavitaSettings)_subject.Definition.Settings;
settings.Notify = false;

var filePath = Path.Combine(Path.GetTempPath(), "Books", "Author", "Title", "book.epub");
var message = new BookFileDeleteMessage
{
BookFile = new BookFile { Path = filePath }
};

_subject.OnBookFileDelete(message);

Assert.That(_kavitaService.NotifiedFolders, Is.Empty);
}

private class FakeKavitaService : IKavitaService
{
public List<string> NotifiedFolders { get; } = new List<string>();

public void Notify(KavitaSettings settings, string folderPath)
{
NotifiedFolders.Add(folderPath);
}

public ValidationFailure Test(KavitaSettings settings, string message)
{
return null;
}
}
}
}
22 changes: 15 additions & 7 deletions src/NzbDrone.Core/Notifications/Kavita/Kavita.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,23 @@ public Kavita(IKavitaService kavitaService, Logger logger)
public override void OnReleaseImport(BookDownloadMessage message)
{
var allPaths = message.BookFiles.Select(v => v.Path).Distinct();
var path = Directory.GetParent(allPaths.First())?.FullName;
Notify(Settings, BOOK_DOWNLOADED_TITLE_BRANDED, path);
var firstPath = allPaths.FirstOrDefault();
if (firstPath != null)
{
var path = Directory.GetParent(firstPath)?.FullName;
Notify(Settings, BOOK_DOWNLOADED_TITLE_BRANDED, path);
}
}

public override void OnBookDelete(BookDeleteMessage deleteMessage)
{
var allPaths = deleteMessage.Book.BookFiles.Select(v => v.Path).Distinct();
var path = Directory.GetParent(allPaths.First())?.FullName;
Notify(Settings, BOOK_FILE_DELETED_TITLE_BRANDED, path);
var firstPath = allPaths.FirstOrDefault();
if (firstPath != null)
{
var path = Directory.GetParent(firstPath)?.FullName;
Notify(Settings, BOOK_FILE_DELETED_TITLE_BRANDED, path);
}
}

public override void OnBookFileDelete(BookFileDeleteMessage message)
Expand Down Expand Up @@ -60,14 +68,14 @@ private void Notify(KavitaSettings settings, string header, string message)
{
try
{
if (Settings.Notify)
if (Settings.Notify && !string.IsNullOrWhiteSpace(message))
{
_kavitaService.Notify(Settings, $"{header} - {message}");
_kavitaService.Notify(Settings, message);
}
}
catch (SocketException ex)
{
var logMessage = $"Unable to connect to Subsonic Host: {Settings.Host}:{Settings.Port}";
var logMessage = $"Unable to connect to Kavita Host: {Settings.Host}:{Settings.Port}";
_logger.Debug(ex, logMessage);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/NzbDrone.Core/Notifications/Kavita/KavitaService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace NzbDrone.Core.Notifications.Kavita;

public interface IKavitaService
{
void Notify(KavitaSettings settings, string message);
void Notify(KavitaSettings settings, string folderPath);
ValidationFailure Test(KavitaSettings settings, string message);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace NzbDrone.Core.Notifications.Kavita;
public interface IKavitaServiceProxy
{
string GetBaseUrl(KavitaSettings settings, string relativePath = null);
void Notify(KavitaSettings settings, string message);
void Notify(KavitaSettings settings, string folderPath);
string GetToken(KavitaSettings settings);
}

Expand Down