1 package net.pterodactylus.sone.web.ajax
3 import net.pterodactylus.sone.data.Album
4 import net.pterodactylus.sone.data.Album.Modifier.AlbumTitleMustNotBeEmpty
5 import net.pterodactylus.sone.data.Sone
6 import net.pterodactylus.sone.data.impl.AlbumImpl
7 import net.pterodactylus.sone.test.deepMock
8 import net.pterodactylus.sone.test.getInstance
9 import net.pterodactylus.sone.test.mock
10 import net.pterodactylus.sone.test.whenever
11 import net.pterodactylus.sone.web.baseInjector
12 import org.hamcrest.MatcherAssert.assertThat
13 import org.hamcrest.Matchers.equalTo
14 import org.hamcrest.Matchers.notNullValue
18 * Unit test for [EditAlbumAjaxPage].
20 class EditAlbumAjaxPageTest : JsonPageTest("editAlbum.ajax", pageSupplier = ::EditAlbumAjaxPage) {
22 private val sone = mock<Sone>()
23 private val localSone = mock<Sone>().apply { whenever(isLocal).thenReturn(true) }
24 private val album = mock<Album>().apply { whenever(id).thenReturn("album-id") }
27 fun `request without album results in invalid-album-id`() {
28 assertThatJsonFailed("invalid-album-id")
32 fun `request with non-local album results in not-authorized`() {
33 whenever(album.sone).thenReturn(sone)
35 addRequestParameter("album", "album-id")
36 assertThatJsonFailed("not-authorized")
40 fun `request with moveLeft moves album to the left`() {
41 whenever(album.sone).thenReturn(localSone)
42 val swappedAlbum = mock<Album>().apply { whenever(id).thenReturn("swapped") }
43 val parentAlbum = mock<Album>()
44 whenever(parentAlbum.moveAlbumUp(album)).thenReturn(swappedAlbum)
45 whenever(album.parent).thenReturn(parentAlbum)
47 addRequestParameter("album", "album-id")
48 addRequestParameter("moveLeft", "true")
49 assertThatJsonIsSuccessful()
50 assertThat(json["sourceAlbumId"]?.asText(), equalTo("album-id"))
51 assertThat(json["destinationAlbumId"]?.asText(), equalTo("swapped"))
55 fun `request with moveRight moves album to the right`() {
56 whenever(album.sone).thenReturn(localSone)
57 val swappedAlbum = mock<Album>().apply { whenever(id).thenReturn("swapped") }
58 val parentAlbum = mock<Album>()
59 whenever(parentAlbum.moveAlbumDown(album)).thenReturn(swappedAlbum)
60 whenever(album.parent).thenReturn(parentAlbum)
62 addRequestParameter("album", "album-id")
63 addRequestParameter("moveRight", "true")
64 assertThatJsonIsSuccessful()
65 assertThat(json["sourceAlbumId"]?.asText(), equalTo("album-id"))
66 assertThat(json["destinationAlbumId"]?.asText(), equalTo("swapped"))
70 fun `request with missing title results in invalid-title`() {
71 whenever(album.sone).thenReturn(localSone)
72 whenever(album.modify()).thenReturn(deepMock())
73 whenever(album.modify().setTitle("")).thenThrow(AlbumTitleMustNotBeEmpty::class.java)
75 addRequestParameter("album", "album-id")
76 assertThatJsonFailed("invalid-album-title")
80 fun `request with title and description sets title and filtered description`() {
81 val album = AlbumImpl(currentSone, "album-id")
83 addRequestParameter("album", "album-id")
84 addRequestParameter("title", "new title")
85 addRequestParameter("description", "foo http://127.0.0.1:8888/KSK@foo.html link")
86 addRequestHeader("Host", "127.0.0.1:8888")
87 assertThatJsonIsSuccessful()
88 assertThat(json["albumId"]?.asText(), equalTo("album-id"))
89 assertThat(json["title"]?.asText(), equalTo("new title"))
90 assertThat(json["description"]?.asText(), equalTo("foo KSK@foo.html link"))
94 fun `page can be created by dependency injection`() {
95 assertThat(baseInjector.getInstance<EditAlbumAjaxPage>(), notNullValue())