Skip to content

Commit 3239215

Browse files
committed
feature: Add DollyTeams status retrieval in DashboardService and create corresponding DTOs for enhanced dashboard functionality #deploy-test-dolly-backend #deploy-dolly-backend
1 parent d0dea28 commit 3239215

3 files changed

Lines changed: 98 additions & 2 deletions

File tree

apps/dolly-backend/src/main/java/no/nav/dolly/repository/BestillingRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ select count(*) antall, to_char(b.sist_oppdatert, 'YYYY-MM') interval, br.bruker
194194

195195
@Query("""
196196
select count(*) antall, to_char(b.sist_oppdatert, 'YYYY-MM') interval,
197-
t.navn || ','|| t.beskrivelse informasjon
197+
t.navn || '|' || t.beskrivelse informasjon
198198
from bestilling b
199199
join bruker br on br.id = b.bruker_id
200200
join team t on t.bruker_id = br.id

apps/dolly-backend/src/main/java/no/nav/dolly/service/DashboardService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public Flux<DashboardDollyTeamsDTO> getDollyTeamsStatus() {
176176
.interval(fragments.getFirst().getInterval())
177177
.teams(fragments.stream()
178178
.map(fragment -> {
179-
var info = fragment.getInformasjon().split(",", 2);
179+
var info = fragment.getInformasjon().split("\\|", 2);
180180
return new DashboardDollyTeamsDTO.Entry(info[0], info[1], toIntExact(fragment.getAntall()));
181181
})
182182
.sorted(Comparator.comparing(DashboardDollyTeamsDTO.Entry::getNavn))

apps/dolly-backend/src/test/java/no/nav/dolly/service/DashboardServiceTest.java

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
import no.nav.dolly.consumer.brukerservice.dto.BrukerDTO;
77
import no.nav.dolly.consumer.teamkatalog.TeamkatalogConsumer;
88
import no.nav.dolly.consumer.teamkatalog.dto.TeamkatalogDTO;
9+
import no.nav.dolly.domain.dto.DashboardDollyTeamsDTO;
910
import no.nav.dolly.domain.dto.DashboardOrganisasjonerDTO;
1011
import no.nav.dolly.domain.dto.DashboardTeamsDTO;
1112
import no.nav.dolly.domain.jpa.Bruker;
1213
import no.nav.dolly.domain.projection.BestillingerFragment;
14+
import no.nav.dolly.domain.projection.DollyTeamFragment;
1315
import no.nav.dolly.domain.projection.OrganisasjonFragment;
1416
import no.nav.dolly.domain.projection.TeamFragment;
1517
import no.nav.dolly.repository.BestillingRepository;
@@ -418,6 +420,92 @@ void shouldSortOrganisasjonerByNavnAlphabetically() {
418420
.verifyComplete();
419421
}
420422

423+
// ── getDollyTeamsStatus ──────────────────────────────────────────────────
424+
425+
@Test
426+
void shouldReturnEmptyDollyTeamsWhenNoFragments() {
427+
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert()).thenReturn(Flux.empty());
428+
429+
StepVerifier.create(dashboardService.getDollyTeamsStatus())
430+
.verifyComplete();
431+
}
432+
433+
@Test
434+
void shouldParseDollyTeamInformasjonIntoNavnAndBeskrivelse() {
435+
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
436+
.thenReturn(Flux.just(dollyTeamFragment(INTERVAL_1, "Team A", "En beskrivelse", 3L)));
437+
438+
StepVerifier.create(dashboardService.getDollyTeamsStatus())
439+
.assertNext(dto -> {
440+
assertThat(dto.getTeams()).hasSize(1);
441+
var entry = dto.getTeams().getFirst();
442+
assertThat(entry.getNavn()).isEqualTo("Team A");
443+
assertThat(entry.getBeskrivelse()).isEqualTo("En beskrivelse");
444+
assertThat(entry.getUnikeBrukere()).isEqualTo(3);
445+
})
446+
.verifyComplete();
447+
}
448+
449+
@Test
450+
void shouldSumTotaltUnikeBrukereAcrossTeams() {
451+
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
452+
.thenReturn(Flux.just(
453+
dollyTeamFragment(INTERVAL_1, "Team A", "Beskrivelse A", 4L),
454+
dollyTeamFragment(INTERVAL_1, "Team B", "Beskrivelse B", 6L)
455+
));
456+
457+
StepVerifier.create(dashboardService.getDollyTeamsStatus())
458+
.assertNext(dto -> {
459+
assertThat(dto.getTotaltAntallTeams()).isEqualTo(2);
460+
assertThat(dto.getTotaltUnikeBrukere()).isEqualTo(10);
461+
})
462+
.verifyComplete();
463+
}
464+
465+
@Test
466+
void shouldSortDollyTeamsByNavnAlphabetically() {
467+
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
468+
.thenReturn(Flux.just(
469+
dollyTeamFragment(INTERVAL_1, "Zebra", "Z", 1L),
470+
dollyTeamFragment(INTERVAL_1, "Alpha", "A", 1L)
471+
));
472+
473+
StepVerifier.create(dashboardService.getDollyTeamsStatus())
474+
.assertNext(dto -> {
475+
var names = dto.getTeams().stream().map(DashboardDollyTeamsDTO.Entry::getNavn).toList();
476+
assertThat(names).containsExactly("Alpha", "Zebra");
477+
})
478+
.verifyComplete();
479+
}
480+
481+
@Test
482+
void shouldGroupDollyTeamFragmentsByIntervalIntoSeparateDtos() {
483+
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
484+
.thenReturn(Flux.just(
485+
dollyTeamFragment(INTERVAL_1, "Team A", "A", 1L),
486+
dollyTeamFragment(INTERVAL_2, "Team B", "B", 1L)
487+
));
488+
489+
StepVerifier.create(dashboardService.getDollyTeamsStatus())
490+
.assertNext(dto -> assertThat(dto.getInterval()).isEqualTo(INTERVAL_2))
491+
.assertNext(dto -> assertThat(dto.getInterval()).isEqualTo(INTERVAL_1))
492+
.verifyComplete();
493+
}
494+
495+
@Test
496+
void shouldSortDollyTeamsStatusByIntervalDescending() {
497+
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
498+
.thenReturn(Flux.just(
499+
dollyTeamFragment(INTERVAL_1, "Team A", "A", 1L),
500+
dollyTeamFragment(INTERVAL_2, "Team B", "B", 1L)
501+
));
502+
503+
var results = dashboardService.getDollyTeamsStatus().collectList().block();
504+
assertThat(results).isNotNull();
505+
assertThat(results.get(0).getInterval()).isEqualTo(INTERVAL_2);
506+
assertThat(results.get(1).getInterval()).isEqualTo(INTERVAL_1);
507+
}
508+
421509
// ── helpers ──────────────────────────────────────────────────────────────
422510

423511
private static BestillingerFragment fragment(LocalDate dato, Long personer,
@@ -446,4 +534,12 @@ private static OrganisasjonFragment organisasjonFragment(String interval, String
446534
.brukerid(brukerid)
447535
.build();
448536
}
537+
538+
private static DollyTeamFragment dollyTeamFragment(String interval, String navn, String beskrivelse, long antall) {
539+
return DollyTeamFragment.builder()
540+
.interval(interval)
541+
.informasjon(navn + "|" + beskrivelse)
542+
.antall(antall)
543+
.build();
544+
}
449545
}

0 commit comments

Comments
 (0)