Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hide items in the recycle bin #151

Merged
merged 5 commits into from
May 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
38 changes: 36 additions & 2 deletions KeeTrayTOTP.Tests/Extensions/PwDocumentExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using KeePassLib;
using KeePassLib.Keys;
using KeePassLib.Serialization;
using System.Collections.Generic;
using System.Linq;

namespace KeeTrayTOTP.Tests.Extensions
{
Expand All @@ -17,14 +19,23 @@ public static PwDocument Locked(this PwDocument pwDocument)
public static PwDocument NewAs(this PwDocument pwDocument, string filename)
{
pwDocument.Database.New(IOConnectionInfo.FromPath(filename), new CompositeKey());
return pwDocument;

return pwDocument.CreateRecycleBin();
}

public static PwDocument New(this PwDocument pwDocument)
{
return pwDocument.NewAs("foobar");
}

public static PwDocument CreateRecycleBin(this PwDocument pwDocument)
{
var recycleBin = pwDocument.Database.RootGroup.FindCreateGroup("Recycle bin", true);
pwDocument.Database.RecycleBinUuid = recycleBin.Uuid;

return pwDocument;
}

public static PwDocument WithTotpEnabledEntries(this PwDocument pwDocument, int count)
{
for (int i = 0; i < count; i++)
Expand All @@ -33,7 +44,20 @@ public static PwDocument WithTotpEnabledEntries(this PwDocument pwDocument, int
new PwEntry(true, true).WithValidTotpSettings(),
true);
}


return pwDocument;
}

public static PwDocument WithDeletedTotpEnabledEntries(this PwDocument pwDocument, int count)
{
var recycleBin = pwDocument.Database.RootGroup.FindGroup(pwDocument.Database.RecycleBinUuid, true);
for (int i = 0; i < count; i++)
{
recycleBin.AddEntry(
new PwEntry(true, true).WithValidTotpSettings(),
true);
}

return pwDocument;
}

Expand All @@ -60,5 +84,15 @@ public static PwDocument WithNonTotpEntries(this PwDocument pwDocument, int coun

return pwDocument;
}

public static IEnumerable<PwDocument> AsEnumerable(this PwDocument pwDocument)
{
yield return pwDocument;
}

public static List<PwDocument> AsList(this PwDocument pwDocument)
{
return pwDocument.AsEnumerable().ToList();
}
}
}
31 changes: 31 additions & 0 deletions KeeTrayTOTP.Tests/Helpers/PluginHostHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using KeePass.App.Configuration;
using KeePass.Forms;
using KeePass.Plugins;
using KeePass.UI;
using Moq;

namespace KeeTrayTOTP.Tests.Helpers
{
public static class PluginHostHelper
{
public static (KeeTrayTOTPExt plugin, Mock<IPluginHost> pluginHost) Create()
{
var plugin = new KeeTrayTOTPExt();
var pluginHost = new Mock<IPluginHost>(MockBehavior.Strict);

pluginHost.SetupGet(c => c.MainWindow).Returns(new MainForm());
pluginHost.SetupGet(c => c.CustomConfig).Returns(new AceCustomConfig());
pluginHost.SetupGet(c => c.ColumnProviderPool).Returns(new ColumnProviderPool());

return (plugin, pluginHost);
}

public static (KeeTrayTOTPExt plugin, Mock<IPluginHost> pluginHost) CreateAndInitialize()
{
var createResult = Create();
createResult.plugin.Initialize(createResult.pluginHost.Object);

return createResult;
}
}
}
29 changes: 4 additions & 25 deletions KeeTrayTOTP.Tests/Menu/LegacyTrayMenuTests.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
using FluentAssertions;
using KeePass.App.Configuration;
using KeePass.Forms;
using KeePass.Plugins;
using KeePass.UI;
using KeeTrayTOTP.Menu;
using KeeTrayTOTP.Tests.Helpers;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace KeeTrayTOTP.Tests.Menu
{
Expand All @@ -15,7 +11,7 @@ public class LegacyTrayMenuTests
[TestMethod]
public void LegacyTrayMenuItemProvider_ShouldReturnNull()
{
var plugin = CreatePluginHostMock(out var host);
var (plugin, host) = PluginHostHelper.Create();
var legacyTrayMenuItemProvider = new LegacyTrayMenuItemProvider(plugin, host.Object);

var sut = legacyTrayMenuItemProvider.ProvideMenuItem();
Expand All @@ -26,32 +22,15 @@ public void LegacyTrayMenuItemProvider_ShouldReturnNull()
[TestMethod]
public void LegacyTrayMenuItemProvider_ShouldAddItemsDirectlyToMainWindowsTrayContextMenu()
{
var plugin = CreatePluginHostMock(out var host);
var (plugin, host) = PluginHostHelper.Create();
host.Object.CustomConfig.SetBool("traymenulegacymenuprovider_enable", true);
var oldItemCount = host.Object.MainWindow.TrayContextMenu.Items.Count;

plugin.Initialize(host.Object);

var sut = host.Object.MainWindow.TrayContextMenu.Items.Count;

sut.Should().Be(oldItemCount + 2);
}

private static KeeTrayTOTPExt CreatePluginHostMock(out Mock<IPluginHost> host)
{
var plugin = new KeeTrayTOTPExt();
host = new Mock<IPluginHost>(MockBehavior.Strict);

var mainForm = new MainForm();
host.SetupGet(c => c.MainWindow).Returns(mainForm);

var customConfig = new AceCustomConfig();
host.SetupGet(c => c.CustomConfig).Returns(customConfig);

var columnProviderPool = new ColumnProviderPool();
host.SetupGet(c => c.ColumnProviderPool).Returns(columnProviderPool);

return plugin;
}
}
}
24 changes: 2 additions & 22 deletions KeeTrayTOTP.Tests/Menu/MenuItemProviderTests.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
using FluentAssertions;
using KeePass.App.Configuration;
using KeePass.Forms;
using KeePass.Plugins;
using KeePass.UI;
using KeeTrayTOTP.Menu;
using KeeTrayTOTP.Tests.Helpers;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

