diff --git a/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.html b/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.html index 9a7ba1acc..2f5f00703 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.html @@ -21,7 +21,7 @@
- diff --git a/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.ts b/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.ts index 8af67ecd7..17d3ad776 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.ts @@ -7,6 +7,7 @@ import { ISearchTvResultV2 } from "../../../interfaces/ISearchTvResultV2"; import { ISearchMovieResultV2 } from "../../../interfaces/ISearchMovieResultV2"; import { EpisodeRequestComponent } from "../../../shared/episode-request/episode-request.component"; import { AdminRequestDialogComponent } from "../../../shared/admin-request-dialog/admin-request-dialog.component"; +import { DiscoverType } from "../carousel-list/carousel-list.component"; @Component({ selector: "discover-card", @@ -15,6 +16,7 @@ import { AdminRequestDialogComponent } from "../../../shared/admin-request-dialo }) export class DiscoverCardComponent implements OnInit { + @Input() public discoverType: DiscoverType; @Input() public result: IDiscoverCardResult; @Input() public isAdmin: boolean; public RequestType = RequestType; @@ -126,7 +128,18 @@ export class DiscoverCardComponent implements OnInit { const dialog = this.dialog.open(AdminRequestDialogComponent, { width: "700px", data: { type: RequestType.movie, id: this.result.id }, panelClass: 'modal-panel' }); dialog.afterClosed().subscribe((result) => { if (result) { - this.result.requested = true; + this.requestService.requestMovie({ theMovieDbId: +this.result.id, + languageCode: null, + qualityPathOverride: result.radarrPathId, + requestOnBehalf: result.username?.id, + rootFolderOverride: result.radarrFolderId, }).subscribe(x => { + if (x.result) { + this.result.requested = true; + this.messageService.send(x.message, "Ok"); + } else { + this.messageService.send(x.errorMessage, "Ok"); + } + }); } }); } else { diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html index adff68d23..73e68336e 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html @@ -8,6 +8,6 @@ - + \ No newline at end of file diff --git a/tests/cypress/integration/page-objects/discover/discover.page.ts b/tests/cypress/integration/page-objects/discover/discover.page.ts index 3a4636d58..df644e830 100644 --- a/tests/cypress/integration/page-objects/discover/discover.page.ts +++ b/tests/cypress/integration/page-objects/discover/discover.page.ts @@ -1,5 +1,6 @@ import { BasePage } from "../base.page"; -import { DiscoverCard } from "../shared/DiscoverCard"; +import { AdminRequestDialog } from "../shared/AdminRequestDialog"; +import { DiscoverCard, DiscoverType } from "../shared/DiscoverCard"; class CarouselComponent { private type: string; @@ -16,8 +17,8 @@ class CarouselComponent { return cy.get(`#${this.type}Tv-button`); } - getCard(id: string, movie: boolean): DiscoverCard { - return new DiscoverCard(id, movie); + getCard(id: string, movie: boolean, type?: DiscoverType): DiscoverCard { + return new DiscoverCard(id, movie, type); } constructor(id: string) { @@ -27,6 +28,7 @@ class CarouselComponent { class DiscoverPage extends BasePage { popularCarousel = new CarouselComponent("popular"); + adminOptionsDialog = new AdminRequestDialog(); constructor() { super(); diff --git a/tests/cypress/integration/page-objects/shared/DiscoverCard.ts b/tests/cypress/integration/page-objects/shared/DiscoverCard.ts index be126cd27..f2ca1b8e3 100644 --- a/tests/cypress/integration/page-objects/shared/DiscoverCard.ts +++ b/tests/cypress/integration/page-objects/shared/DiscoverCard.ts @@ -1,13 +1,22 @@ import { EpisodeRequestModal } from "./EpisodeRequestModal"; +export enum DiscoverType { + Upcoming, + Trending, + Popular, + RecentlyRequested, +} + export class DiscoverCard { private id: string; private movie: boolean; + private type: DiscoverType; episodeRequestModal = new EpisodeRequestModal(); - constructor(id: string, movie: boolean) { + constructor(id: string, movie: boolean, type?: DiscoverType) { this.id = id; this.movie = movie; + this.type = type; } get topLevelCard(): Cypress.Chainable { @@ -35,7 +44,7 @@ export class DiscoverCard { } get requestButton(): Cypress.Chainable { - return cy.get(`#requestButton${this.id}${this.movie ? '1' : '0'}`); + return cy.get(`#requestButton${this.id}${this.movie ? '1' : '0'}${this.type}`); } verifyTitle(expected: string): Cypress.Chainable { diff --git a/tests/cypress/tests/discover/discover-cards-requests.spec.ts b/tests/cypress/tests/discover/discover-cards-requests.spec.ts index 4e04ff8b8..117c6d169 100644 --- a/tests/cypress/tests/discover/discover-cards-requests.spec.ts +++ b/tests/cypress/tests/discover/discover-cards-requests.spec.ts @@ -1,11 +1,12 @@ import { discoverPage as Page } from "@/integration/page-objects"; +import { DiscoverType } from "@/integration/page-objects/shared/DiscoverCard"; describe("Discover Cards Requests Tests", () => { beforeEach(() => { cy.login(); }); - it("Not requested movie allows us to request", () => { + it("Not requested movie allows admin to request", () => { window.localStorage.setItem("DiscoverOptions2", "2"); cy.intercept("GET", "**/search/Movie/Popular/**", (req) => { req.reply((res) => { @@ -27,22 +28,76 @@ describe("Discover Cards Requests Tests", () => { var expectedId = body[0].id; var title = body[0].title; - const card = Page.popularCarousel.getCard(expectedId, true); + const card = Page.popularCarousel.getCard(expectedId, true, DiscoverType.Popular); card.verifyTitle(title); card.requestButton.should("exist"); // Not visible until hover card.requestButton.should("not.be.visible"); - cy.wait(500) + cy.wait(500); card.topLevelCard.realHover(); card.requestButton.should("be.visible"); card.requestButton.click(); + Page.adminOptionsDialog.isOpen(); + Page.adminOptionsDialog.requestButton.click(); + cy.verifyNotification("has been successfully added!"); - card.requestButton.should("not.be.visible"); - card.availabilityText.should('have.text','Pending'); - card.statusClass.should('have.class','requested'); + card.requestButton.should("not.exist"); + card.availabilityText.should("have.text", "Pending"); + card.statusClass.should("have.class", "requested"); + }); + }); + + it.only("Not requested movie allows non-admin to request", () => { + cy.generateUniqueId().then((id) => { + cy.login(); + const roles = []; + roles.push({ value: "RequestMovie", enabled: true }); + cy.createUser(id, "a", roles).then(() => { + cy.removeLogin(); + cy.loginWithCreds(id, "a"); + + window.localStorage.setItem("DiscoverOptions2", "2"); + cy.intercept("GET", "**/search/Movie/Popular/**", (req) => { + req.reply((res) => { + const body = res.body; + const movie = body[6]; + movie.available = false; + movie.approved = false; + movie.requested = false; + + body[6] = movie; + res.send(body); + }); + }).as("cardsResponse"); + + Page.visit(); + + cy.wait("@cardsResponse").then((res) => { + const body = JSON.parse(res.response.body); + var expectedId = body[6].id; + var title = body[6].title; + + const card = Page.popularCarousel.getCard(expectedId, true, DiscoverType.Popular); + card.verifyTitle(title); + card.requestButton.should("exist"); + // Not visible until hover + card.requestButton.should("not.be.visible"); + cy.wait(500); + card.topLevelCard.realHover(); + + card.requestButton.should("be.visible"); + card.requestButton.click(); + + cy.verifyNotification("has been successfully added!"); + + card.requestButton.should("not.exist"); + card.availabilityText.should("have.text", "Pending"); + card.statusClass.should("have.class", "requested"); + }); + }); }); }); @@ -68,13 +123,13 @@ describe("Discover Cards Requests Tests", () => { var expectedId = body[1].id; var title = body[1].title; - const card = Page.popularCarousel.getCard(expectedId, true); + const card = Page.popularCarousel.getCard(expectedId, true, DiscoverType.Popular); card.verifyTitle(title); card.topLevelCard.realHover(); card.requestButton.should("not.exist"); - card.availabilityText.should('have.text','Available'); - card.statusClass.should('have.class','available'); + card.availabilityText.should("have.text", "Available"); + card.statusClass.should("have.class", "available"); }); }); @@ -100,14 +155,13 @@ describe("Discover Cards Requests Tests", () => { var expectedId = body[1].id; var title = body[1].title; - const card = Page.popularCarousel.getCard(expectedId, true); - card.verifyTitle(title); - - card.topLevelCard.realHover(); + const card = Page.popularCarousel.getCard(expectedId, true, DiscoverType.Popular); + card.title.realHover(); + card.verifyTitle(title); card.requestButton.should("not.exist"); - card.availabilityText.should('have.text','Pending'); - card.statusClass.should('have.class','requested'); + card.availabilityText.should("have.text", "Pending"); + card.statusClass.should("have.class", "requested"); }); }); @@ -133,13 +187,13 @@ describe("Discover Cards Requests Tests", () => { var expectedId = body[1].id; var title = body[1].title; - const card = Page.popularCarousel.getCard(expectedId, true); - card.verifyTitle(title); - card.topLevelCard.realHover(); + const card = Page.popularCarousel.getCard(expectedId, true, DiscoverType.Popular); + card.title.realHover(); + card.verifyTitle(title); card.requestButton.should("not.exist"); - card.availabilityText.should('have.text','Approved'); - card.statusClass.should('have.class','approved'); + card.availabilityText.should("have.text", "Approved"); + card.statusClass.should("have.class", "approved"); }); }); @@ -163,17 +217,17 @@ describe("Discover Cards Requests Tests", () => { var expectedId = body[1].id; var title = body[1].title; - const card = Page.popularCarousel.getCard(expectedId, true); - card.verifyTitle(title); - card.topLevelCard.realHover(); + const card = Page.popularCarousel.getCard(expectedId, true, DiscoverType.Popular); + card.title.realHover(); + card.verifyTitle(title); card.requestButton.should("not.exist"); - card.availabilityText.should('have.text','Available'); - card.statusClass.should('have.class','available'); + card.availabilityText.should("have.text", "Available"); + card.statusClass.should("have.class", "available"); }); }); - it("Not available TV does not allow us to request", () => { + it("Not available TV allow admin to request", () => { cy.intercept("GET", "**/search/Tv/popular/**", (req) => { req.reply((res) => { const body = res.body; @@ -184,25 +238,77 @@ describe("Discover Cards Requests Tests", () => { res.send(body); }); }).as("cardsResponse"); + cy.intercept("GET", "**/search/Tv/**").as("otherResponses"); window.localStorage.setItem("DiscoverOptions2", "3"); Page.visit(); + cy.wait("@otherResponses"); cy.wait("@cardsResponse").then((res) => { const body = JSON.parse(res.response.body); var expectedId = body[3].id; var title = body[3].title; - const card = Page.popularCarousel.getCard(expectedId, false); - card.verifyTitle(title); - card.topLevelCard.realHover(); + const card = Page.popularCarousel.getCard(expectedId, false, DiscoverType.Popular); + card.title.realHover(); + card.verifyTitle(title); card.requestButton.should("be.visible"); card.requestButton.click(); const modal = card.episodeRequestModal; modal.latestSeasonButton.click(); - cy.verifyNotification("has been added successfully") + + Page.adminOptionsDialog.isOpen(); + Page.adminOptionsDialog.requestButton.click(); + + cy.verifyNotification("has been added successfully"); + }); + }); + + it("Not available TV allow non-admin to request", () => { + cy.generateUniqueId().then((id) => { + cy.login(); + const roles = []; + roles.push({ value: "RequestTv", enabled: true }); + cy.createUser(id, "a", roles).then(() => { + cy.removeLogin(); + cy.loginWithCreds(id, "a"); + + cy.intercept("GET", "**/search/Tv/popular/**", (req) => { + req.reply((res) => { + const body = res.body; + const tv = body[5]; + tv.fullyAvailable = false; + + body[5] = tv; + res.send(body); + }); + }).as("cardsResponse"); + cy.intercept("GET", "**/search/Tv/**").as("otherResponses"); + window.localStorage.setItem("DiscoverOptions2", "3"); + + Page.visit(); + + cy.wait("@otherResponses"); + cy.wait("@cardsResponse").then((res) => { + const body = JSON.parse(res.response.body); + var expectedId = body[5].id; + var title = body[5].title; + + const card = Page.popularCarousel.getCard(expectedId, false, DiscoverType.Popular); + card.title.realHover(); + + card.verifyTitle(title); + card.requestButton.should("be.visible"); + card.requestButton.click(); + const modal = card.episodeRequestModal; + + modal.latestSeasonButton.click(); + + cy.verifyNotification("has been added successfully"); + }); + }); }); }); });