public static void Main()
Console.WriteLine("Hello World");
using System.Threading.Tasks;
using Thiccdal.Shared.Repositories;
namespace Thiccdal.Shared.Tests.Repositories
public class PostgresDBRepositoryTests
private readonly Mock<NpgsqlConnection> _mockConnection;
private readonly Mock<NpgsqlCommand> _mockCommand;
private readonly Mock<NpgsqlDataReader> _mockReader;
private readonly PostgresDBRepository _repository;
public PostgresDBRepositoryTests()
_mockConnection = new Mock<NpgsqlConnection>();
_mockCommand = new Mock<NpgsqlCommand>();
_mockReader = new Mock<NpgsqlDataReader>();
_repository = new PostgresDBRepository("connectionString");
_mockConnection.Setup(c => c.OpenAsync(It.IsAny<CancellationToken>())).Verifiable();
_mockConnection.Setup(c => c.CreateCommand()).Returns(_mockCommand.Object);
_mockCommand.Setup(c => c.ExecuteReaderAsync(It.IsAny<CancellationToken>())).ReturnsAsync(_mockReader.Object);
public async Task Get_ReturnsValue_WhenKeyExists()
var expectedValue = new { Name = "Test", Value = 123 };
var json = JsonSerializer.Serialize(expectedValue);
_mockReader.Setup(r => r.HasRows).Returns(true);
_mockReader.Setup(r => r.ReadAsync(It.IsAny<CancellationToken>())).ReturnsAsync(true);
_mockReader.Setup(r => r.GetString(0)).Returns(json);
var result = await _repository.Get<object>("repoName", "key", CancellationToken.None);
Assert.Equal(expectedValue, result);
_mockConnection.Verify();
_mockCommand.Verify(c => c.Parameters.AddWithValue("@name", "repoName"), Times.Once);
_mockCommand.Verify(c => c.Parameters.AddWithValue("@key", "key"), Times.Once);
public async Task Get_ReturnsNull_WhenKeyDoesNotExist()
_mockReader.Setup(r => r.HasRows).Returns(false);
var result = await _repository.Get<object>("repoName", "key", CancellationToken.None);
_mockConnection.Verify();
_mockCommand.Verify(c => c.Parameters.AddWithValue("@name", "repoName"), Times.Once);
_mockCommand.Verify(c => c.Parameters.AddWithValue("@key", "key"), Times.Once);
public async Task Set_InsertsValue_WhenKeyDoesNotExist()
var value = new { Name = "Test", Value = 123 };
var json = JsonSerializer.Serialize(value);
_mockCommand.Setup(c => c.ExecuteNonQueryAsync(It.IsAny<CancellationToken>())).ReturnsAsync(1);
await _repository.Set("repoName", "key", value, CancellationToken.None);
_mockConnection.Verify();
_mockCommand.Verify(c => c.Parameters.AddWithValue("@name", "repoName"), Times.Once);
_mockCommand.Verify(c => c.Parameters.AddWithValue("@key", "key"), Times.Once);
_mockCommand.Verify(c => c.Parameters.AddWithValue("@value", json), Times.Once);
public async Task Set_UpdatesValue_WhenKeyExists()
var value = new { Name = "Test", Value = 123 };
var json = JsonSerializer.Serialize(value);
_mockCommand.Setup(c => c.ExecuteNonQueryAsync(It.IsAny<CancellationToken>())).ReturnsAsync(1);
await _repository.Set("repoName", "key", value, CancellationToken.None);
_mockConnection.Verify();
_mockCommand.Verify(c => c.Parameters.AddWithValue("@name", "repoName"), Times.Once);
_mockCommand.Verify(c => c.Parameters.AddWithValue("@key", "key"), Times.Once);
_mockCommand.Verify(c => c.Parameters.AddWithValue("@value", json), Times.Once);
public async Task Remove_DeletesValue_WhenKeyExists()
_mockCommand.Setup(c => c.ExecuteNonQueryAsync(It.IsAny<CancellationToken>())).ReturnsAsync(1);
await _repository.Remove("repoName", "key", CancellationToken.None);
_mockConnection.Verify();
_mockCommand.Verify(c => c.Parameters.AddWithValue("@name", "repoName"), Times.Once);
_mockCommand.Verify(c => c.Parameters.AddWithValue("@key", "key"), Times.Once);