Expand All @@ -18,8 +16,7 @@ public class MenuItemProviderTests
[TestInitialize]
public void Initialize()
{
_plugin = CreatePluginHostMock(out var host);
_host = host;
(_plugin, _host) = PluginHostHelper.Create();
}

[TestMethod]
Expand Down Expand Up @@ -104,22 +101,5 @@ public void MenuItemProvider_ShouldReturnNullForUnknownEnumValue()
var mainMenuItem = sut.GetMenuItem((PluginMenuType)4);
mainMenuItem.Should().BeNull();
}

private static KeeTrayTOTPExt CreatePluginHostMock(out Mock<IPluginHost> host)
{
var plugin = new KeeTrayTOTPExt();
host = new Mock<IPluginHost>(MockBehavior.Strict);

var mainForm = new MainForm();
host.SetupGet(c => c.MainWindow).Returns(mainForm);

var customConfig = new AceCustomConfig();
host.SetupGet(c => c.CustomConfig).Returns(customConfig);

var columnProviderPool = new ColumnProviderPool();
host.SetupGet(c => c.ColumnProviderPool).Returns(columnProviderPool);

return plugin;
}
}
}
83 changes: 35 additions & 48 deletions KeeTrayTOTP.Tests/Menu/TrayMenuTests.cs
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
using System.Collections.Generic;
using System.Linq;
using FluentAssertions;
using KeePass.App.Configuration;
using KeePass.Forms;
using KeePass.Plugins;
using FluentAssertions;
using KeePass.UI;
using KeeTrayTOTP.Menu;
using KeeTrayTOTP.Tests.Extensions;
using KeeTrayTOTP.Tests.Helpers;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System.Collections.Generic;
using System.Linq;

