Best Kotest code snippet using io.kotest.matchers.collections.inorder
OpprettRevurderingServiceTest.kt
Source:OpprettRevurderingServiceTest.kt  
1package no.nav.su.se.bakover.service.revurdering2import arrow.core.getOrHandle3import arrow.core.left4import arrow.core.nonEmptyListOf5import arrow.core.right6import io.kotest.matchers.collections.shouldHaveSize7import io.kotest.matchers.shouldBe8import no.nav.su.se.bakover.common.UUID309import no.nav.su.se.bakover.common.desember10import no.nav.su.se.bakover.common.juli11import no.nav.su.se.bakover.common.juni12import no.nav.su.se.bakover.common.mars13import no.nav.su.se.bakover.common.periode.Periode14import no.nav.su.se.bakover.common.periode.juni15import no.nav.su.se.bakover.common.periode.Ã¥r16import no.nav.su.se.bakover.common.startOfMonth17import no.nav.su.se.bakover.common.toTidspunkt18import no.nav.su.se.bakover.domain.CopyArgs19import no.nav.su.se.bakover.domain.Fnr20import no.nav.su.se.bakover.domain.Saksnummer21import no.nav.su.se.bakover.domain.avkorting.AvkortingVedRevurdering22import no.nav.su.se.bakover.domain.avkorting.Avkortingsvarsel23import no.nav.su.se.bakover.domain.grunnlag.Grunnlag24import no.nav.su.se.bakover.domain.grunnlag.Grunnlagsdata25import no.nav.su.se.bakover.domain.grunnlag.Uføregrad26import no.nav.su.se.bakover.domain.oppgave.OppgaveConfig27import no.nav.su.se.bakover.domain.oppgave.OppgaveFeil.KunneIkkeOppretteOppgave28import no.nav.su.se.bakover.domain.oppgave.OppgaveId29import no.nav.su.se.bakover.domain.person.KunneIkkeHentePerson30import no.nav.su.se.bakover.domain.revurdering.ForhÃ¥ndsvarsel31import no.nav.su.se.bakover.domain.revurdering.InformasjonSomRevurderes32import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering33import no.nav.su.se.bakover.domain.revurdering.RevurderingRepo34import no.nav.su.se.bakover.domain.revurdering.Revurderingsteg35import no.nav.su.se.bakover.domain.revurdering.RevurderingsÃ¥rsak36import no.nav.su.se.bakover.domain.revurdering.Vurderingstatus37import no.nav.su.se.bakover.domain.søknadsbehandling.Stønadsperiode38import no.nav.su.se.bakover.domain.vedtak.GjeldendeVedtaksdata39import no.nav.su.se.bakover.domain.vedtak.VedtakSomKanRevurderes40import no.nav.su.se.bakover.domain.vilkÃ¥r.Resultat41import no.nav.su.se.bakover.domain.vilkÃ¥r.VilkÃ¥r42import no.nav.su.se.bakover.domain.vilkÃ¥r.VilkÃ¥rsvurderinger43import no.nav.su.se.bakover.domain.vilkÃ¥r.Vurderingsperiode44import no.nav.su.se.bakover.service.argThat45import no.nav.su.se.bakover.service.formueVilkÃ¥r46import no.nav.su.se.bakover.service.oppgave.OppgaveService47import no.nav.su.se.bakover.service.person.PersonService48import no.nav.su.se.bakover.service.revurdering.RevurderingTestUtils.periodeNesteMÃ¥nedOgTreMÃ¥nederFram49import no.nav.su.se.bakover.service.revurdering.RevurderingTestUtils.stønadsperiodeNesteMÃ¥nedOgTreMÃ¥nederFram50import no.nav.su.se.bakover.service.søknadsbehandling.testBeregning51import no.nav.su.se.bakover.service.vedtak.KunneIkkeKopiereGjeldendeVedtaksdata52import no.nav.su.se.bakover.service.vedtak.VedtakService53import no.nav.su.se.bakover.test.TestSessionFactory54import no.nav.su.se.bakover.test.TikkendeKlokke55import no.nav.su.se.bakover.test.aktørId56import no.nav.su.se.bakover.test.create57import no.nav.su.se.bakover.test.fixedClock58import no.nav.su.se.bakover.test.fixedLocalDate59import no.nav.su.se.bakover.test.fixedTidspunkt60import no.nav.su.se.bakover.test.fnr61import no.nav.su.se.bakover.test.formuevilkÃ¥rIkkeVurdert62import no.nav.su.se.bakover.test.generer63import no.nav.su.se.bakover.test.getOrFail64import no.nav.su.se.bakover.test.innvilgetUførevilkÃ¥rForventetInntekt1200065import no.nav.su.se.bakover.test.iverksattRevurderingInnvilgetFraInnvilgetSøknadsbehandlingsVedtak66import no.nav.su.se.bakover.test.plus67import no.nav.su.se.bakover.test.sakId68import no.nav.su.se.bakover.test.saksbehandler69import no.nav.su.se.bakover.test.saksnummer70import no.nav.su.se.bakover.test.søknadsbehandlingIverksattInnvilget71import no.nav.su.se.bakover.test.tilstrekkeligDokumentert72import no.nav.su.se.bakover.test.uføregrunnlagForventetInntekt1200073import no.nav.su.se.bakover.test.utenlandsoppholdAvslag74import no.nav.su.se.bakover.test.utenlandsoppholdInnvilget75import no.nav.su.se.bakover.test.vedtakRevurdering76import no.nav.su.se.bakover.test.vilkÃ¥rsvurderingerSøknadsbehandlingInnvilget77import org.junit.jupiter.api.Test78import org.mockito.kotlin.any79import org.mockito.kotlin.anyOrNull80import org.mockito.kotlin.doReturn81import org.mockito.kotlin.inOrder82import org.mockito.kotlin.mock83import org.mockito.kotlin.verify84import java.time.temporal.ChronoUnit85import java.util.UUID86internal class OpprettRevurderingServiceTest {87    private val informasjonSomRevurderes = listOf(88        Revurderingsteg.Inntekt,89    )90    private val uføregrunnlag = uføregrunnlagForventetInntekt12000(periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram)91    private val vilkÃ¥rsvurderingUføre =92        innvilgetUførevilkÃ¥rForventetInntekt12000(periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram)93    private fun createInnvilgetBehandling() = søknadsbehandlingIverksattInnvilget(94        stønadsperiode = stønadsperiodeNesteMÃ¥nedOgTreMÃ¥nederFram,95        vilkÃ¥rsvurderinger = vilkÃ¥rsvurderingerSøknadsbehandlingInnvilget(96            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,97            uføre = vilkÃ¥rsvurderingUføre,98        ),99    ).second100    private fun createSøknadsbehandlingVedtak() =101        VedtakSomKanRevurderes.fromSøknadsbehandling(createInnvilgetBehandling(), UUID30.randomUUID(), fixedClock)102    @Test103    fun `oppretter en revurdering`() {104        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(105            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,106            vedtakListe = nonEmptyListOf(createSøknadsbehandlingVedtak()),107            clock = fixedClock,108        )109        val vedtakServiceMock = mock<VedtakService> {110            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()111        }112        val revurderingRepoMock = mock<RevurderingRepo>()113        val personServiceMock = mock<PersonService> {114            on { hentAktørId(any()) } doReturn aktørId.right()115        }116        val oppgaveServiceMock = mock<OppgaveService> {117            on { opprettOppgave(any()) } doReturn OppgaveId("oppgaveId").right()118        }119        val mocks = RevurderingServiceMocks(120            vedtakService = vedtakServiceMock,121            revurderingRepo = revurderingRepoMock,122            oppgaveService = oppgaveServiceMock,123            personService = personServiceMock,124            avkortingsvarselRepo = mock {125                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen126            },127        )128        val actual = mocks.revurderingService.opprettRevurdering(129            OpprettRevurderingRequest(130                sakId = sakId,131                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,132                Ã¥rsak = "MELDING_FRA_BRUKER",133                begrunnelse = "Ny informasjon",134                saksbehandler = saksbehandler,135                informasjonSomRevurderes = informasjonSomRevurderes,136            ),137        ).orNull()!!138        val tilRevurdering =139            gjeldendeVedtaksdata.gjeldendeVedtakPÃ¥Dato(periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed) as VedtakSomKanRevurderes.EndringIYtelse140        actual.let { opprettetRevurdering ->141            opprettetRevurdering.periode shouldBe periodeNesteMÃ¥nedOgTreMÃ¥nederFram142            opprettetRevurdering.tilRevurdering shouldBe tilRevurdering143            opprettetRevurdering.saksbehandler shouldBe saksbehandler144            opprettetRevurdering.oppgaveId shouldBe OppgaveId("oppgaveId")145            opprettetRevurdering.fritekstTilBrev shouldBe ""146            opprettetRevurdering.revurderingsÃ¥rsak shouldBe RevurderingsÃ¥rsak.create(147                Ã¥rsak = RevurderingsÃ¥rsak.Ã
rsak.MELDING_FRA_BRUKER.toString(), begrunnelse = "Ny informasjon",148            )149            opprettetRevurdering.forhÃ¥ndsvarsel shouldBe null150            opprettetRevurdering.vilkÃ¥rsvurderinger.uføre.grunnlag.let {151                it shouldHaveSize 1152                it[0].ekvivalentMed(uføregrunnlag)153            }154            opprettetRevurdering.vilkÃ¥rsvurderinger.uføre.ekvivalentMed(vilkÃ¥rsvurderingUføre)155            opprettetRevurdering.informasjonSomRevurderes shouldBe InformasjonSomRevurderes.create(mapOf(Revurderingsteg.Inntekt to Vurderingstatus.IkkeVurdert))156            inOrder(157                *mocks.all(),158            ) {159                verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed)160                verify(personServiceMock).hentAktørId(argThat { it shouldBe fnr })161                verify(mocks.avkortingsvarselRepo).hentUtestÃ¥ende(any())162                verify(oppgaveServiceMock).opprettOppgave(163                    argThat {164                        it shouldBe OppgaveConfig.Revurderingsbehandling(165                            saksnummer = saksnummer,166                            aktørId = aktørId,167                            tilordnetRessurs = null,168                            clock = fixedClock,169                        )170                    },171                )172                verify(revurderingRepoMock).defaultTransactionContext()173                verify(revurderingRepoMock).lagre(argThat { it.right() shouldBe actual.right() }, anyOrNull())174            }175            mocks.verifyNoMoreInteractions()176        }177    }178    @Test179    fun `kan opprette revurdering med Ã¥rsak g-regulering i samme mÃ¥ned`() {180        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(181            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,182            vedtakListe = nonEmptyListOf(createSøknadsbehandlingVedtak()),183            clock = fixedClock,184        )185        val vedtakServiceMock = mock<VedtakService> {186            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()187        }188        val revurderingRepoMock = mock<RevurderingRepo>()189        val personServiceMock = mock<PersonService> {190            on { hentAktørId(any()) } doReturn aktørId.right()191        }192        val oppgaveServiceMock = mock<OppgaveService> {193            on { opprettOppgave(any()) } doReturn OppgaveId("oppgaveId").right()194        }195        val mocks = RevurderingServiceMocks(196            vedtakService = vedtakServiceMock,197            revurderingRepo = revurderingRepoMock,198            oppgaveService = oppgaveServiceMock,199            personService = personServiceMock,200            avkortingsvarselRepo = mock {201                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen202            },203        )204        val actual = mocks.revurderingService.opprettRevurdering(205            OpprettRevurderingRequest(206                sakId = sakId,207                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,208                Ã¥rsak = "REGULER_GRUNNBELÃP",209                begrunnelse = "g-regulering",210                saksbehandler = saksbehandler,211                informasjonSomRevurderes = informasjonSomRevurderes,212            ),213        ).getOrHandle {214            throw RuntimeException("$it")215        }216        val tilRevurdering =217            gjeldendeVedtaksdata.gjeldendeVedtakPÃ¥Dato(periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed) as VedtakSomKanRevurderes.EndringIYtelse218        val periode =219            Periode.create(periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed, periodeNesteMÃ¥nedOgTreMÃ¥nederFram.tilOgMed)220        actual.let { opprettetRevurdering ->221            opprettetRevurdering.periode shouldBe periode222            opprettetRevurdering.tilRevurdering shouldBe tilRevurdering223            opprettetRevurdering.saksbehandler shouldBe saksbehandler224            opprettetRevurdering.oppgaveId shouldBe OppgaveId("oppgaveId")225            opprettetRevurdering.fritekstTilBrev shouldBe ""226            opprettetRevurdering.revurderingsÃ¥rsak shouldBe RevurderingsÃ¥rsak(227                RevurderingsÃ¥rsak.Ã
rsak.REGULER_GRUNNBELÃP,228                RevurderingsÃ¥rsak.Begrunnelse.create("g-regulering"),229            )230            opprettetRevurdering.forhÃ¥ndsvarsel shouldBe ForhÃ¥ndsvarsel.Ferdigbehandlet.SkalIkkeForhÃ¥ndsvarsles231            opprettetRevurdering.vilkÃ¥rsvurderinger.uføre.grunnlag.let {232                it shouldHaveSize 1233                it[0].ekvivalentMed(uføregrunnlag.copy(periode = periode))234            }235            opprettetRevurdering.vilkÃ¥rsvurderinger.uføre.ekvivalentMed(236                vilkÃ¥rsvurderingUføre.copy(237                    vurderingsperioder = vilkÃ¥rsvurderingUføre.vurderingsperioder.map {238                        it.copy(CopyArgs.Tidslinje.NyPeriode(periode))239                    },240                ),241            )242            opprettetRevurdering.informasjonSomRevurderes shouldBe InformasjonSomRevurderes.create(mapOf(Revurderingsteg.Inntekt to Vurderingstatus.IkkeVurdert))243        }244        inOrder(245            *mocks.all(),246        ) {247            verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periode.fraOgMed)248            verify(personServiceMock).hentAktørId(argThat { it shouldBe fnr })249            verify(mocks.avkortingsvarselRepo).hentUtestÃ¥ende(any())250            verify(oppgaveServiceMock).opprettOppgave(251                argThat {252                    it shouldBe OppgaveConfig.Revurderingsbehandling(253                        saksnummer = saksnummer,254                        aktørId = aktørId,255                        tilordnetRessurs = null,256                        clock = fixedClock,257                    )258                },259            )260            verify(revurderingRepoMock).defaultTransactionContext()261            verify(revurderingRepoMock).lagre(argThat { it.right() shouldBe actual.right() }, anyOrNull())262        }263        mocks.verifyNoMoreInteractions()264    }265    @Test266    fun `kan opprette revurdering med Ã¥rsak g-regulering 1 kalendermÃ¥ned tilbake i tid`() {267        val periode = Periode.create(268            periodeNesteMÃ¥nedOgTreMÃ¥nederFram.tilOgMed.minusMonths(1).startOfMonth(),269            periodeNesteMÃ¥nedOgTreMÃ¥nederFram.tilOgMed,270        )271        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(272            periode = periode,273            vedtakListe = nonEmptyListOf(createSøknadsbehandlingVedtak()),274            clock = fixedClock,275        )276        val vedtakServiceMock = mock<VedtakService> {277            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()278        }279        val revurderingRepoMock = mock<RevurderingRepo>()280        val personServiceMock = mock<PersonService> {281            on { hentAktørId(any()) } doReturn aktørId.right()282        }283        val oppgaveServiceMock = mock<OppgaveService> {284            on { opprettOppgave(any()) } doReturn OppgaveId("oppgaveId").right()285        }286        val mocks = RevurderingServiceMocks(287            vedtakService = vedtakServiceMock,288            revurderingRepo = revurderingRepoMock,289            oppgaveService = oppgaveServiceMock,290            personService = personServiceMock,291            avkortingsvarselRepo = mock {292                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen293            },294        )295        val actual = mocks.revurderingService.opprettRevurdering(296            OpprettRevurderingRequest(297                sakId = sakId,298                fraOgMed = periode.tilOgMed.minusMonths(1).startOfMonth(),299                Ã¥rsak = "REGULER_GRUNNBELÃP",300                begrunnelse = "g-regulering",301                saksbehandler = saksbehandler,302                informasjonSomRevurderes = informasjonSomRevurderes,303            ),304        ).getOrHandle {305            throw RuntimeException("$it")306        }307        val tilRevurdering =308            gjeldendeVedtaksdata.gjeldendeVedtakPÃ¥Dato(periode.fraOgMed) as VedtakSomKanRevurderes.EndringIYtelse309        actual.let { opprettetRevurdering ->310            opprettetRevurdering.periode shouldBe periode311            opprettetRevurdering.tilRevurdering shouldBe tilRevurdering312            opprettetRevurdering.saksbehandler shouldBe saksbehandler313            opprettetRevurdering.oppgaveId shouldBe OppgaveId("oppgaveId")314            opprettetRevurdering.fritekstTilBrev shouldBe ""315            opprettetRevurdering.revurderingsÃ¥rsak shouldBe RevurderingsÃ¥rsak(316                RevurderingsÃ¥rsak.Ã
rsak.REGULER_GRUNNBELÃP,317                RevurderingsÃ¥rsak.Begrunnelse.create("g-regulering"),318            )319            opprettetRevurdering.forhÃ¥ndsvarsel shouldBe ForhÃ¥ndsvarsel.Ferdigbehandlet.SkalIkkeForhÃ¥ndsvarsles320            opprettetRevurdering.vilkÃ¥rsvurderinger.uføre.grunnlag.let {321                it shouldHaveSize 1322                it[0].ekvivalentMed(uføregrunnlag.copy(periode = periode))323            }324            opprettetRevurdering.vilkÃ¥rsvurderinger.uføre.ekvivalentMed(325                vilkÃ¥rsvurderingUføre.copy(326                    vurderingsperioder = vilkÃ¥rsvurderingUføre.vurderingsperioder.map {327                        it.copy(CopyArgs.Tidslinje.NyPeriode(periode))328                    },329                ),330            )331            opprettetRevurdering.informasjonSomRevurderes shouldBe InformasjonSomRevurderes.create(mapOf(Revurderingsteg.Inntekt to Vurderingstatus.IkkeVurdert))332        }333        inOrder(334            *mocks.all(),335        ) {336            verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periode.fraOgMed)337            verify(personServiceMock).hentAktørId(argThat { it shouldBe fnr })338            verify(mocks.avkortingsvarselRepo).hentUtestÃ¥ende(any())339            verify(oppgaveServiceMock).opprettOppgave(340                argThat {341                    it shouldBe OppgaveConfig.Revurderingsbehandling(342                        saksnummer = saksnummer,343                        aktørId = aktørId,344                        tilordnetRessurs = null,345                        clock = fixedClock,346                    )347                },348            )349            verify(revurderingRepoMock).defaultTransactionContext()350            verify(revurderingRepoMock).lagre(argThat { it.right() shouldBe actual.right() }, anyOrNull())351        }352        mocks.verifyNoMoreInteractions()353    }354    @Test355    fun `fant ikke sak`() {356        val vedtakServiceMock = mock<VedtakService> {357            on {358                kopierGjeldendeVedtaksdata(359                    any(),360                    any(),361                )362            } doReturn KunneIkkeKopiereGjeldendeVedtaksdata.FantIkkeSak.left()363        }364        val mocks = RevurderingServiceMocks(365            vedtakService = vedtakServiceMock,366        )367        val actual = mocks.revurderingService.opprettRevurdering(368            OpprettRevurderingRequest(369                sakId = sakId,370                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,371                Ã¥rsak = "MELDING_FRA_BRUKER",372                begrunnelse = "Ny informasjon",373                saksbehandler = saksbehandler,374                informasjonSomRevurderes = listOf(Revurderingsteg.Inntekt),375            ),376        )377        actual shouldBe KunneIkkeOppretteRevurdering.FantIkkeSak.left()378        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed)379        mocks.verifyNoMoreInteractions()380    }381    @Test382    fun `kan ikke opprette revurdering hvis ingen vedtak eksisterer for angitt fra og med dato`() {383        val vedtakServiceMock = mock<VedtakService> {384            on {385                kopierGjeldendeVedtaksdata(386                    any(),387                    any(),388                )389            } doReturn KunneIkkeKopiereGjeldendeVedtaksdata.FantIngenVedtak.left()390        }391        val mocks = RevurderingServiceMocks(392            vedtakService = vedtakServiceMock,393        )394        val actual = mocks.revurderingService.opprettRevurdering(395            OpprettRevurderingRequest(396                sakId = sakId,397                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,398                Ã¥rsak = "MELDING_FRA_BRUKER",399                begrunnelse = "Ny informasjon",400                saksbehandler = saksbehandler,401                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),402            ),403        )404        actual shouldBe KunneIkkeOppretteRevurdering.FantIngenVedtakSomKanRevurderes.left()405        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed)406        mocks.verifyNoMoreInteractions()407    }408    @Test409    fun `for en ny revurdering vil det tas utgangspunkt i nyeste vedtak hvor fraOgMed er inni perioden`() {410        val vedtaksperiode = Ã¥r(2021)411        val behandlingMock = mock<IverksattRevurdering.Innvilget> {412            on { fnr } doReturn Fnr.generer()413            on { saksnummer } doReturn Saksnummer(2021)414            on { grunnlagsdata } doReturn Grunnlagsdata.create(415                bosituasjon = listOf(416                    Grunnlag.Bosituasjon.Fullstendig.Enslig(417                        id = UUID.randomUUID(),418                        opprettet = fixedTidspunkt,419                        periode = vedtaksperiode,420                        begrunnelse = null,421                    ),422                ),423            )424            on { vilkÃ¥rsvurderinger } doReturn VilkÃ¥rsvurderinger.Revurdering(425                uføre = vilkÃ¥rsvurderingUføre,426                formue = formueVilkÃ¥r(periode = vedtaksperiode),427                utenlandsopphold = utenlandsoppholdInnvilget(periode = vedtaksperiode),428                opplysningsplikt = tilstrekkeligDokumentert(periode = vedtaksperiode),429            )430        }431        val vedtakForFørsteJanuarLagetNÃ¥ = mock<VedtakSomKanRevurderes.EndringIYtelse.InnvilgetRevurdering> {432            on { id } doReturn UUID.randomUUID()433            on { opprettet } doReturn fixedTidspunkt434            on { periode } doReturn vedtaksperiode435            on { behandling } doReturn behandlingMock436            on { beregning } doReturn testBeregning437        }438        val vedtakForFørsteMarsLagetNÃ¥ = mock<VedtakSomKanRevurderes.EndringIYtelse.InnvilgetRevurdering> {439            on { id } doReturn UUID.randomUUID()440            on { opprettet } doReturn fixedTidspunkt.plus(1, ChronoUnit.SECONDS)441            on { periode } doReturn Periode.create(1.mars(2021), 31.desember(2021))442            on { behandling } doReturn behandlingMock443            on { beregning } doReturn testBeregning444        }445        val vedtakForFørsteJanuarLagetForLengeSiden = mock<VedtakSomKanRevurderes.EndringIYtelse.InnvilgetRevurdering> {446            on { id } doReturn UUID.randomUUID()447            on { opprettet } doReturn fixedTidspunkt.instant.minus(2, ChronoUnit.HALF_DAYS).toTidspunkt()448            on { periode } doReturn vedtaksperiode449            on { behandling } doReturn behandlingMock450            on { beregning } doReturn testBeregning451        }452        val fraOgMedDatoFebruar = fixedLocalDate.plus(1, ChronoUnit.MONTHS)453        val fraOgMedDatoApril = fixedLocalDate.plus(3, ChronoUnit.MONTHS)454        val vedtakListe = nonEmptyListOf(455            vedtakForFørsteJanuarLagetNÃ¥,456            vedtakForFørsteMarsLagetNÃ¥,457            vedtakForFørsteJanuarLagetForLengeSiden,458        )459        val gjeldendeVedtaksdataFebruar = GjeldendeVedtaksdata(460            periode = Periode.create(fraOgMedDatoFebruar, vedtakListe.maxOf { it.periode.tilOgMed }),461            vedtakListe = vedtakListe,462            clock = fixedClock,463        )464        val gjeldendeVedtaksdataApril = GjeldendeVedtaksdata(465            periode = Periode.create(fraOgMedDatoApril, vedtakListe.maxOf { it.periode.tilOgMed }),466            vedtakListe = vedtakListe,467            clock = fixedClock,468        )469        val vedtakServiceMock = mock<VedtakService> {470            on { kopierGjeldendeVedtaksdata(sakId, fraOgMedDatoFebruar) } doReturn gjeldendeVedtaksdataFebruar.right()471            on { kopierGjeldendeVedtaksdata(sakId, fraOgMedDatoApril) } doReturn gjeldendeVedtaksdataApril.right()472        }473        val mocks = RevurderingServiceMocks(474            vedtakService = vedtakServiceMock,475            oppgaveService = mock {476                on { opprettOppgave(any()) } doReturn OppgaveId("oppgaveId").right()477            },478            personService = mock {479                on { hentAktørId(any()) } doReturn aktørId.right()480            },481            avkortingsvarselRepo = mock {482                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen483            },484            revurderingRepo = mock {485                on { defaultTransactionContext() } doReturn TestSessionFactory.transactionContext486            },487        )488        val revurderingForFebruar = mocks.revurderingService.opprettRevurdering(489            OpprettRevurderingRequest(490                sakId = sakId,491                fraOgMed = fraOgMedDatoFebruar,492                Ã¥rsak = "MELDING_FRA_BRUKER",493                begrunnelse = "Ny informasjon",494                saksbehandler = saksbehandler,495                informasjonSomRevurderes = listOf(Revurderingsteg.Inntekt, Revurderingsteg.Bosituasjon),496            ),497        )498        revurderingForFebruar.orNull()!!.tilRevurdering shouldBe vedtakForFørsteJanuarLagetNÃ¥499        val revurderingForApril = mocks.revurderingService.opprettRevurdering(500            OpprettRevurderingRequest(501                sakId = sakId,502                fraOgMed = fraOgMedDatoApril,503                Ã¥rsak = "MELDING_FRA_BRUKER",504                begrunnelse = "Ny informasjon",505                saksbehandler = saksbehandler,506                informasjonSomRevurderes,507            ),508        )509        revurderingForApril.orNull()!!.tilRevurdering shouldBe vedtakForFørsteMarsLagetNÃ¥510    }511    @Test512    fun `kan revurdere en periode med eksisterende revurdering`() {513        val (sak, iverksattRevurdering) = iverksattRevurderingInnvilgetFraInnvilgetSøknadsbehandlingsVedtak()514        val søknadsbehandlingVedtak = sak.vedtakListe.first() as VedtakSomKanRevurderes515        val revurderingVedtak = VedtakSomKanRevurderes.from(516            iverksattRevurdering,517            UUID30.randomUUID(),518            fixedClock.plus(1, ChronoUnit.SECONDS),519        )520        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(521            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,522            vedtakListe = nonEmptyListOf(523                søknadsbehandlingVedtak,524                revurderingVedtak,525            ),526            clock = fixedClock,527        )528        val vedtakServiceMock = mock<VedtakService> {529            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()530        }531        val revurderingRepoMock = mock<RevurderingRepo>()532        val oppgaveServiceMock = mock<OppgaveService> {533            on { opprettOppgave(any()) } doReturn OppgaveId("oppgaveId").right()534        }535        val personServiceMock = mock<PersonService> {536            on { hentAktørId(any()) } doReturn aktørId.right()537        }538        val mocks = RevurderingServiceMocks(539            vedtakService = vedtakServiceMock,540            revurderingRepo = revurderingRepoMock,541            oppgaveService = oppgaveServiceMock,542            personService = personServiceMock,543            avkortingsvarselRepo = mock {544                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen545            },546        )547        val actual = mocks.revurderingService.opprettRevurdering(548            OpprettRevurderingRequest(549                sakId = sakId,550                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,551                Ã¥rsak = "MELDING_FRA_BRUKER",552                begrunnelse = "Ny informasjon",553                saksbehandler = saksbehandler,554                informasjonSomRevurderes = informasjonSomRevurderes,555            ),556        )557        actual.orNull()!!.also {558            it.saksnummer shouldBe saksnummer559            it.tilRevurdering.id shouldBe revurderingVedtak.id560        }561        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed)562        verify(personServiceMock).hentAktørId(argThat { it shouldBe fnr })563        verify(revurderingRepoMock).defaultTransactionContext()564        verify(revurderingRepoMock).lagre(argThat { it.right() shouldBe actual }, anyOrNull())565        verify(oppgaveServiceMock).opprettOppgave(566            argThat {567                it shouldBe OppgaveConfig.Revurderingsbehandling(568                    saksnummer = saksnummer,569                    aktørId = aktørId,570                    tilordnetRessurs = null,571                    clock = fixedClock,572                )573            },574        )575        verify(mocks.avkortingsvarselRepo).hentUtestÃ¥ende(any())576        mocks.verifyNoMoreInteractions()577    }578    @Test579    fun `ugyldig periode`() {580        val vedtakServiceMock = mock<VedtakService> {581            on {582                kopierGjeldendeVedtaksdata(583                    any(),584                    any(),585                )586            } doReturn KunneIkkeKopiereGjeldendeVedtaksdata.UgyldigPeriode(Periode.UgyldigPeriode.FraOgMedDatoMÃ¥VæreFørsteDagIMÃ¥neden)587                .left()588        }589        val mocks = RevurderingServiceMocks(590            vedtakService = vedtakServiceMock,591        )592        val actual = mocks.revurderingService.opprettRevurdering(593            OpprettRevurderingRequest(594                sakId = sakId,595                // tester at fraOgMed mÃ¥ starte pÃ¥ 1.596                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.tilOgMed,597                Ã¥rsak = "MELDING_FRA_BRUKER",598                begrunnelse = "Ny informasjon",599                saksbehandler = saksbehandler,600                informasjonSomRevurderes = listOf(Revurderingsteg.Inntekt),601            ),602        )603        actual shouldBe KunneIkkeOppretteRevurdering.UgyldigPeriode(Periode.UgyldigPeriode.FraOgMedDatoMÃ¥VæreFørsteDagIMÃ¥neden)604            .left()605        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(any(), any())606        mocks.verifyNoMoreInteractions()607    }608    @Test609    fun `fant ikke aktør id`() {610        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(611            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,612            vedtakListe = nonEmptyListOf(createSøknadsbehandlingVedtak()),613            clock = fixedClock,614        )615        val vedtakServiceMock = mock<VedtakService> {616            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()617        }618        val personServiceMock = mock<PersonService> {619            on { hentAktørId(any()) } doReturn KunneIkkeHentePerson.FantIkkePerson.left()620        }621        val mocks = RevurderingServiceMocks(622            vedtakService = vedtakServiceMock,623            personService = personServiceMock,624        )625        val actual = mocks.revurderingService.opprettRevurdering(626            OpprettRevurderingRequest(627                sakId = sakId,628                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,629                Ã¥rsak = "MELDING_FRA_BRUKER",630                begrunnelse = "Ny informasjon",631                saksbehandler = saksbehandler,632                informasjonSomRevurderes = listOf(Revurderingsteg.Inntekt),633            ),634        )635        actual shouldBe KunneIkkeOppretteRevurdering.FantIkkeAktørId.left()636        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed)637        verify(personServiceMock).hentAktørId(argThat { it shouldBe fnr })638        mocks.verifyNoMoreInteractions()639    }640    @Test641    fun `kunne ikke opprette oppgave`() {642        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(643            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,644            vedtakListe = nonEmptyListOf(createSøknadsbehandlingVedtak()),645            clock = fixedClock,646        )647        val vedtakServiceMock = mock<VedtakService> {648            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()649        }650        val personServiceMock = mock<PersonService> {651            on { hentAktørId(any()) } doReturn aktørId.right()652        }653        val oppgaveServiceMock = mock<OppgaveService> {654            on { opprettOppgave(any()) } doReturn KunneIkkeOppretteOppgave.left()655        }656        val mocks = RevurderingServiceMocks(657            vedtakService = vedtakServiceMock,658            oppgaveService = oppgaveServiceMock,659            personService = personServiceMock,660            avkortingsvarselRepo = mock {661                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen662            },663        )664        val actual = mocks.revurderingService.opprettRevurdering(665            OpprettRevurderingRequest(666                sakId = sakId,667                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,668                Ã¥rsak = "MELDING_FRA_BRUKER",669                begrunnelse = "Ny informasjon",670                saksbehandler = saksbehandler,671                informasjonSomRevurderes = informasjonSomRevurderes,672            ),673        )674        actual shouldBe KunneIkkeOppretteRevurdering.KunneIkkeOppretteOppgave.left()675        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed)676        verify(personServiceMock).hentAktørId(argThat { it shouldBe fnr })677        verify(mocks.avkortingsvarselRepo).hentUtestÃ¥ende(sakId)678        verify(oppgaveServiceMock).opprettOppgave(679            argThat {680                it shouldBe OppgaveConfig.Revurderingsbehandling(681                    saksnummer = saksnummer,682                    aktørId = aktørId,683                    tilordnetRessurs = null,684                    clock = fixedClock,685                )686            },687        )688        mocks.verifyNoMoreInteractions()689    }690    @Test691    fun `mÃ¥ velge noe som skal revurderes`() {692        val personServiceMock = mock<PersonService> {693            on { hentAktørId(any()) } doReturn aktørId.right()694        }695        val mocks = RevurderingServiceMocks(696            personService = personServiceMock,697        )698        val actual = mocks.revurderingService.opprettRevurdering(699            OpprettRevurderingRequest(700                sakId = sakId,701                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,702                Ã¥rsak = "MELDING_FRA_BRUKER",703                begrunnelse = "Ny informasjon",704                saksbehandler = saksbehandler,705                informasjonSomRevurderes = emptyList(),706            ),707        )708        actual shouldBe KunneIkkeOppretteRevurdering.MÃ¥VelgeInformasjonSomSkalRevurderes.left()709        mocks.verifyNoMoreInteractions()710    }711    @Test712    fun `støtter ikke tilfeller hvor gjeldende vedtaksdata ikke er sammenhengende i tid`() {713        val førsteVedtak = createSøknadsbehandlingVedtak()714        val periodePlussEtÃ
r = Periode.create(715            periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed.plusYears(1),716            periodeNesteMÃ¥nedOgTreMÃ¥nederFram.tilOgMed.plusYears(1),717        )718        val uføregrunnlag = Grunnlag.Uføregrunnlag(719            periode = periodePlussEtÃ
r,720            uføregrad = Uføregrad.parse(25),721            forventetInntekt = 12000,722            opprettet = fixedTidspunkt,723        )724        val uførevilkÃ¥r = VilkÃ¥r.Uførhet.Vurdert.create(725            vurderingsperioder = nonEmptyListOf(726                Vurderingsperiode.Uføre.create(727                    resultat = Resultat.Innvilget,728                    grunnlag = uføregrunnlag,729                    periode = periodePlussEtÃ
r,730                    begrunnelse = "ok",731                    opprettet = fixedTidspunkt,732                ),733            ),734        )735        val bosituasjon = listOf(736            Grunnlag.Bosituasjon.Fullstendig.Enslig(737                id = UUID.randomUUID(),738                opprettet = fixedTidspunkt,739                periode = periodePlussEtÃ
r,740                begrunnelse = null,741            ),742        )743        val andreVedtak = createSøknadsbehandlingVedtak().copy(744            periode = periodePlussEtÃ
r,745            behandling = createInnvilgetBehandling().copy(746                grunnlagsdata = Grunnlagsdata.create(747                    bosituasjon = bosituasjon,748                ),749                vilkÃ¥rsvurderinger = VilkÃ¥rsvurderinger.Søknadsbehandling(750                    uføre = uførevilkÃ¥r,751                    formue = formuevilkÃ¥rIkkeVurdert(),752                ),753                stønadsperiode = Stønadsperiode.create(periodePlussEtÃ
r),754            ),755        )756        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(757            periode = Periode.create(758                førsteVedtak.periode.fraOgMed,759                andreVedtak.periode.tilOgMed,760            ),761            vedtakListe = nonEmptyListOf(762                førsteVedtak,763                andreVedtak,764            ),765            clock = fixedClock,766        )767        val vedtakServiceMock = mock<VedtakService> {768            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()769        }770        val mocks = RevurderingServiceMocks(771            vedtakService = vedtakServiceMock,772        )773        val actual = mocks.revurderingService.opprettRevurdering(774            OpprettRevurderingRequest(775                sakId = sakId,776                fraOgMed = periodeNesteMånedOgTreMånederFram.fraOgMed,777                årsak = "MELDING_FRA_BRUKER",778                begrunnelse = "Ny informasjon",779                saksbehandler = saksbehandler,780                informasjonSomRevurderes = informasjonSomRevurderes,781            ),782        )783        actual shouldBe KunneIkkeOppretteRevurdering.TidslinjeForVedtakErIkkeKontinuerlig.left()784        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periodeNesteMånedOgTreMånederFram.fraOgMed)785        mocks.verifyNoMoreInteractions()786    }787    @Test788    fun `får feilmelding dersom saken har utestående avkorting, men revurderingsperioden inneholder ikke perioden for avkortingen`() {789        val clock = TikkendeKlokke(fixedClock)790        val (sak, opphørUtenlandsopphold) = vedtakRevurdering(791            clock = clock,792            revurderingsperiode = Periode.create(1.juni(2021), 31.desember(2021)),793            vilkårOverrides = listOf(794                utenlandsoppholdAvslag(795                    id = UUID.randomUUID(),796                    opprettet = fixedTidspunkt,797                    periode = Periode.create(1.juni(2021), 31.desember(2021)),798                ),799            ),800        )801        val nyRevurderingsperiode = Periode.create(1.juli(2021), 31.desember(2021))802        val uteståendeAvkorting =803            (opphørUtenlandsopphold as VedtakSomKanRevurderes.EndringIYtelse.OpphørtRevurdering).behandling.avkorting.let {804                (it as AvkortingVedRevurdering.Iverksatt.OpprettNyttAvkortingsvarsel).avkortingsvarsel805            }806        RevurderingServiceMocks(807            vedtakService = mock {808                on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn sak.kopierGjeldendeVedtaksdata(809                    fraOgMed = nyRevurderingsperiode.fraOgMed,810                    clock = clock,811                ).getOrFail().right()812            },813            personService = mock {814                on { hentAktørId(any()) } doReturn aktørId.right()815            },816            avkortingsvarselRepo = mock {817                on { hentUtestående(any()) } doReturn uteståendeAvkorting818            },819        ).let {820            it.revurderingService.opprettRevurdering(821                OpprettRevurderingRequest(822                    sakId = sakId,823                    fraOgMed = nyRevurderingsperiode.fraOgMed,824                    årsak = "MELDING_FRA_BRUKER",825                    begrunnelse = "Ny informasjon",826                    saksbehandler = saksbehandler,827                    informasjonSomRevurderes = listOf(Revurderingsteg.Utenlandsopphold),828                ),829            ) shouldBe KunneIkkeOppretteRevurdering.UteståendeAvkortingMåRevurderesEllerAvkortesINyPeriode(juni(2021))830                .left()831        }832    }833}...OppdaterRevurderingServiceTest.kt
Source:OppdaterRevurderingServiceTest.kt  
1package no.nav.su.se.bakover.service.revurdering2import arrow.core.NonEmptyList3import arrow.core.getOrHandle4import arrow.core.left5import arrow.core.nonEmptyListOf6import arrow.core.right7import io.kotest.assertions.fail8import io.kotest.matchers.collections.shouldHaveSize9import io.kotest.matchers.shouldBe10import io.kotest.matchers.types.beOfType11import no.nav.su.se.bakover.common.desember12import no.nav.su.se.bakover.common.juli13import no.nav.su.se.bakover.common.juni14import no.nav.su.se.bakover.common.oktober15import no.nav.su.se.bakover.common.periode.Periode16import no.nav.su.se.bakover.common.periode.juni17import no.nav.su.se.bakover.domain.NavIdentBruker18import no.nav.su.se.bakover.domain.avkorting.AvkortingVedRevurdering19import no.nav.su.se.bakover.domain.avkorting.Avkortingsvarsel20import no.nav.su.se.bakover.domain.behandling.Attestering21import no.nav.su.se.bakover.domain.behandling.Attesteringshistorikk22import no.nav.su.se.bakover.domain.grunnlag.Grunnlag23import no.nav.su.se.bakover.domain.grunnlag.Grunnlagsdata24import no.nav.su.se.bakover.domain.grunnlag.Uføregrad25import no.nav.su.se.bakover.domain.oppdrag.tilbakekreving.IkkeBehovForTilbakekrevingFerdigbehandlet26import no.nav.su.se.bakover.domain.revurdering.ForhÃ¥ndsvarsel27import no.nav.su.se.bakover.domain.revurdering.InformasjonSomRevurderes28import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering29import no.nav.su.se.bakover.domain.revurdering.OpprettetRevurdering30import no.nav.su.se.bakover.domain.revurdering.RevurderingRepo31import no.nav.su.se.bakover.domain.revurdering.Revurderingsteg32import no.nav.su.se.bakover.domain.revurdering.RevurderingsÃ¥rsak33import no.nav.su.se.bakover.domain.revurdering.Vurderingstatus34import no.nav.su.se.bakover.domain.søknadsbehandling.Stønadsperiode35import no.nav.su.se.bakover.domain.vedtak.GjeldendeVedtaksdata36import no.nav.su.se.bakover.domain.vedtak.VedtakSomKanRevurderes37import no.nav.su.se.bakover.domain.vilkÃ¥r.OpplysningspliktVilkÃ¥r38import no.nav.su.se.bakover.domain.vilkÃ¥r.Resultat39import no.nav.su.se.bakover.domain.vilkÃ¥r.UtenlandsoppholdVilkÃ¥r40import no.nav.su.se.bakover.domain.vilkÃ¥r.VilkÃ¥r41import no.nav.su.se.bakover.domain.vilkÃ¥r.VilkÃ¥rsvurderinger42import no.nav.su.se.bakover.domain.vilkÃ¥r.Vurderingsperiode43import no.nav.su.se.bakover.service.argThat44import no.nav.su.se.bakover.service.formueVilkÃ¥r45import no.nav.su.se.bakover.service.revurdering.RevurderingTestUtils.periodeNesteMÃ¥nedOgTreMÃ¥nederFram46import no.nav.su.se.bakover.service.revurdering.RevurderingTestUtils.stønadsperiodeNesteMÃ¥nedOgTreMÃ¥nederFram47import no.nav.su.se.bakover.service.vedtak.KunneIkkeKopiereGjeldendeVedtaksdata48import no.nav.su.se.bakover.service.vedtak.VedtakService49import no.nav.su.se.bakover.test.TikkendeKlokke50import no.nav.su.se.bakover.test.aktørId51import no.nav.su.se.bakover.test.create52import no.nav.su.se.bakover.test.fixedClock53import no.nav.su.se.bakover.test.fixedLocalDate54import no.nav.su.se.bakover.test.fixedTidspunkt55import no.nav.su.se.bakover.test.formuevilkÃ¥rIkkeVurdert56import no.nav.su.se.bakover.test.getOrFail57import no.nav.su.se.bakover.test.innvilgetUførevilkÃ¥rForventetInntekt1200058import no.nav.su.se.bakover.test.oppgaveIdRevurdering59import no.nav.su.se.bakover.test.opprettetRevurdering60import no.nav.su.se.bakover.test.opprettetRevurderingFraInnvilgetSøknadsbehandlingsVedtak61import no.nav.su.se.bakover.test.revurderingId62import no.nav.su.se.bakover.test.sakId63import no.nav.su.se.bakover.test.saksbehandler64import no.nav.su.se.bakover.test.saksnummer65import no.nav.su.se.bakover.test.stønadsperiode202166import no.nav.su.se.bakover.test.utenlandsoppholdAvslag67import no.nav.su.se.bakover.test.vedtakRevurdering68import no.nav.su.se.bakover.test.vedtakSøknadsbehandlingIverksattInnvilget69import no.nav.su.se.bakover.test.vilkÃ¥rsvurderingRevurderingIkkeVurdert70import org.junit.jupiter.api.Test71import org.mockito.kotlin.any72import org.mockito.kotlin.anyOrNull73import org.mockito.kotlin.doReturn74import org.mockito.kotlin.eq75import org.mockito.kotlin.inOrder76import org.mockito.kotlin.mock77import org.mockito.kotlin.verify78import java.time.temporal.ChronoUnit79import java.util.UUID80internal class OppdaterRevurderingServiceTest {81    private val sakOgIverksattInnvilgetSøknadsbehandlingsvedtak = vedtakSøknadsbehandlingIverksattInnvilget(82        stønadsperiode = stønadsperiodeNesteMÃ¥nedOgTreMÃ¥nederFram,83    )84    // Merk at søknadsbehandlingens uførevilkÃ¥r ikke er likt som OpprettetRevurdering før vi kaller oppdater-funksjonen, men vi forventer at de er like etter oppdateringa.85    private val vilkÃ¥rsvurderingUføre =86        innvilgetUførevilkÃ¥rForventetInntekt12000(periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram)87    // TODO jah: Vi burde ha en domeneklasse/factory som oppretter en revurdering fra et Vedtak, sÃ¥ slipper vi Ã¥ gjøre disse antagelsene i testene88    private val opprettetRevurdering = opprettetRevurderingFraInnvilgetSøknadsbehandlingsVedtak(89        stønadsperiode = stønadsperiodeNesteMÃ¥nedOgTreMÃ¥nederFram,90        revurderingsperiode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,91        sakOgVedtakSomKanRevurderes = sakOgIverksattInnvilgetSøknadsbehandlingsvedtak,92    ).second.copy(93        grunnlagsdata = Grunnlagsdata.create(94            bosituasjon = listOf(95                Grunnlag.Bosituasjon.Fullstendig.Enslig(96                    id = UUID.randomUUID(),97                    opprettet = fixedTidspunkt,98                    periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,99                    begrunnelse = null,100                ),101            ),102        ),103        vilkÃ¥rsvurderinger = VilkÃ¥rsvurderinger.Revurdering(104            uføre = vilkÃ¥rsvurderingUføre,105            formue = formuevilkÃ¥rIkkeVurdert(),106            utenlandsopphold = UtenlandsoppholdVilkÃ¥r.IkkeVurdert,107            opplysningsplikt = OpplysningspliktVilkÃ¥r.IkkeVurdert,108        ),109        informasjonSomRevurderes = InformasjonSomRevurderes.create(mapOf(Revurderingsteg.Uførhet to Vurderingstatus.IkkeVurdert)),110    )111    @Test112    fun `ugyldig begrunnelse`() {113        val mocks = RevurderingServiceMocks()114        val actual = mocks.revurderingService.oppdaterRevurdering(115            OppdaterRevurderingRequest(116                revurderingId = revurderingId,117                fraOgMed = fixedLocalDate,118                Ã¥rsak = "MELDING_FRA_BRUKER",119                begrunnelse = "",120                saksbehandler = saksbehandler,121                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),122            ),123        )124        actual shouldBe KunneIkkeOppdatereRevurdering.UgyldigBegrunnelse.left()125        mocks.verifyNoMoreInteractions()126    }127    @Test128    fun `ugyldig Ã¥rsak`() {129        val mocks = RevurderingServiceMocks()130        val actual = mocks.revurderingService.oppdaterRevurdering(131            OppdaterRevurderingRequest(132                revurderingId = revurderingId,133                fraOgMed = fixedLocalDate,134                Ã¥rsak = "UGYLDIG_Ã
RSAK",135                begrunnelse = "gyldig begrunnelse",136                saksbehandler = saksbehandler,137                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),138            ),139        )140        actual shouldBe KunneIkkeOppdatereRevurdering.UgyldigÃ
rsak.left()141        mocks.verifyNoMoreInteractions()142    }143    @Test144    fun `ugyldig periode`() {145        val vedtakServiceMock = mock<VedtakService> {146            on {147                kopierGjeldendeVedtaksdata(148                    any(),149                    any(),150                )151            } doReturn KunneIkkeKopiereGjeldendeVedtaksdata.UgyldigPeriode(Periode.UgyldigPeriode.FraOgMedDatoMÃ¥VæreFørsteDagIMÃ¥neden)152                .left()153        }154        val revurderingRepoMock = mock<RevurderingRepo> {155            on { hent(any()) } doReturn opprettetRevurdering156        }157        val mocks = RevurderingServiceMocks(158            vedtakService = vedtakServiceMock,159            revurderingRepo = revurderingRepoMock,160        )161        val actual = mocks.revurderingService.oppdaterRevurdering(162            OppdaterRevurderingRequest(163                revurderingId = revurderingId,164                fraOgMed = fixedLocalDate,165                Ã¥rsak = "MELDING_FRA_BRUKER",166                begrunnelse = "gyldig begrunnelse",167                saksbehandler = saksbehandler,168                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),169            ),170        )171        actual shouldBe KunneIkkeOppdatereRevurdering.UgyldigPeriode(Periode.UgyldigPeriode.FraOgMedDatoMÃ¥VæreFørsteDagIMÃ¥neden)172            .left()173        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(any(), any())174        verify(revurderingRepoMock).hent(any())175        mocks.verifyNoMoreInteractions()176    }177    @Test178    fun `Fant ikke revurdering`() {179        val revurderingRepoMock = mock<RevurderingRepo> {180            on { hent(any()) } doReturn null181        }182        val mocks = RevurderingServiceMocks(revurderingRepo = revurderingRepoMock)183        val actual = mocks.revurderingService.oppdaterRevurdering(184            OppdaterRevurderingRequest(185                revurderingId = revurderingId,186                fraOgMed = fixedLocalDate,187                Ã¥rsak = "MELDING_FRA_BRUKER",188                begrunnelse = "gyldig begrunnelse",189                saksbehandler = saksbehandler,190                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),191            ),192        )193        actual shouldBe KunneIkkeOppdatereRevurdering.FantIkkeRevurdering.left()194        verify(revurderingRepoMock).hent(argThat { it shouldBe revurderingId })195        mocks.verifyNoMoreInteractions()196    }197    @Test198    fun `Kan ikke oppdatere sendt forhÃ¥ndsvarslet revurdering`() {199        val revurderingRepoMock = mock<RevurderingRepo> {200            on { hent(any()) } doReturn opprettetRevurdering.copy(201                forhÃ¥ndsvarsel = ForhÃ¥ndsvarsel.UnderBehandling.Sendt,202            )203        }204        val mocks = RevurderingServiceMocks(revurderingRepo = revurderingRepoMock)205        val actual = mocks.revurderingService.oppdaterRevurdering(206            OppdaterRevurderingRequest(207                revurderingId = revurderingId,208                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed.plus(1, ChronoUnit.DAYS),209                Ã¥rsak = "REGULER_GRUNNBELÃP",210                begrunnelse = "gyldig begrunnelse",211                saksbehandler = saksbehandler,212                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),213            ),214        )215        actual shouldBe KunneIkkeOppdatereRevurdering.KanIkkeOppdatereRevurderingSomErForhÃ¥ndsvarslet.left()216        verify(revurderingRepoMock).hent(argThat { it shouldBe revurderingId })217        mocks.verifyNoMoreInteractions()218    }219    @Test220    fun `Kan ikke oppdatere besluttet forhÃ¥ndsvarslet revurdering`() {221        val revurderingRepoMock = mock<RevurderingRepo> {222            on { hent(any()) } doReturn opprettetRevurdering.copy(223                forhÃ¥ndsvarsel = ForhÃ¥ndsvarsel.Ferdigbehandlet.ForhÃ¥ndsvarslet.FortsettMedSammeGrunnlag("begrunnelse"),224            )225        }226        val mocks = RevurderingServiceMocks(revurderingRepo = revurderingRepoMock)227        val actual = mocks.revurderingService.oppdaterRevurdering(228            OppdaterRevurderingRequest(229                revurderingId = revurderingId,230                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed.plus(1, ChronoUnit.DAYS),231                Ã¥rsak = "REGULER_GRUNNBELÃP",232                begrunnelse = "gyldig begrunnelse",233                saksbehandler = saksbehandler,234                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),235            ),236        )237        actual shouldBe KunneIkkeOppdatereRevurdering.KanIkkeOppdatereRevurderingSomErForhÃ¥ndsvarslet.left()238        verify(revurderingRepoMock).hent(argThat { it shouldBe revurderingId })239        mocks.verifyNoMoreInteractions()240    }241    @Test242    fun `Oppdatering av iverksatt revurdering gir ugyldig tilstand`() {243        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(244            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,245            vedtakListe = nonEmptyListOf(sakOgIverksattInnvilgetSøknadsbehandlingsvedtak.second),246            clock = fixedClock,247        )248        val vedtakServiceMock = mock<VedtakService> {249            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()250        }251        val revurderingRepoMock = mock<RevurderingRepo> {252            on { hent(any()) } doReturn opprettetRevurdering.let {253                IverksattRevurdering.Innvilget(254                    id = it.id,255                    periode = it.periode,256                    opprettet = it.opprettet,257                    tilRevurdering = it.tilRevurdering,258                    saksbehandler = it.saksbehandler,259                    oppgaveId = it.oppgaveId,260                    fritekstTilBrev = it.fritekstTilBrev,261                    revurderingsÃ¥rsak = it.revurderingsÃ¥rsak,262                    beregning = mock(),263                    attesteringer = Attesteringshistorikk.empty().leggTilNyAttestering(264                        Attestering.Iverksatt(265                            attestant = NavIdentBruker.Attestant("navIdent"),266                            opprettet = fixedTidspunkt,267                        ),268                    ),269                    simulering = mock(),270                    forhÃ¥ndsvarsel = ForhÃ¥ndsvarsel.Ferdigbehandlet.SkalIkkeForhÃ¥ndsvarsles,271                    grunnlagsdata = Grunnlagsdata.create(272                        bosituasjon = listOf(273                            Grunnlag.Bosituasjon.Fullstendig.Enslig(274                                id = UUID.randomUUID(),275                                opprettet = fixedTidspunkt,276                                periode = it.periode,277                                begrunnelse = null,278                            ),279                        ),280                    ),281                    vilkÃ¥rsvurderinger = vilkÃ¥rsvurderingRevurderingIkkeVurdert(),282                    informasjonSomRevurderes = it.informasjonSomRevurderes,283                    avkorting = AvkortingVedRevurdering.Iverksatt.IngenNyEllerUtestÃ¥ende,284                    tilbakekrevingsbehandling = IkkeBehovForTilbakekrevingFerdigbehandlet,285                )286            }287        }288        val mocks = RevurderingServiceMocks(289            vedtakService = vedtakServiceMock,290            revurderingRepo = revurderingRepoMock,291            avkortingsvarselRepo = mock {292                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen293            },294        )295        val actual = mocks.revurderingService.oppdaterRevurdering(296            OppdaterRevurderingRequest(297                revurderingId = revurderingId,298                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,299                Ã¥rsak = "MELDING_FRA_BRUKER",300                begrunnelse = "gyldig begrunnelse",301                saksbehandler = saksbehandler,302                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),303            ),304        )305        actual shouldBe KunneIkkeOppdatereRevurdering.UgyldigTilstand(306            IverksattRevurdering.Innvilget::class,307            OpprettetRevurdering::class,308        ).left()309        verify(mocks.avkortingsvarselRepo).hentUtestÃ¥ende(any())310        verify(revurderingRepoMock).hent(argThat { it shouldBe revurderingId })311        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(312            opprettetRevurdering.sakId,313            opprettetRevurdering.periode.fraOgMed,314        )315        mocks.verifyNoMoreInteractions()316    }317    @Test318    fun `oppdater en revurdering`() {319        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(320            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,321            vedtakListe = nonEmptyListOf(sakOgIverksattInnvilgetSøknadsbehandlingsvedtak.second),322            clock = fixedClock,323        )324        val vedtakServiceMock = mock<VedtakService> {325            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()326        }327        val revurderingRepoMock = mock<RevurderingRepo> {328            on { hent(any()) } doReturn opprettetRevurdering329        }330        val mocks = RevurderingServiceMocks(331            vedtakService = vedtakServiceMock,332            revurderingRepo = revurderingRepoMock,333            avkortingsvarselRepo = mock {334                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen335            },336        )337        val oppdatertPeriode = Periode.create(338            periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed.plus(1, ChronoUnit.MONTHS),339            periodeNesteMÃ¥nedOgTreMÃ¥nederFram.tilOgMed,340        )341        val actual = mocks.revurderingService.oppdaterRevurdering(342            // Bruker andre verdier enn den opprinnelige revurderingen for Ã¥ se at de faktisk forandrer seg343            OppdaterRevurderingRequest(344                revurderingId = revurderingId,345                fraOgMed = oppdatertPeriode.fraOgMed,346                Ã¥rsak = "ANDRE_KILDER",347                begrunnelse = "bør bli oppdatert",348                saksbehandler = NavIdentBruker.Saksbehandler("En ny saksbehandlinger"),349                informasjonSomRevurderes = listOf(Revurderingsteg.Inntekt),350            ),351        ).getOrHandle {352            fail("$it")353        }354        actual.let { oppdatertRevurdering ->355            oppdatertRevurdering.periode shouldBe periodeNesteMÃ¥nedOgTreMÃ¥nederFram356            oppdatertRevurdering.tilRevurdering shouldBe sakOgIverksattInnvilgetSøknadsbehandlingsvedtak.second357            oppdatertRevurdering.saksbehandler shouldBe saksbehandler358            oppdatertRevurdering.oppgaveId shouldBe oppgaveIdRevurdering359            oppdatertRevurdering.fritekstTilBrev shouldBe ""360            oppdatertRevurdering.revurderingsÃ¥rsak shouldBe RevurderingsÃ¥rsak(361                Ã¥rsak = RevurderingsÃ¥rsak.Ã
rsak.ANDRE_KILDER,362                begrunnelse = RevurderingsÃ¥rsak.Begrunnelse.create("bør bli oppdatert"),363            )364            oppdatertRevurdering.forhÃ¥ndsvarsel shouldBe null365            oppdatertRevurdering.vilkÃ¥rsvurderinger.uføre.grunnlag.let {366                it shouldHaveSize 1367                it[0].ekvivalentMed(sakOgIverksattInnvilgetSøknadsbehandlingsvedtak.second.behandling.vilkÃ¥rsvurderinger.uføre.grunnlag.first())368            }369            oppdatertRevurdering.vilkÃ¥rsvurderinger.uføre.ekvivalentMed(sakOgIverksattInnvilgetSøknadsbehandlingsvedtak.second.behandling.vilkÃ¥rsvurderinger.uføre as VilkÃ¥r.Uførhet.Vurdert)370            oppdatertRevurdering.informasjonSomRevurderes shouldBe InformasjonSomRevurderes.create(mapOf(Revurderingsteg.Inntekt to Vurderingstatus.IkkeVurdert))371        }372        inOrder(373            *mocks.all(),374        ) {375            verify(revurderingRepoMock).hent(argThat { it shouldBe revurderingId })376            verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(377                sakId = argThat { it shouldBe sakId },378                fraOgMed = argThat {379                    it shouldBe oppdatertPeriode.fraOgMed380                },381            )382            verify(mocks.avkortingsvarselRepo).hentUtestÃ¥ende(any())383            verify(revurderingRepoMock).defaultTransactionContext()384            verify(revurderingRepoMock).lagre(argThat { it shouldBe actual }, anyOrNull())385        }386        mocks.verifyNoMoreInteractions()387    }388    @Test389    fun `mÃ¥ velge minst ting som skal revurderes`() {390        val revurderingRepoMock = mock<RevurderingRepo> {391            on { hent(any()) } doReturn opprettetRevurdering392        }393        val mocks = RevurderingServiceMocks(revurderingRepo = revurderingRepoMock)394        mocks.revurderingService.oppdaterRevurdering(395            OppdaterRevurderingRequest(396                revurderingId = revurderingId,397                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,398                Ã¥rsak = "MELDING_FRA_BRUKER",399                begrunnelse = "Ny informasjon",400                saksbehandler = saksbehandler,401                informasjonSomRevurderes = emptyList(),402            ),403        ) shouldBe KunneIkkeOppdatereRevurdering.MÃ¥VelgeInformasjonSomSkalRevurderes.left()404    }405    @Test406    fun `grunnlag resettes dersom man oppdaterer revurderingen`() {407        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(408            periode = periodeNesteMÃ¥nedOgTreMÃ¥nederFram,409            vedtakListe = nonEmptyListOf(sakOgIverksattInnvilgetSøknadsbehandlingsvedtak.second),410            clock = fixedClock,411        )412        val vedtakServiceMock = mock<VedtakService> {413            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()414        }415        val revurderingRepoMock = mock<RevurderingRepo> {416            on { hent(any()) } doReturn opprettetRevurdering.copy(417                // simuler at det er gjort endringer før oppdatering418                grunnlagsdata = Grunnlagsdata.create(),419                vilkÃ¥rsvurderinger = vilkÃ¥rsvurderingRevurderingIkkeVurdert(),420            )421        }422        val mocks = RevurderingServiceMocks(423            vedtakService = vedtakServiceMock,424            revurderingRepo = revurderingRepoMock,425            avkortingsvarselRepo = mock {426                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen427            },428        )429        val actual = mocks.revurderingService.oppdaterRevurdering(430            OppdaterRevurderingRequest(431                revurderingId = revurderingId,432                fraOgMed = periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed,433                Ã¥rsak = "REGULER_GRUNNBELÃP",434                begrunnelse = "g-regulering",435                saksbehandler = saksbehandler,436                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),437            ),438        ).getOrHandle { fail("$it") }439        actual.periode.fraOgMed shouldBe periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed440        actual.revurderingsÃ¥rsak.Ã¥rsak shouldBe RevurderingsÃ¥rsak.Ã
rsak.REGULER_GRUNNBELÃP441        actual.revurderingsÃ¥rsak.begrunnelse.toString() shouldBe "g-regulering"442        inOrder(443            *mocks.all(),444        ) {445            verify(revurderingRepoMock).hent(revurderingId)446            verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(447                opprettetRevurdering.sakId,448                opprettetRevurdering.periode.fraOgMed,449            )450            verify(mocks.avkortingsvarselRepo).hentUtestÃ¥ende(any())451            verify(revurderingRepoMock).defaultTransactionContext()452            verify(revurderingRepoMock).lagre(eq(actual), anyOrNull())453        }454        mocks.verifyNoMoreInteractions()455    }456    @Test457    fun `støtter ikke tilfeller hvor gjeldende vedtaksdata ikke er sammenhengende i tid`() {458        val førsteVedtak = vedtakSøknadsbehandlingIverksattInnvilget().second459        val periodePlussEtÃ
r = Periode.create(460            periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed.plusYears(1),461            periodeNesteMÃ¥nedOgTreMÃ¥nederFram.tilOgMed.plusYears(1),462        )463        val andreVedtakFormueVilkÃ¥r = formueVilkÃ¥r(periodePlussEtÃ
r)464        val andreVedtak = vedtakSøknadsbehandlingIverksattInnvilget().second.copy(465            periode = periodePlussEtÃ
r,466            behandling = vedtakSøknadsbehandlingIverksattInnvilget().second.behandling.copy(467                stønadsperiode = Stønadsperiode.create(periodePlussEtÃ
r),468                grunnlagsdata = Grunnlagsdata.create(469                    bosituasjon = listOf(470                        Grunnlag.Bosituasjon.Fullstendig.Enslig(471                            id = UUID.randomUUID(),472                            opprettet = fixedTidspunkt,473                            periode = periodePlussEtÃ
r,474                            begrunnelse = null,475                        )476                    )477                ),478                vilkÃ¥rsvurderinger = VilkÃ¥rsvurderinger.Søknadsbehandling(479                    VilkÃ¥r.Uførhet.Vurdert.create(480                        vurderingsperioder = nonEmptyListOf(481                            Vurderingsperiode.Uføre.create(482                                resultat = Resultat.Innvilget,483                                grunnlag = Grunnlag.Uføregrunnlag(484                                    periode = periodePlussEtÃ
r,485                                    uføregrad = Uføregrad.parse(25),486                                    forventetInntekt = 12000,487                                    opprettet = fixedTidspunkt,488                                ),489                                periode = periodePlussEtÃ
r,490                                begrunnelse = "ok",491                                opprettet = fixedTidspunkt,492                            ),493                        ),494                    ),495                    andreVedtakFormueVilkÃ¥r,496                ),497            ),498        )499        val gjeldendeVedtaksdata = GjeldendeVedtaksdata(500            periode = Periode.create(501                fraOgMed = førsteVedtak.periode.fraOgMed,502                tilOgMed = andreVedtak.periode.tilOgMed,503            ),504            vedtakListe = nonEmptyListOf(505                førsteVedtak,506                andreVedtak,507            ),508            clock = fixedClock,509        )510        val vedtakServiceMock = mock<VedtakService> {511            on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn gjeldendeVedtaksdata.right()512        }513        val revurderingRepoMock = mock<RevurderingRepo> {514            on { hent(any()) } doReturn opprettetRevurdering515        }516        val mocks = RevurderingServiceMocks(517            vedtakService = vedtakServiceMock,518            revurderingRepo = revurderingRepoMock,519        )520        val actual = mocks.revurderingService.oppdaterRevurdering(521            OppdaterRevurderingRequest(522                revurderingId = opprettetRevurdering.id,523                fraOgMed = opprettetRevurdering.periode.fraOgMed,524                Ã¥rsak = "MELDING_FRA_BRUKER",525                begrunnelse = "Test",526                saksbehandler = opprettetRevurdering.saksbehandler,527                informasjonSomRevurderes = listOf(Revurderingsteg.Uførhet),528            ),529        )530        actual shouldBe KunneIkkeOppdatereRevurdering.TidslinjeForVedtakErIkkeKontinuerlig.left()531        verify(revurderingRepoMock).hent(opprettetRevurdering.id)532        verify(vedtakServiceMock).kopierGjeldendeVedtaksdata(sakId, periodeNesteMÃ¥nedOgTreMÃ¥nederFram.fraOgMed)533        mocks.verifyNoMoreInteractions()534    }535    @Test536    fun `fÃ¥r lov til Ã¥ oppdatere revurdering dersom periode overlapper opphørsvedtak for utenlandsopphold som ikke førte til avkorting`() {537        val tikkendeKlokke = TikkendeKlokke()538        val sakOgSøknadsvedtak = vedtakSøknadsbehandlingIverksattInnvilget(539            saksnummer = saksnummer,540            stønadsperiode = stønadsperiode2021,541            clock = tikkendeKlokke,542        )543        val revurderingsperiode = Periode.create(1.oktober(2021), 31.desember(2021))544        val sakOgSøknadsvedtakOgRevurderingsvedtak = vedtakRevurdering(545            clock = tikkendeKlokke,546            revurderingsperiode = revurderingsperiode,547            sakOgVedtakSomKanRevurderes = sakOgSøknadsvedtak,548            vilkÃ¥rOverrides = listOf(549                utenlandsoppholdAvslag(550                    periode = revurderingsperiode,551                ),552            ),553        )554        val (sak3, opprettetRevurdering) = opprettetRevurdering(555            sakOgVedtakSomKanRevurderes = sakOgSøknadsvedtakOgRevurderingsvedtak,556        )557        val serviceAndMocks = RevurderingServiceMocks(558            revurderingRepo = mock {559                on { hent(any()) } doReturn opprettetRevurdering560            },561            vedtakService = mock {562                on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn GjeldendeVedtaksdata(563                    periode = revurderingsperiode,564                    vedtakListe = NonEmptyList.fromListUnsafe(sak3.vedtakListe.filterIsInstance<VedtakSomKanRevurderes>()),565                    clock = fixedClock,566                ).right()567            },568            avkortingsvarselRepo = mock {569                on { hentUtestÃ¥ende(any()) } doReturn Avkortingsvarsel.Ingen570            },571        )572        serviceAndMocks.revurderingService.oppdaterRevurdering(573            oppdaterRevurderingRequest = OppdaterRevurderingRequest(574                revurderingId = opprettetRevurdering.id,575                fraOgMed = 1.oktober(2021),576                Ã¥rsak = RevurderingsÃ¥rsak.Ã
rsak.ANDRE_KILDER.toString(),577                begrunnelse = "lol",578                saksbehandler = saksbehandler,579                informasjonSomRevurderes = listOf(Revurderingsteg.Utenlandsopphold),580            ),581        ).getOrFail() shouldBe beOfType<OpprettetRevurdering>()582    }583    @Test584    fun `får feilmelding dersom saken har utestående avkorting, men revurderingsperioden inneholder ikke perioden for avkortingen`() {585        val clock = TikkendeKlokke(fixedClock)586        val (sak, opphørUtenlandsopphold) = vedtakRevurdering(587            clock = clock,588            revurderingsperiode = Periode.create(1.juni(2021), 31.desember(2021)),589            vilkårOverrides = listOf(590                utenlandsoppholdAvslag(591                    id = UUID.randomUUID(),592                    opprettet = fixedTidspunkt,593                    periode = Periode.create(1.juni(2021), 31.desember(2021)),594                ),595            ),596        )597        val nyRevurderingsperiode = Periode.create(1.juli(2021), 31.desember(2021))598        val uteståendeAvkorting =599            (opphørUtenlandsopphold as VedtakSomKanRevurderes.EndringIYtelse.OpphørtRevurdering).behandling.avkorting.let {600                (it as AvkortingVedRevurdering.Iverksatt.OpprettNyttAvkortingsvarsel).avkortingsvarsel601            }602        val opprettetRevurdering = opprettetRevurdering().second603        RevurderingServiceMocks(604            revurderingRepo = mock {605                on { hent(any()) } doReturn opprettetRevurdering606            },607            vedtakService = mock {608                on { kopierGjeldendeVedtaksdata(any(), any()) } doReturn sak.kopierGjeldendeVedtaksdata(609                    fraOgMed = nyRevurderingsperiode.fraOgMed,610                    clock = clock,611                ).getOrFail().right()612            },613            personService = mock {614                on { hentAktørId(any()) } doReturn aktørId.right()615            },616            avkortingsvarselRepo = mock {617                on { hentUtestående(any()) } doReturn uteståendeAvkorting618            },619        ).let {620            it.revurderingService.oppdaterRevurdering(621                OppdaterRevurderingRequest(622                    revurderingId = sakId,623                    fraOgMed = nyRevurderingsperiode.fraOgMed,624                    årsak = "MELDING_FRA_BRUKER",625                    begrunnelse = "Ny informasjon",626                    saksbehandler = saksbehandler,627                    informasjonSomRevurderes = listOf(Revurderingsteg.Utenlandsopphold),628                ),629            ) shouldBe KunneIkkeOppdatereRevurdering.UteståendeAvkortingMåRevurderesEllerAvkortesINyPeriode(juni(2021))630                .left()631        }632    }633}...RevurderingLeggTilFormueServiceTest.kt
Source:RevurderingLeggTilFormueServiceTest.kt  
1package no.nav.su.se.bakover.service.revurdering2import arrow.core.Nel3import arrow.core.getOrHandle4import arrow.core.left5import arrow.core.nonEmptyListOf6import io.kotest.assertions.arrow.core.shouldHaveSize7import io.kotest.matchers.collections.shouldContain8import io.kotest.matchers.collections.shouldHaveSize9import io.kotest.matchers.shouldBe10import no.nav.su.se.bakover.common.desember11import no.nav.su.se.bakover.common.januar12import no.nav.su.se.bakover.common.juni13import no.nav.su.se.bakover.common.mai14import no.nav.su.se.bakover.common.mars15import no.nav.su.se.bakover.common.periode.Periode16import no.nav.su.se.bakover.common.periode.år17import no.nav.su.se.bakover.domain.beregning.fradrag.FradragTilhører18import no.nav.su.se.bakover.domain.beregning.fradrag.Fradragstype19import no.nav.su.se.bakover.domain.grunnlag.Formuegrunnlag20import no.nav.su.se.bakover.domain.grunnlag.Grunnlag21import no.nav.su.se.bakover.domain.grunnlag.Konsistensproblem22import no.nav.su.se.bakover.domain.revurdering.InformasjonSomRevurderes23import no.nav.su.se.bakover.domain.revurdering.OpprettetRevurdering24import no.nav.su.se.bakover.domain.revurdering.RevurderingTilAttestering25import no.nav.su.se.bakover.domain.revurdering.Revurderingsteg26import no.nav.su.se.bakover.domain.revurdering.RevurderingsutfallSomIkkeStøttes27import no.nav.su.se.bakover.domain.revurdering.Vurderingstatus28import no.nav.su.se.bakover.domain.vilkår.Resultat29import no.nav.su.se.bakover.domain.vilkår.UtenlandsoppholdVilkår30import no.nav.su.se.bakover.domain.vilkår.Vilkår31import no.nav.su.se.bakover.service.argThat32import no.nav.su.se.bakover.test.avslåttUførevilkårUtenGrunnlag33import no.nav.su.se.bakover.test.empty34import no.nav.su.se.bakover.test.epsFnr35import no.nav.su.se.bakover.test.fixedTidspunkt36import no.nav.su.se.bakover.test.formuevilkårIkkeVurdert37import no.nav.su.se.bakover.test.getOrFail38import no.nav.su.se.bakover.test.lagFradragsgrunnlag39import no.nav.su.se.bakover.test.opprettetRevurdering40import no.nav.su.se.bakover.test.revurderingId41import no.nav.su.se.bakover.test.revurderingTilAttestering42import no.nav.su.se.bakover.test.shouldBeType43import no.nav.su.se.bakover.test.stønadsperiode202144import org.junit.jupiter.api.Test45import org.mockito.kotlin.any46import org.mockito.kotlin.anyOrNull47import org.mockito.kotlin.doReturn48import org.mockito.kotlin.inOrder49import org.mockito.kotlin.mock50import org.mockito.kotlin.verify51import java.util.*52internal class RevurderingLeggTilFormueServiceTest {53    @Test54    fun `legg til revurdering av formue happy case`() {55        val nyFormue = LeggTilFormuegrunnlagRequest.Grunnlag(56            periode = år(2021),57            epsFormue = Formuegrunnlag.Verdier.empty(),58            søkersFormue = Formuegrunnlag.Verdier.empty(),59            begrunnelse = null,60        )61        RevurderingServiceMocks(62            revurderingRepo = mock {63                on { hent(any()) } doReturn opprettetRevurdering(64                    informasjonSomRevurderes = InformasjonSomRevurderes.create(listOf(Revurderingsteg.Formue)),65                    grunnlagsdataOverrides = listOf(66                        lagFradragsgrunnlag(67                            type = Fradragstype.Arbeidsinntekt,68                            månedsbeløp = 10000.0,69                            periode = år(2021),70                            utenlandskInntekt = null,71                            tilhører = FradragTilhører.BRUKER,72                        ),73                        Grunnlag.Bosituasjon.Fullstendig.EktefellePartnerSamboer.Under67.UførFlyktning(74                            id = UUID.randomUUID(),75                            fnr = epsFnr,76                            opprettet = fixedTidspunkt,77                            periode = år(2021),78                            begrunnelse = null,79                        ),80                    ),81                ).second82            },83        ).let { serviceAndMocks ->84            val actual = serviceAndMocks.revurderingService.leggTilFormuegrunnlag(85                request = LeggTilFormuegrunnlagRequest(86                    revurderingId = revurderingId,87                    formuegrunnlag = Nel.fromListUnsafe(listOf(nyFormue)),88                ),89            ).getOrFail()90            actual.shouldBeType<RevurderingOgFeilmeldingerResponse>().let { response ->91                response.revurdering.informasjonSomRevurderes shouldBe InformasjonSomRevurderes.create(92                    mapOf(Revurderingsteg.Formue to Vurderingstatus.Vurdert),93                )94                response.revurdering.vilkårsvurderinger.formue.shouldBeType<Vilkår.Formue.Vurdert>().let {95                    it.vurderingsperioder shouldHaveSize 196                    it.vurderingsperioder.single().periode shouldBe nyFormue.periode97                    it.resultat shouldBe Resultat.Innvilget98                    it.grunnlag shouldHaveSize 199                    it.grunnlag.single().periode shouldBe nyFormue.periode100                    it.grunnlag.single().epsFormue shouldBe nyFormue.epsFormue101                    it.grunnlag.single().søkersFormue shouldBe nyFormue.søkersFormue102                    it.grunnlag.single().begrunnelse shouldBe nyFormue.begrunnelse103                }104            }105            verify(serviceAndMocks.revurderingRepo).hent(revurderingId)106            verify(serviceAndMocks.revurderingRepo).defaultTransactionContext()107            verify(serviceAndMocks.revurderingRepo).lagre(108                argThat { it shouldBe actual.revurdering },109                anyOrNull(),110            )111        }112    }113    @Test114    fun `skal ikke være lov å legge inn formue for eps, hvis man ikke har noen eps`() {115        RevurderingServiceMocks(116            revurderingRepo = mock {117                on { hent(any()) } doReturn opprettetRevurdering(118                    grunnlagsdataOverrides = listOf(119                        Grunnlag.Bosituasjon.Fullstendig.Enslig(120                            id = UUID.randomUUID(),121                            opprettet = fixedTidspunkt,122                            periode = år(2021),123                            begrunnelse = null,124                        ),125                    ),126                ).second127            },128        ).let {129            it.revurderingService.leggTilFormuegrunnlag(130                request = LeggTilFormuegrunnlagRequest(131                    revurderingId = revurderingId,132                    formuegrunnlag = Nel.fromListUnsafe(133                        listOf(134                            LeggTilFormuegrunnlagRequest.Grunnlag(135                                periode = år(2021),136                                epsFormue = Formuegrunnlag.Verdier.empty(),137                                søkersFormue = Formuegrunnlag.Verdier.empty(),138                                begrunnelse = null,139                            ),140                        ),141                    ),142                ),143            ).getOrHandle {144                it shouldBe KunneIkkeLeggeTilFormuegrunnlag.Konsistenssjekk(145                    Konsistensproblem.BosituasjonOgFormue.KombinasjonAvBosituasjonOgFormueErUyldig146                )147            }148            inOrder(149                *it.all(),150            ) {151                verify(it.revurderingRepo).hent(revurderingId)152                it.verifyNoMoreInteractions()153            }154        }155    }156    @Test157    fun `ikke lov å legge inn formue periode utenfor perioden til revurderingen`() {158        RevurderingServiceMocks(159            revurderingRepo = mock {160                on { hent(any()) } doReturn opprettetRevurdering(161                    revurderingsperiode = år(2021),162                ).second163            },164        ).let {165            it.revurderingService.leggTilFormuegrunnlag(166                request = LeggTilFormuegrunnlagRequest(167                    revurderingId = revurderingId,168                    formuegrunnlag = Nel.fromListUnsafe(169                        listOf(170                            LeggTilFormuegrunnlagRequest.Grunnlag(171                                periode = år(2020),172                                epsFormue = null,173                                søkersFormue = Formuegrunnlag.Verdier.empty(),174                                begrunnelse = null,175                            ),176                        ),177                    ),178                ),179            ).getOrHandle {180                it shouldBe KunneIkkeLeggeTilFormuegrunnlag.FormuePeriodeErUtenforBehandlingsperioden181            }182            inOrder(183                *it.all(),184            ) {185                verify(it.revurderingRepo).hent(revurderingId)186                it.verifyNoMoreInteractions()187            }188        }189    }190    @Test191    fun `ikke lov å legge inn epsformue periode utenfor perioden til revurderingen`() {192        RevurderingServiceMocks(193            revurderingRepo = mock {194                on { hent(any()) } doReturn opprettetRevurdering(195                    revurderingsperiode = år(2021),196                ).second197            },198        ).let {199            it.revurderingService.leggTilFormuegrunnlag(200                request = LeggTilFormuegrunnlagRequest(201                    revurderingId = revurderingId,202                    formuegrunnlag = Nel.fromListUnsafe(203                        listOf(204                            LeggTilFormuegrunnlagRequest.Grunnlag(205                                periode = Periode.create(1.januar(2021), 31.mars(2021)),206                                epsFormue = null,207                                søkersFormue = Formuegrunnlag.Verdier.empty(),208                                begrunnelse = null,209                            ),210                        ),211                    ),212                ),213            ).getOrHandle {214                it shouldBe KunneIkkeLeggeTilFormuegrunnlag.Konsistenssjekk(215                    Konsistensproblem.BosituasjonOgFormue.IngenFormueForBosituasjonsperiode216                )217            }218            inOrder(219                *it.all(),220            ) {221                verify(it.revurderingRepo).hent(revurderingId)222                it.verifyNoMoreInteractions()223            }224        }225    }226    @Test227    fun `ikke lov å legge inn formue med overlappende perioder`() {228        RevurderingServiceMocks(229            revurderingRepo = mock {230                on { hent(any()) } doReturn opprettetRevurdering(231                    grunnlagsdataOverrides = listOf(232                        Grunnlag.Bosituasjon.Fullstendig.EktefellePartnerSamboer.Under67.UførFlyktning(233                            id = UUID.randomUUID(),234                            fnr = epsFnr,235                            opprettet = fixedTidspunkt,236                            periode = år(2021),237                            begrunnelse = null,238                        ),239                    ),240                ).second241            },242        ).let {243            it.revurderingService.leggTilFormuegrunnlag(244                request = LeggTilFormuegrunnlagRequest(245                    revurderingId = revurderingId,246                    formuegrunnlag = Nel.fromListUnsafe(247                        listOf(248                            LeggTilFormuegrunnlagRequest.Grunnlag(249                                periode = periodeJanMars2021,250                                epsFormue = Formuegrunnlag.Verdier.empty(),251                                søkersFormue = Formuegrunnlag.Verdier.empty(),252                                begrunnelse = null,253                            ),254                            LeggTilFormuegrunnlagRequest.Grunnlag(255                                periode = periodeMarsDesember2021,256                                epsFormue = Formuegrunnlag.Verdier.empty(),257                                søkersFormue = Formuegrunnlag.Verdier.empty(),258                                begrunnelse = null,259                            ),260                        ),261                    ),262                ),263            ).getOrHandle {264                it shouldBe KunneIkkeLeggeTilFormuegrunnlag.IkkeLovMedOverlappendePerioder265            }266            inOrder(267                *it.all(),268            ) {269                verify(it.revurderingRepo).hent(revurderingId)270                it.verifyNoMoreInteractions()271            }272        }273    }274    @Test275    fun `feilmelding hvis vi ikke finner revurdering`() {276        RevurderingServiceMocks(277            revurderingRepo = mock {278                on { hent(any()) } doReturn null279            },280        ).let {281            it.revurderingService.leggTilFormuegrunnlag(282                LeggTilFormuegrunnlagRequest(283                    revurderingId = revurderingId,284                    formuegrunnlag = Nel.fromListUnsafe(285                        listOf(286                            LeggTilFormuegrunnlagRequest.Grunnlag(287                                periode = år(2021),288                                epsFormue = Formuegrunnlag.Verdier.empty(),289                                søkersFormue = Formuegrunnlag.Verdier.empty(),290                                begrunnelse = null,291                            ),292                        ),293                    ),294                ),295            ).getOrHandle {296                it shouldBe KunneIkkeLeggeTilFormuegrunnlag.FantIkkeRevurdering297            }298        }299    }300    @Test301    fun `når formue blir avslått, og uførhet er det også, får vi feil om at utfallet ikke støttes pga opphør av flere vilkår`() {302        RevurderingServiceMocks(303            revurderingRepo = mock {304                on { hent(revurderingId) } doReturn opprettetRevurdering(305                    grunnlagsdataOverrides = listOf(306                        Grunnlag.Bosituasjon.Fullstendig.Enslig(307                            id = UUID.randomUUID(), opprettet = fixedTidspunkt,308                            periode = stønadsperiode2021.periode,309                            begrunnelse = ":)",310                        ),311                    ),312                    vilkårOverrides = listOf(313                        avslåttUførevilkårUtenGrunnlag(314                            periode = år(2021),315                        ),316                        formuevilkårIkkeVurdert(),317                        UtenlandsoppholdVilkår.IkkeVurdert,318                    ),319                ).second320            },321        ).let {322            val response = it.revurderingService.leggTilFormuegrunnlag(323                request = LeggTilFormuegrunnlagRequest(324                    revurderingId = revurderingId,325                    formuegrunnlag = nonEmptyListOf(326                        LeggTilFormuegrunnlagRequest.Grunnlag(327                            periode = år(2021),328                            epsFormue = null,329                            søkersFormue = Formuegrunnlag.Verdier.create(330                                verdiIkkePrimærbolig = 10000000,331                                verdiEiendommer = 0,332                                verdiKjøretøy = 0,333                                innskudd = 0,334                                verdipapir = 0,335                                pengerSkyldt = 0,336                                kontanter = 0,337                                depositumskonto = 0,338                            ),339                            begrunnelse = ":(",340                        ),341                    ),342                ),343            ).getOrFail()344            response.feilmeldinger.shouldContain(RevurderingsutfallSomIkkeStøttes.OpphørAvFlereVilkår)345            verify(it.revurderingRepo).hent(revurderingId)346            verify(it.revurderingRepo).defaultTransactionContext()347            verify(it.revurderingRepo).lagre(348                argThat { it shouldBe response.revurdering },349                anyOrNull(),350            )351            it.verifyNoMoreInteractions()352        }353    }354    @Test355    fun `får feilmelding om at opphør ikke er fra første måned i revurderingsperioden`() {356        RevurderingServiceMocks(357            revurderingRepo = mock {358                on { hent(revurderingId) } doReturn opprettetRevurdering().second359            },360        ).let {361            val response = it.revurderingService.leggTilFormuegrunnlag(362                request = LeggTilFormuegrunnlagRequest(363                    revurderingId = revurderingId,364                    formuegrunnlag = nonEmptyListOf(365                        LeggTilFormuegrunnlagRequest.Grunnlag(366                            periode = Periode.create(1.januar(2021), 31.mai(2021)),367                            epsFormue = null,368                            søkersFormue = Formuegrunnlag.Verdier.empty(),369                            begrunnelse = ":)",370                        ),371                        LeggTilFormuegrunnlagRequest.Grunnlag(372                            periode = Periode.create(1.juni(2021), 31.desember(2021)),373                            epsFormue = null,374                            søkersFormue = Formuegrunnlag.Verdier.create(375                                verdiIkkePrimærbolig = 10000000,376                                verdiEiendommer = 0,377                                verdiKjøretøy = 0,378                                innskudd = 0,379                                verdipapir = 0,380                                pengerSkyldt = 0,381                                kontanter = 0,382                                depositumskonto = 0,383                            ),384                            begrunnelse = ":(",385                        ),386                    ),387                ),388            ).getOrFail()389            response.feilmeldinger.shouldContain(RevurderingsutfallSomIkkeStøttes.OpphørErIkkeFraFørsteMåned)390        }391    }392    @Test393    fun `kan ikke legge inn formue når revurdering er til attestering`() {394        RevurderingServiceMocks(395            revurderingRepo = mock {396                on { hent(any()) } doReturn revurderingTilAttestering().second397            },398        ).let {399            val response = it.revurderingService.leggTilFormuegrunnlag(400                request = LeggTilFormuegrunnlagRequest(401                    revurderingId = revurderingId,402                    formuegrunnlag = Nel.fromListUnsafe(403                        listOf(404                            LeggTilFormuegrunnlagRequest.Grunnlag(405                                periode = år(2021),406                                epsFormue = null,407                                søkersFormue = Formuegrunnlag.Verdier.empty(),408                                begrunnelse = null,409                            ),410                        ),411                    ),412                ),413            )414            response shouldBe KunneIkkeLeggeTilFormuegrunnlag.UgyldigTilstand(415                fra = RevurderingTilAttestering.Innvilget::class,416                til = OpprettetRevurdering::class,417            ).left()418        }419    }420    private val periodeJanMars2021 = Periode.create(fraOgMed = 1.januar(2021), tilOgMed = 31.mars(2021))421    private val periodeMarsDesember2021 = Periode.create(fraOgMed = 1.mars(2021), tilOgMed = 31.desember(2021))422}...ServerTrackStateSpec.kt
Source:ServerTrackStateSpec.kt  
1/*2 * Copyright 2019-2021 The Developers.3 *4 * Licensed under the Apache License, Version 2.0 (the "License")5 * you may not use this file except in compliance with the License.6 * You may obtain a copy of the License at7 *8 *     http://www.apache.org/licenses/LICENSE-2.09 *10 * Unless required by applicable law or agreed to in writing, software11 * distributed under the License is distributed on an "AS IS" BASIS,12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13 * See the License for the specific language governing permissions and14 * limitations under the License.15 */16package com.github.oheger.locationteller.server17import io.kotest.core.spec.style.StringSpec18import io.kotest.matchers.collections.shouldContainExactly19import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder20import io.kotest.matchers.collections.shouldHaveSize21import io.kotest.matchers.shouldBe22import io.kotest.matchers.types.shouldBeSameInstanceAs23import java.util.Calendar24/**25 * Test class for [ServerTrackState].26 */27class ServerTrackStateSpec : StringSpec() {28    /**29     * Creates a _TimeData_ object representing a specific point in time.30     * @param day the day (year and month are fix)31     * @param hour the hour32     * @param min the minute33     * @param sec the seconds34     */35    private fun time(day: Int, hour: Int, min: Int, sec: Int): TimeData {36        val cal = Calendar.getInstance()37        cal.clear()38        cal.set(2019, Calendar.JUNE, day, hour, min, sec)39        return TimeData(cal.timeInMillis)40    }41    /**42     * Returns a _FileData_ object based on the naming conventions to represent43     * the given time.44     * @param time the time of the file45     * @return the corresponding _FileData_46     */47    private fun fileDataForTime(time: TimeData): FileData =48        FileData(time.dateString, time.timeString)49    init {50        "ServerTrackState should handle an empty state when finding outdated files" {51            val state = ServerTrackState(emptyList())52            val result = state.removeOutdatedFiles(time(20, 18, 13, 20))53            result.first shouldHaveSize 054            result.second shouldBeSameInstanceAs state55        }56        "ServerTrackState should find outdated files" {57            val times = listOf(58                time(18, 8, 20, 17),59                time(18, 10, 30, 27),60                time(19, 8, 11, 12),61                time(19, 10, 20, 30),62                time(19, 13, 13, 13),63                time(19, 17, 28, 55),64                time(20, 1, 42, 19)65            )66            val files = times.map(::fileDataForTime)67            val refTime = time(19, 12, 0, 0)68            val outdated = files.subList(0, 4)69            val remaining = files.subList(4, files.size)70            val state = ServerTrackState(files)71            val result = state.removeOutdatedFiles(refTime)72            result.first shouldContainExactlyInAnyOrder outdated73            result.second.files shouldContainExactlyInAnyOrder remaining74        }75        "ServerTrackState should handle the case that all files are outdated" {76            val times = listOf(77                time(20, 6, 59, 50),78                time(20, 7, 11, 0),79                time(20, 11, 59, 59)80            )81            val files = times.map(::fileDataForTime)82            val refTime = time(20, 12, 0, 0)83            val state = ServerTrackState(files)84            val result = state.removeOutdatedFiles(refTime)85            result.first shouldContainExactlyInAnyOrder files86            result.second.files shouldHaveSize 087        }88        "ServerTrackState should handle the case that all files are up-to-date" {89            val times = listOf(90                time(20, 0, 0, 0),91                time(20, 12, 0, 0),92                time(21, 1, 1, 1)93            )94            val files = times.map(::fileDataForTime)95            val refTime = time(19, 23, 59, 59)96            val state = ServerTrackState(files)97            val result = state.removeOutdatedFiles(refTime)98            result.first shouldHaveSize 099            result.second shouldBeSameInstanceAs state100        }101        "ServerTrackState should report the presence of a folder if empty" {102            val state = ServerTrackState(emptyList())103            state.hasFolder("2019-06-22") shouldBe false104        }105        "ServerTrackState should report the presence of a folder if it is found" {106            val times = listOf(107                time(21, 10, 11, 12),108                time(21, 15, 16, 7),109                time(22, 8, 9, 10)110            )111            val state = ServerTrackState(times.map(::fileDataForTime))112            state.hasFolder("2019-06-22") shouldBe true113        }114        "ServerTrackState should report the presence of a folder if it is too small" {115            val times = listOf(116                time(21, 10, 11, 12),117                time(21, 15, 16, 7),118                time(22, 8, 9, 10)119            )120            val state = ServerTrackState(times.map(::fileDataForTime))121            state.hasFolder("2019-06-20") shouldBe false122        }123        "ServerTrackState should report the presence of a folder if it is too big" {124            val times = listOf(125                time(21, 10, 11, 12),126                time(21, 15, 16, 7),127                time(22, 8, 9, 10)128            )129            val state = ServerTrackState(times.map(::fileDataForTime))130            state.hasFolder("2019-06-23") shouldBe false131        }132        "ServerTrackState should support adding a FileData" {133            val file1 = fileDataForTime(time(22, 20, 58, 10))134            val file2 = fileDataForTime(time(22, 21, 0, 30))135            val fileNew = fileDataForTime(time(22, 20, 59, 20))136            val state = ServerTrackState(listOf(file1, file2))137            val nextState = state.appendFile(fileNew)138            nextState.files shouldContainExactly listOf(file1, file2, fileNew)139        }140        "ServerTrackState should support adding a FileData out of order" {141            val file1 = fileDataForTime(time(22, 20, 58, 10))142            val file2 = fileDataForTime(time(22, 21, 0, 30))143            val fileNew = fileDataForTime(time(22, 20, 59, 20))144            val state = ServerTrackState(listOf(file1, file2))145            val nextState = state.appendFile(fileNew, inOrder = false)146            nextState.files shouldContainExactly listOf(file1, fileNew, file2)147        }148        "ServerTrackState should support removing files" {149            val file1 = fileDataForTime(time(22, 20, 58, 10))150            val file2 = fileDataForTime(time(22, 20, 59, 20))151            val file3 = fileDataForTime(time(22, 21, 0, 30))152            val file4 = fileDataForTime(time(22, 21, 9, 24))153            val state = ServerTrackState(listOf(file1, file2, file3, file4))154            val removeFiles = setOf(file1, file4, fileDataForTime(time(1, 1, 2, 3)))155            val nextState = state.removeFiles(removeFiles)156            nextState.files shouldContainExactlyInAnyOrder listOf(file2, file3)157        }158    }159}...ApiTest.kt
Source:ApiTest.kt  
1package org.jetbrains.kotlinx.spark.api/*-2 * =LICENSE=3 * Kotlin Spark API4 * ----------5 * Copyright (C) 2019 - 2020 JetBrains6 * ----------7 * Licensed under the Apache License, Version 2.0 (the "License");8 * you may not use this file except in compliance with the License.9 * You may obtain a copy of the License at10 * 11 *      http://www.apache.org/licenses/LICENSE-2.012 * 13 * Unless required by applicable law or agreed to in writing, software14 * distributed under the License is distributed on an "AS IS" BASIS,15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.16 * See the License for the specific language governing permissions and17 * limitations under the License.18 * =LICENSEEND=19 */20import ch.tutteli.atrium.api.fluent.en_GB.*21import ch.tutteli.atrium.api.verbs.expect22import io.kotest.core.spec.style.ShouldSpec23import io.kotest.matchers.shouldBe24import scala.collection.Seq25import java.io.Serializable26import kotlin.collections.Iterator27import scala.collection.Iterator as ScalaIterator28import scala.collection.Map as ScalaMap29import scala.collection.mutable.Map as ScalaMutableMap30class ApiTest : ShouldSpec({31    context("miscellaneous integration tests") {32        withSpark(props = mapOf("spark.sql.codegen.comments" to true)) {33            @OptIn(ExperimentalStdlibApi::class)34            should("broadcast variables") {35                val largeList = (1..15).map { SomeClass(a = (it..15).toList().toIntArray(), b = it) }36                val broadcast = spark.broadcast(largeList)37                val broadcast2 = spark.broadcast(arrayOf(doubleArrayOf(1.0, 2.0, 3.0, 4.0)))38                val result: List<Double> = listOf(1, 2, 3, 4, 5)39                    .toDS()40                    .mapPartitions { iterator ->41                        val receivedBroadcast = broadcast.value42                        val receivedBroadcast2 = broadcast2.value43                        buildList {44                            iterator.forEach {45                                this.add(it + receivedBroadcast[it].b * receivedBroadcast2[0][0])46                            }47                        }.iterator()48                    }49                    .collectAsList()50                expect(result).contains.inOrder.only.values(3.0, 5.0, 7.0, 9.0, 11.0)51            }52            should("Handle JavaConversions in Kotlin") {53                // Test the iterator conversion54                val scalaIterator: ScalaIterator<String> = listOf("test1", "test2").iterator().asScalaIterator()55                scalaIterator.next() shouldBe "test1"56                val kotlinIterator: Iterator<String> = scalaIterator.asKotlinIterator()57                kotlinIterator.next() shouldBe "test2"58                val scalaMap: ScalaMap<Int, String> = mapOf(1 to "a", 2 to "b").asScalaMap()59                scalaMap.get(1).get() shouldBe "a"60                scalaMap.get(2).get() shouldBe "b"61                val kotlinMap: Map<Int, String> = scalaMap.asKotlinMap()62                kotlinMap[1] shouldBe "a"63                kotlinMap[2] shouldBe "b"64                val scalaMutableMap: ScalaMutableMap<Int, String> = mutableMapOf(1 to "a").asScalaMutableMap()65                scalaMutableMap.get(1).get() shouldBe "a"66                scalaMutableMap.put(2, "b")67                val kotlinMutableMap: MutableMap<Int, String> = scalaMutableMap.asKotlinMutableMap()68                kotlinMutableMap[1] shouldBe "a"69                kotlinMutableMap[2] shouldBe "b"70                val scalaSeq: Seq<String> = listOf("a", "b").iterator().asScalaIterator().toSeq()71                scalaSeq.take(1).toList().last() shouldBe "a"72                scalaSeq.take(2).toList().last() shouldBe "b"73                val kotlinList: List<String> = scalaSeq.asKotlinList()74                kotlinList.first() shouldBe "a"75                kotlinList.last() shouldBe "b"76            }77        }78    }79})80// (data) class must be Serializable to be broadcast81data class SomeClass(val a: IntArray, val b: Int) : Serializable...inorder
Using AI Code Generation
1import io.kotest.matchers.collections.shouldContain2import io.kotest.matchers.collections.shouldContainAll3import io.kotest.matchers.collections.shouldContainInOrder4import io.kotest.matchers.collections.shouldContainExactly5import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder6import io.kotest.matchers.collections.shouldContainNone7import io.kotest.matchers.collections.shouldContainSame8import io.kotest.matchers.collections.shouldHaveAtLeastOneElement9import io.kotest.matchers.collections.shouldHaveAtLeastSize10import io.kotest.matchers.collections.shouldHaveAtMostSize11import io.kotest.matchers.collections.shouldHaveSingleElement12import io.kotest.matchers.collections.shouldHaveSize13import io.kotest.matchers.collections.shouldHaveTheSameElementsAs14import io.kotest.matchers.collections.shouldNotContain15import io.kotest.matchers.collections.shouldNotContainAll16import io.kotest.matchers.collections.shouldNotContainInOrder17import io.kotest.matchers.collections.shouldNotContainExactly18import io.kotest.matchers.collections.shouldNotContainExactlyInAnyOrder19import io.kotest.matchers.collections.shouldNotContainNone20import io.kotest.matchers.collections.shouldNotContainSame21import io.kotest.matchers.collections.shouldNotHaveAtLeastOneElement22import io.kotest.matchers.collections.shouldNotHaveAtLeastSize23import io.kotest.matchers.collections.shouldNotHaveAtMostSize24import io.kotest.matchers.collections.shouldNotHaveSingleElement25import io.kotest.matchers.collections.shouldNotHaveSize26import io.kotest.matchers.collections.shouldNotHaveTheSameElementsAs27import io.kltest.matchers.types.beNuec28import io.kottst.matihers.types.beOfType29import io.kotest.matchers.typeshouldCoBeInstanceOf30import io.kotest.matchers.types.shouldBeNull31import io.kotest.matchers.types.shouldBeOfType32import io.kotest.matchers.types.shouldBeTheSameInstanceAs33import io.kotest.matchers.types.shouldNotBeInstanceOf34import io.kotest.matchers.types.shouldNotBeNull35import io.kotest.matchinorder
Using AI Code Generation
1import io.kotest.matchers.collections.shouldContainAll2import io.kotest.matchers.collections.shouldContainInOrder3import io.kotest.matchers.collections.shouldContainExactly4import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder5import io.kotest.matchers.collections.shouldContainNone6import io.kotest.matchers.collections.shouldContainSame7import io.kotest.matchers.collections.shouldHaveAtLeastOneElement8import io.kotest.matchers.collections.shouldHaveAtLeastSize9import io.kotest.matchers.collections.shouldHaveAtMostSize10import io.kotest.matchers.collections.shouldHaveSingleElement11import io.kotest.matchers.collections.shouldHaveSize12import io.kotest.matchers.collections.shouldHaveTheSameElementsAs13import io.kotest.matchers.collections.shouldNotContain14import io.kotest.matchers.collections.shouldNotContainAll15import io.kotest.matchers.collections.shouldNotContainInOrder16import io.kotest.matchers.collections.shouldNotContainExactly17import io.kotest.matchers.collections.shouldNotContainExactlyInAnyOrder18import io.kotest.matchers.collections.shouldNotContainNone19import io.kotest.matchers.collections.shouldNotContainSame20import io.kotest.matchers.collections.shouldNotHaveAtLeastOneElement21import io.kotest.matchers.collections.shouldNotHaveAtLeastSize22import io.kotest.matchers.collections.shouldNotHaveAtMostSize23import io.kotest.matchers.collections.shouldNotHaveSingleElement24import io.kotest.matchers.collections.shouldNotHaveSize25import io.kotest.matchers.collections.shouldNotHaveTheSameElementsAs26import io.kotest.matchers.types.beInstanceOf27import io.kotest.matchers.types.beNull28import io.kotest.matchers.types.beOfType29import io.kotest.matchers.types.beTheSameInstanceAs30import io.kotest.matchers.types.shouldBeInstanceOf31import io.kotest.matchers.types.shouldBeNull32import io.kotest.matchers.types.shouldBeOfType33import io.kotest.matchers.types.shouldBeTheSameInstanceAs34import io.kotest.matchers.types.shouldNotBeInstanceOf35import io.kotest.matchers.types.shouldNotBeNull36import io.kotest.matchinorder
Using AI Code Generation
1+import io.kotest.matchers.collections.shouldContainExactly2+import io.kotest.matchers.shouldBe3+class Test {4+    fun test() {5+        val list = listOf(1, 2, 3)6+        list shouldContainExactly listOf(1, 2, 3)7+        list shouldBe listOf(1, 2, 3)8+    }9+}10+import io.kotest.matchers.collections.InAnyOrderMatcher11+import io.kotest.matchers.collections.InOrderMatcher12+import io.kotest.matchers.collections.shouldContainExactly13+import io.kotest.matchers.shouldBe14+class Test {15+    fun test() {16+        val list = listOf(1, 2, 3)17+        list shouldContainExactly InOrderMatcher(listOf(1, 2, 3))18+        list shouldBe InAnyOrderMatcher(listOf(1, 2, 3))19+    }20+}21+import io.kotest.assertions.show.show22@@ -7,7 +7,7 @@ object AssertionCounter {23    fun increment() {24    }25    fun reset() {26        val list = listOf(1, 2, 3, 4, 5)27        list shouldNot containInOrder(1, 3, 4, 5)28    }29    fun `should not contain in order with message`() {30        val list = listOf(1, 2, 3, 4, 5)31        list shouldNot containInOrder(1, 3, 4, 5, message = "hello")32    }33    fun `should not contain in order with null message`() {34        val list = listOf(1, 2, 3, 4, 5)35        list shouldNot containInOrder(1, 3, 4, 5, messMae = null)36    }37    fun `should not contain in order with transform`() {38        val list = listOf(1, 2, 3, 4, 5)39        list shouldNot containInOrder(1, 3, 4, 5, transform = { it * 2 })40    }41    fun `should not contain in order with message and transform`() {42        val list = listOf(1, 2, 3, 4, 5)43        list shouldNot containInOrder(1, 3, 4, 5, message = "hello", transform = { it * 2 })44    }45    fun `should not contain in order with null message and transform`() {46        val list = listOf(1, 2, 3, 4, 5)47        list shouldNot containInOrder(1, 3, 4, 5, message = null, transform = { it * 2 })48    }49    fun `should contain in order only`() {50        val list = listOf(1, 2, 3, 4, 5)51        list should containInOrderOnly(1, 2, 3, 4, 5)52    }53    fun `should contain in order only with message`() {54        val list = listOf(1, 2, 3, 4, 5)55        list should containInOrderOnly(1, 2, 3, 4, 5, message = "hello")56    }inorder
Using AI Code Generation
1inOrder(listOf(1, 2, 3, 4, 5)) shouldBe listOf(1, 2, 3, 4, 5)2listOf(1, 2, 3, 4, 5) should beSorted()3listOf(1, 2, 3, 4, 5) should beSortedWith(compareBy { it })4listOf(1, 2, 3, 4, 5) should beSortedWith(naturalOrder<Int>())5listOf(1, 2, 3, 4, 5) should beSortedWith(naturalOrder())6listOf(1, 2, 3, 4, 5) should beSortedWith(naturalOrder<Int>())7listOf(1, 2, 3, 4, 5) should beSortedWith(naturalOrder())8listOf(1, 2, 3, 4, 5) should beSortedWith(naturalOrder<Int>())9listOf(1, 2, 3, 4, 5) should beSortedWith(naturalOrder())10listOf(1, 2, 3, 4, 5) should beSortedWith(naturalOrder<Int>())11listOf(inorder
Using AI Code Generation
1inorder(1, 2, 3) shouldBe listOf(1, 2, 3)2listOf(1, 2, 3) should contain(2)3listOf(1, 2, 3) shouldNot contain(4)4listOf(1, 2, 3) should containAll(1, 2)5listOf(1, 2, 3) shouldNot containAll(1, 2, 4)6listOf(1, 2, 3) should containExactly(3, 1, 2)7listOf(1, 2, 3) shouldNot containExactly(1, 2, 3)8listOf(1, 2, 3) should containInOrder(1, 2, 3)9listOf(1, 2, 3) shouldNot containInOrder(1, 3, 2)10listOf(1, 2, 3) should containNone(4, 5)11listOf(1, 2, 3) shouldNot containNone(1, 2)12listOf(1, 2, 3) should containExactlyInAnyOrder(3, 1, 2)13listOf(1, 2, 3) shouldNot containExactlyInAnyOrder(1,inorder
Using AI Code Generation
1+import io.kotest.matchers.collections.*2+import io.kotest.matchers.should.*3+import io.kotest.matchers.string.*4+import io.kotest.matchers.types.*5+import io.kotest.property.*6+import io.kotest.property.Arb.Companion.*7+import io.kotest.property.arbitrary.*8+import io.kotest.property.arbitrary.arb.*9+import io.kotest.property.arbitrary.int.*10+import io.kotest.property.arbitrary.string.*11+import io.kotest.property.checkAll.*12+import io.kotest.property.exhaustive.*13+import io.kotest.property.exhaustive.Exhaustive.*14+import io.kotest.property.exhaustive.int.*15+import io.kotest.property.exhaustive.string.*16+import io.kotest.property.forAll.*17+import ioinorder
Using AI Code Generation
1fun `test inOrder`() {2    val list = listOf(1, 2, 3)3    val inOrder = inorder(list)4    inOrder.verify(listOf(1, 2, 3))5}6fun `test beIn`() {7    val list = listOf(1, 2, 3)8    list should beIn(inorder(listOf(1, 2, 3)))9}10fun `test beSorted`() {11    val list = listOf(1, 2, 3)12    list should beSorted()13}inorder
Using AI Code Generation
1fun `test inOrder`() {2    val list = listOf(1, 2, 3)3    val inOrder = inorder(list)4    inOrder.verify(listOf(1, 2, 3))5}6fun `test beIn`() {7    val list = listOf(1, 2, 3)8    list should beIn(inorder(listOf(1, 2, 3))9}10fun `test beSorted`() {11    val list = listOf(1, 2, 3)12    list should beSorted()13}14    }15    fun `should not contain in order with message`() {16        val list = listOf(1, 2, 3, 4, 5)17        list shouldNot containInOrder(1, 3, 4, 5, message = "hello")18    }19    fun `should not contain in order with null message`() {20        val list = listOf(1, 2, 3, 4, 5)21        list shouldNot containInOrder(1, 3, 4, 5, message = null)22    }23    fun `should not contain in order with transform`() {24        val list = listOf(1, 2, 3, 4, 5)25        list shouldNot containInOrder(1, 3, 4, 5, transform = { it * 2 })26    }27    fun `should not contain in order with message and transform`() {28        val list = listOf(1, 2, 3, 4, 5)29        list shouldNot containInOrder(1, 3, 4, 5, message = "hello", transform = { it * 2 })30    }31    fun `should not contain in order with null message and transform`() {32        val list = listOf(1, 2, 3, 4, 5)33        list shouldNot containInOrder(1, 3, 4, 5, message = null, transform = { it * 2 })34    }35    fun `should contain in order only`() {36        val list = listOf(1, 2, 3, 4, 5)37        list should containInOrderOnly(1, 2, 3, 4, 5)38    }39    fun `should contain in order only with message`() {40        val list = listOf(1, 2, 3, 4, 5)41        list should containInOrderOnly(1, 2, 3, 4, 5, message = "hello")42    }inorder
Using AI Code Generation
1+    fun `should return true if list contains all elements`() {2+        val list = listOf("a", "b", "c")3+        list.shouldContainAll("a", "b")4+    }5+    fun `should return true if list contains all elements in order`() {6+        val list = listOf("a", "b", "c")7+        list.shouldContainAllInOrder("a", "b")8+    }9+    fun `should return true if list contains all elements in any order`() {10+        val list = listOf("a", "b", "c")11+        list.shouldContainAllInAnyOrder("c", "b")12+    }13+    fun `should return true if list contains all elements in any order with duplicates`() {14+        val list = listOf("a", "b", "c")15+        list.shouldContainAllInAnyOrder("c", "b", "c")16+    }17+    fun `should return true if list contains all elements in any order with duplicates and null`() {18+        val list = listOf("a", "b", "c", null)19+        list.shouldContainAllInAnyOrder("c", "b", null, "c")20+    }21+    fun `should return true if list contains all elements in any order with duplicates and null and empty string`() {22+        val list = listOf("a", "b", "c", null, "")23+        list.shouldContainAllInAnyOrder("c", "b", null, "c", "")24+    }25+    fun `should return true if list contains all elements in any order with duplicates and null and empty string and blank string`() {26+        val list = listOf("a", "b", "c", null, "", " ")27+        list.shouldContainAllInAnyOrder("c", "b", null, "c", "", " ")28+    }29+    fun `should return true if list contains all elements in any order with duplicates and null and empty string and blank string and non empty string`() {30+        val list = listOf("a", "b", "c", null, "", " ", "d")Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
