feat(discovery): add saved job searches

This commit is contained in:
cesnimda
2026-08-31 17:17:48 +02:00
parent 78ad0c66f9
commit c2181afaea
13 changed files with 461 additions and 80 deletions
@@ -2,9 +2,13 @@ using Xunit;
using System.Net;
using System.Text;
using JobTrackerApi.Controllers;
using JobTrackerApi.Data;
using JobTrackerApi.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Moq;
namespace JobTrackerApi.Tests;
@@ -47,6 +51,28 @@ public sealed class JobDiscoveryControllerTests
Assert.Equal("Current title", job.Title);
}
[Fact]
public async Task Saved_search_tracks_new_seen_and_dismissed_results_per_owner()
{
var feed = """{"next_url":"","items":[{"date_modified":"2026-08-30T10:00:00Z","_feed_entry":{"uuid":"job-1","status":"ACTIVE","title":"Backend Developer","businessName":"Acme","municipal":"OSLO"}}]}""";
var client = new HttpClient(new Handler(_ => feed));
var configuration = new ConfigurationBuilder().AddInMemoryCollection(new Dictionary<string, string?> { ["NavJobs:Token"] = "configured-test-token" }).Build();
var current = new Mock<ICurrentUserService>();
current.SetupGet(x => x.UserId).Returns("owner-1");
await using var db = new JobTrackerContext(new DbContextOptionsBuilder<JobTrackerContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options, current.Object);
var controller = new JobDiscoveryController(new ClientFactory(client), configuration, new MemoryCache(new MemoryCacheOptions()), db, current.Object);
var created = Assert.IsType<JobDiscoveryController.SavedSearchDto>(Assert.IsType<CreatedAtActionResult>((await controller.CreateSavedSearch(new("Backend", "backend", "oslo"), default)).Result).Value);
var first = Assert.IsType<JobDiscoveryController.SavedSearchRunDto>(Assert.IsType<OkObjectResult>((await controller.RunSavedSearch(created.Id, default)).Result).Value);
Assert.True(Assert.Single(first.Jobs).IsNew);
var second = Assert.IsType<JobDiscoveryController.SavedSearchRunDto>(Assert.IsType<OkObjectResult>((await controller.RunSavedSearch(created.Id, default)).Result).Value);
Assert.False(Assert.Single(second.Jobs).IsNew);
Assert.IsType<NoContentResult>(await controller.DismissSavedSearchResult(created.Id, "job-1", new(true), default));
var listed = Assert.IsAssignableFrom<IReadOnlyList<JobDiscoveryController.SavedSearchDto>>(Assert.IsType<OkObjectResult>((await controller.ListSavedSearches(default)).Result).Value);
Assert.Equal(1, Assert.Single(listed).DismissedCount);
}
private sealed class ClientFactory(HttpClient client) : IHttpClientFactory
{
public HttpClient CreateClient(string name) => client;