namespace KeeTrayTOTP.Tests.Menu
{
[TestClass]
public class TrayMenuTests
{
private KeeTrayTOTPExt _plugin;
private TrayMenuItemProvider _trayMenuItemProvider;

[TestInitialize]
public void Initialize()
{
_plugin = CreatePluginHostMock(out var host);
_trayMenuItemProvider = new TrayMenuItemProvider(_plugin, host.Object);
var (plugin, host) = PluginHostHelper.CreateAndInitialize();

_trayMenuItemProvider = new TrayMenuItemProvider(plugin, host.Object);
}

[TestMethod]
Expand All @@ -37,28 +34,21 @@ public void TrayMenuItemProvider_ShouldReturnANewDropDownMenuItem()
[TestMethod]
public void BuildMenuItemsForRootDropDown_ShouldReturnCorrectMenuItem_IfNoDatabaseIsOpened()
{
var documents = new List<PwDocument>(new[]
{
new PwDocument()
});
var pwDocument = new PwDocument();

var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(documents).ToList();
var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(pwDocument.AsList()).ToList();

sut.Count.Should().Be(1);
sut.First().Text.Should().Be(Localization.Strings.NoDatabaseIsOpened,
"because, there is no open database. (KeePass always provides a (new) PwDocument, even if there is no database open.");
}


[TestMethod]
public void BuildMenuItemsForRootDropDown_ShouldReturnEntryMenuItems_IfThereIsOnlyASingleDatabase()
{
var documents = new List<PwDocument>(new[]
{
new PwDocument().New().WithNonTotpEntries(2).WithTotpEnabledEntries(4)
});
var pwDocument = new PwDocument().New().WithNonTotpEntries(2).WithTotpEnabledEntries(4);

var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(documents).ToList();
var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(pwDocument.AsList()).ToList();

sut.Count.Should().Be(4,
"because, the items are added directly to the root tray menuitem if there is only a single database opened.");
Expand All @@ -67,12 +57,9 @@ public void BuildMenuItemsForRootDropDown_ShouldReturnEntryMenuItems_IfThereIsOn
[TestMethod]
public void BuildMenuItemsForRootDropDown_ShouldReturnCorrectInfo_IfThereAreNoTotpEntries()
{
var documents = new List<PwDocument>(new[]
{
new PwDocument().New().WithNonTotpEntries(4)
});
var pwDocument = new PwDocument().New().WithNonTotpEntries(4);

var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(documents).ToList();
var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(pwDocument.AsList()).ToList();

sut.Count.Should().Be(1);
sut.First().Text.Should().Contain(Localization.Strings.NoTOTPEntriesFound,
Expand All @@ -97,12 +84,9 @@ public void BuildMenuItemsForRootDropDown_ShouldReturnEntryMenuItems_IfThereIsAt
[TestMethod]
public void BuildMenuItemsForRootDropDown_ShouldCreateASingleMenuItemWithLocked_IfASingleLockedDatabasesIsPresent()
{
var documents = new List<PwDocument>(new[]
{
new PwDocument().New().Locked()
});
var pwDocument = new PwDocument().New().Locked();

var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(documents).ToList();
var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(pwDocument.AsList()).ToList();

sut.Count.Should().Be(1);
sut.First().Text.Should().Contain("[" + Localization.Strings.Locked + "]", "because, there is only a locked database.");
Expand All @@ -127,35 +111,38 @@ public void BuildMenuItemsForRootDropDown_ShouldCreateMenuItemsContainingLocked_
[TestMethod]
public void BuildMenuItemsForRootDropDown_ShouldCreateDisabledMenuItems_IfTotpSettingsNotValid()
{
var documents = new List<PwDocument>(new[]
{
new PwDocument().New().WithFaultyTotpEnabledEntries(2)
});
var pwDocument = new PwDocument().New().WithFaultyTotpEnabledEntries(2);

var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(documents).ToList();
var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(pwDocument.AsList()).ToList();

sut.Count.Should().Be(2);
sut.Should().OnlyContain(s => !s.Enabled,
sut.Should().OnlyContain(s => !s.Enabled,
"because all entries contain invalid settings and can't be used");
}

private static KeeTrayTOTPExt CreatePluginHostMock(out Mock<IPluginHost> host)
[TestMethod]
public void BuildMenuItemsForRootDropDown_ShouldReturnEntryMenuItemsNotInRecycleBin()
{
var plugin = new KeeTrayTOTPExt();
host = new Mock<IPluginHost>(MockBehavior.Strict);
var pwDocument = new PwDocument().New().WithNonTotpEntries(2).WithTotpEnabledEntries(4).WithDeletedTotpEnabledEntries(2);

var mainForm = new MainForm();
host.SetupGet(c => c.MainWindow).Returns(mainForm);
var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(pwDocument.AsList()).ToList();

var customConfig = new AceCustomConfig();
host.SetupGet(c => c.CustomConfig).Returns(customConfig);
sut.Count.Should().Be(4,
"because, valid entries in the recycle bin should not show up.");
}

[TestMethod]
public void BuildMenuItemsForRootDropDown_ShouldReturnEntryMenuItems_WhenRecycleBinNotEnabled()
{
var pwDocument = new PwDocument().New().WithNonTotpEntries(2).WithTotpEnabledEntries(4).WithDeletedTotpEnabledEntries(2);

var columnProviderPool = new ColumnProviderPool();
host.SetupGet(c => c.ColumnProviderPool).Returns(columnProviderPool);
// Treat recycle bin as a regular folder
pwDocument.Database.RecycleBinEnabled = false;

plugin.Initialize(host.Object);
var sut = _trayMenuItemProvider.BuildMenuItemsForRootDropDown(pwDocument.AsList()).ToList();

return plugin;
sut.Count.Should().Be(6,
"because, the recycle bin is treated as a regular folder.");
}
}
}
13 changes: 6 additions & 7 deletions KeeTrayTOTP/Menu/TrayMenuItemProvider.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using KeePass.Plugins;
using KeePass.UI;
using KeePass.Util.Spr;
using KeePassLib;
using KeePassLib.Utility;
using KeeTrayTOTP.Helpers;
using KeeTrayTOTP.Properties;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace KeeTrayTOTP.Menu
{
Expand Down Expand Up @@ -157,7 +157,7 @@ private void OnDatabaseDropDownOpening(object sender, EventArgs e)

protected IEnumerable<ToolStripMenuItem> CreateDatabaseSubMenuItemsFromPwDocument(PwDocument pwDocument)
{
var validPwEntries = Plugin.GetVisibleAndValidPasswordEntries(pwDocument.Database.RootGroup).ToArray();
var validPwEntries = Plugin.GetVisibleAndValidPasswordEntries(pwDocument.Database).ToArray();
if (validPwEntries.Length > 0)
{
return validPwEntries.Select(entry => CreateMenuItemFromPwEntry(entry, pwDocument.Database));
Expand Down Expand Up @@ -267,6 +267,5 @@ protected void OnNotifyMenuTOTPClick(object sender, EventArgs e)
Plugin.TOTPCopyToClipboard(pe);
}
}

}
}