//// The pressing detail route (`/pressing/:did/:rkey`): parsing, hydration //// off an already-loaded browse row vs. a fresh `catalog.getRelease` fetch, //// and the shared adopt flow's owned/wanted flip. import at_record_web/model.{ type BrowseRelease, BrowseRelease, Model, PressingDetail, PressingFailed, PressingLoaded, PressingLoading, } import at_record_web/msg.{GotBrowseAdd, GotPressing, OnRouteChange} import at_record_web/route import at_record_web/update.{update} import at_record_web/view import gleam/option.{None, Some} import gleam/string import gleam/uri import lustre/element import rsvp import support.{base, empty_effect, logged_in} fn a_pressing(uri: String) -> BrowseRelease { BrowseRelease( uri:, cid: "cid-1", title: "Spiderland", genres: [], styles: [], publisher_did: "did:plc:abc", publisher_handle: "alice.test", owned: False, wanted: False, artist_display: Some("Slint"), cover_url: None, thumb_url: None, released: Some("1991"), country: Some("US"), adoption_count: Some(3), variant_count: Some(2), ) } pub fn pressing_route_round_trips_test() { let parsed = PressingDetail("did:plc:abc", "3jz") assert route.to_path(parsed) == "/pressing/did:plc:abc/3jz" let assert Ok(target) = uri.parse(route.to_path(parsed)) assert route.parse(target) == parsed } pub fn split_release_uri_round_trips_test() { let uri = model.release_uri("did:plc:abc", "3jz") assert model.split_release_uri(uri) == Ok(#("did:plc:abc", "3jz")) } pub fn split_release_uri_rejects_a_malformed_uri_test() { assert model.split_release_uri("not-a-uri") == Error(Nil) } pub fn on_route_change_hydrates_from_an_already_loaded_browse_row_test() { let uri = model.release_uri("did:plc:abc", "3jz") let seeded = Model(..logged_in(), browse: [a_pressing(uri)]) let #(model, _) = update(seeded, OnRouteChange(PressingDetail("did:plc:abc", "3jz"))) assert model.route == PressingDetail("did:plc:abc", "3jz") assert model.pressing == PressingLoaded(a_pressing(uri)) } pub fn on_route_change_fetches_when_not_already_loaded_test() { let #(model, effect) = update(logged_in(), OnRouteChange(PressingDetail("did:plc:abc", "3jz"))) assert model.pressing == PressingLoading assert effect != empty_effect() } pub fn got_pressing_ok_loads_the_release_test() { let uri = model.release_uri("did:plc:abc", "3jz") let #(model, _) = update(base(), GotPressing(Ok(a_pressing(uri)))) assert model.pressing == PressingLoaded(a_pressing(uri)) } pub fn got_pressing_error_marks_failed_test() { let #(model, _) = update(base(), GotPressing(Error(rsvp.NetworkError))) assert model.pressing == PressingFailed } pub fn browse_add_success_flips_the_pressing_row_too_test() { let uri = model.release_uri("did:plc:abc", "3jz") let seeded = Model( ..logged_in(), pressing: PressingLoaded(a_pressing(uri)), browse_adding: Some(#(uri, "owned")), ) let #(model, _) = update(seeded, GotBrowseAdd(uri, Ok(Nil))) assert model.pressing == PressingLoaded(BrowseRelease(..a_pressing(uri), owned: True)) } pub fn pressing_page_renders_the_loaded_release_test() { let uri = model.release_uri("did:plc:abc", "3jz") let html = Model( ..logged_in(), route: PressingDetail("did:plc:abc", "3jz"), pressing: PressingLoaded(a_pressing(uri)), ) |> view.view |> element.to_string assert string.contains(html, "Spiderland") assert string.contains(html, "Slint") assert string.contains(html, "minted via") assert string.contains(html, "@alice.test") assert string.contains(html, "IN 3 CRATES") assert string.contains(html, "2 VERSIONS") } pub fn pressing_page_renders_owned_state_test() { let uri = model.release_uri("did:plc:abc", "3jz") let html = Model( ..logged_in(), route: PressingDetail("did:plc:abc", "3jz"), pressing: PressingLoaded(BrowseRelease(..a_pressing(uri), owned: True)), ) |> view.view |> element.to_string assert string.contains(html, "IN YOUR CRATE") } pub fn pressing_page_renders_failed_state_test() { let html = Model( ..logged_in(), route: PressingDetail("did:plc:abc", "3jz"), pressing: PressingFailed, ) |> view.view |> element.to_string assert string.contains(html, "COULDN") } pub fn browse_card_links_to_the_pressing_page_test() { let uri = model.release_uri("did:plc:abc", "3jz") let html = Model(..logged_in(), route: model.Browse, browse: [a_pressing(uri)]) |> view.view |> element.to_string assert string.contains(html, "/pressing/did:plc:abc/3jz") assert string.contains(html, "/u/alice.test") }