Tests: Refactor acceptance tests

This commit is contained in:
theresa 2022-04-15 15:46:25 +02:00
parent 98b2b8bc34
commit bcc3da81bd
46 changed files with 2679 additions and 7239 deletions

View file

@ -1,208 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import PhotoViewer from "../page-model/photoviewer";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test albums`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const photoviewer = new PhotoViewer();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "authentication-000")(
"Time to start instance (will be marked as unstable)",
async (t) => {
await t.wait(5000);
}
);
test.meta("testID", "albums-001").meta({ type: "smoke" })(
"Create/delete album on /albums",
async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await toolbar.triggerToolbarAction("add");
const AlbumCountAfterCreate = await album.getAlbumCount("all");
const NewAlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(AlbumCountAfterCreate).eql(AlbumCount + 1);
await album.selectAlbumFromUID(NewAlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCountAfterCreate - 1);
}
);
test.meta("testID", "albums-002").meta({ type: "smoke" })(
"Create/delete album during add to album",
async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("browse");
await toolbar.search("photo:true");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await photo.selectPhotoFromUID(SecondPhotoUid);
await photo.selectPhotoFromUID(FirstPhotoUid);
await contextmenu.triggerContextMenuAction("album", "NotYetExistingAlbum");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbum");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
}
);
test.meta("testID", "albums-003").meta({ type: "smoke" })("Update album details", async (t) => {
await menu.openPage("albums");
await toolbar.search("Holiday");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("Holiday");
await t.click(page.cardTitle.nth(0)).typeText(albumdialog.title, "Animals", { replace: true });
await t.expect(albumdialog.description.value).eql("").expect(albumdialog.category.value).eql("");
await t
.typeText(albumdialog.description, "All my animals")
.typeText(albumdialog.category, "Pets")
.pressKey("enter")
.click(albumdialog.dialogSave);
await t.expect(page.cardTitle.nth(0).innerText).contains("Animals");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t.typeText(albumdialog.title, "Holiday", { replace: true });
await t
.expect(albumdialog.description.value)
.eql("All my animals")
.expect(albumdialog.category.value)
.eql("Pets");
await t
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.dialogSave);
await menu.openPage("albums");
await t
.expect(Selector("div").withText("Holiday").visible)
.ok()
.expect(Selector("div").withText("Animals").exists)
.notOk();
});
test.meta("testID", "albums-004").meta({ type: "smoke" })(
"Add/Remove Photos to/from album",
async (t) => {
await menu.openPage("albums");
await toolbar.search("Holiday");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCount = await photo.getPhotoCount("all");
await menu.openPage("browse");
await toolbar.search("photo:true");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await photo.selectPhotoFromUID(SecondPhotoUid);
await photoviewer.openPhotoViewer("uid", FirstPhotoUid);
await photoviewer.triggerPhotoViewerAction("select");
await photoviewer.triggerPhotoViewerAction("close");
await contextmenu.triggerContextMenuAction("album", "Holiday");
await menu.openPage("albums");
await album.openAlbumWithUid(AlbumUid);
const PhotoCountAfterAdd = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterAdd).eql(PhotoCount + 2);
await photo.selectPhotoFromUID(FirstPhotoUid);
await photo.selectPhotoFromUID(SecondPhotoUid);
await contextmenu.triggerContextMenuAction("remove", "");
const PhotoCountAfterRemove = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterRemove).eql(PhotoCountAfterAdd - 2);
}
);
test.meta("testID", "albums-005")("Use album search and filters", async (t) => {
await menu.openPage("albums");
if (t.browser.platform === "mobile") {
await toolbar.search("category:Family");
} else {
await toolbar.setFilter("category", "Family");
}
await t.expect(page.cardTitle.nth(0).innerText).contains("Christmas");
const AlbumCount = await album.getAlbumCount("all");
await t.expect(AlbumCount).eql(1);
if (t.browser.platform === "mobile") {
} else {
await toolbar.setFilter("category", "All Categories");
}
await toolbar.search("Holiday");
await t.expect(page.cardTitle.nth(0).innerText).contains("Holiday");
const AlbumCount2 = await album.getAlbumCount("all");
await t.expect(AlbumCount2).eql(1);
});
test.meta("testID", "albums-006")("Test album autocomplete", async (t) => {
await toolbar.search("photo:true");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
await photo.selectPhotoFromUID(FirstPhotoUid);
await contextmenu.openContextMenu();
await t.click(Selector("button.action-album")).click(Selector(".input-album input"));
await t
.expect(page.selectOption.withText("Holiday").visible)
.ok()
.expect(page.selectOption.withText("Christmas").visible)
.ok();
await t.typeText(Selector(".input-album input"), "C", { replace: true });
await t
.expect(page.selectOption.withText("Holiday").visible)
.notOk()
.expect(page.selectOption.withText("Christmas").visible)
.ok()
.expect(page.selectOption.withText("C").visible)
.ok();
});
test.meta("testID", "albums-007").meta({ type: "smoke" })(
"Create, Edit, delete sharing link",
async (t) => {
await page.testCreateEditDeleteSharingLink("albums");
}
);

View file

@ -1,146 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test calendar`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "calendar-001").meta({ type: "smoke" })("View calendar", async (t) => {
await menu.openPage("calendar");
await t
.expect(Selector("a").withText("May 2019").visible)
.ok()
.expect(Selector("a").withText("October 2019").visible)
.ok();
});
test.meta("testID", "calendar-002")("Update calendar details", async (t) => {
await menu.openPage("calendar");
await toolbar.search("March 2014");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("March 2014");
await t.click(page.cardTitle.nth(0)).typeText(albumdialog.location, "Snow", { replace: true });
await t.expect(albumdialog.description.value).eql("").expect(albumdialog.category.value).eql("");
await t
.typeText(albumdialog.description, "We went to ski")
.typeText(albumdialog.category, "Mountains")
.pressKey("enter")
.click(albumdialog.dialogSave);
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("March 2014")
.expect(page.cardDescription.nth(0).innerText)
.contains("We went to ski")
.expect(Selector("div.caption").nth(1).innerText)
.contains("Mountains")
.expect(Selector("div.caption").nth(2).innerText)
.contains("Snow");
await album.openNthAlbum(0);
await t.expect(toolbar.toolbarTitle.innerText).contains("March 2014");
await t.expect(toolbar.toolbarDescription.innerText).contains("We went to ski");
await menu.openPage("calendar");
if (t.browser.platform === "mobile") {
await toolbar.search("category:Mountains");
} else {
await toolbar.setFilter("category", "Mountains");
}
await t.expect(page.cardTitle.nth(0).innerText).contains("March 2014");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t
.expect(albumdialog.description.value)
.eql("We went to ski")
.expect(albumdialog.category.value)
.eql("Mountains")
.expect(albumdialog.location.value)
.eql("Snow");
await t
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.location)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.dialogSave);
await menu.openPage("calendar");
await toolbar.search("March 2014");
await t
.expect(page.cardDescription.innerText)
.notContains("We went to ski")
.expect(Selector("div.caption").nth(0).innerText)
.notContains("Snow");
});
test.meta("testID", "calendar-003")("Create, Edit, delete sharing link for calendar", async (t) => {
await page.testCreateEditDeleteSharingLink("calendar");
});
test.meta("testID", "calendar-004").meta({ type: "smoke" })(
"Create/delete album-clone from calendar",
async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("calendar");
const SecondCalendarUid = await album.getNthAlbumUid("all", 1);
await album.openAlbumWithUid(SecondCalendarUid);
const PhotoCountInCalendar = await photo.getPhotoCount("all");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await menu.openPage("calendar");
await album.selectAlbumFromUID(SecondCalendarUid);
await contextmenu.triggerContextMenuAction("clone", "NotYetExistingAlbumForCalendar");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbumForCalendar");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountInAlbum = await photo.getPhotoCount("all");
await t.expect(PhotoCountInAlbum).eql(PhotoCountInCalendar);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await menu.openPage("albums");
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
await menu.openPage("calendar");
await album.openAlbumWithUid(SecondCalendarUid);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
}
);

View file

@ -1,61 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Toolbar from "../page-model/toolbar";
fixture`Test components`.page`${testcafeconfig.url}`;
const toolbar = new Toolbar();
test.meta("testID", "components-001").meta({ type: "smoke" })("Test filter options", async (t) => {
await t.expect(Selector("body").withText("object Object").exists).notOk();
});
test.meta("testID", "components-002").meta({ type: "smoke" })("Fullscreen mode", async (t) => {
await t.click(Selector("div.v-image__image").nth(0));
if (await Selector("#photo-viewer").visible) {
await t
.expect(Selector("#photo-viewer").visible)
.ok()
.expect(Selector("img.pswp__img").visible)
.ok();
} else {
await t.expect(Selector("div.video-viewer").visible).ok();
}
});
test.meta("testID", "components-003").meta({ type: "smoke" })("Mosaic view", async (t) => {
await toolbar.setFilter("view", "Mosaic");
await t
.expect(Selector("div.v-image__image").visible)
.ok()
.expect(Selector("div.p-photo-mosaic").visible)
.ok()
.expect(Selector("div.is-photo div.caption").exists)
.notOk()
.expect(Selector("#photo-viewer").visible)
.notOk();
});
test.meta("testID", "components-004")("List view", async (t) => {
await toolbar.setFilter("view", "List");
await t
.expect(Selector("table.v-datatable").visible)
.ok()
.expect(Selector("div.list-view").visible)
.ok();
});
test.meta("testID", "components-005").meta({ type: "smoke" })("Card view", async (t) => {
await toolbar.setFilter("view", "Cards");
await t
.expect(Selector("div.v-image__image").visible)
.ok()
.expect(Selector("div.is-photo div.caption").visible)
.ok()
.expect(Selector("#photo-viewer").visible)
.notOk();
});

View file

@ -1,160 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test folders`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "folders-001").meta({ type: "smoke" })("View folders", async (t) => {
await menu.openPage("folders");
await t
.expect(Selector("a").withText("BotanicalGarden").visible)
.ok()
.expect(Selector("a").withText("Kanada").visible)
.ok()
.expect(Selector("a").withText("KorsikaAdventure").visible)
.ok();
});
test.meta("testID", "folders-002")("Update folder details", async (t) => {
await menu.openPage("folders");
await toolbar.search("Kanada");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("Kanada");
await t.click(page.cardTitle.nth(0));
await t
.expect(albumdialog.title.value)
.eql("Kanada")
.expect(albumdialog.location.value)
.eql("")
.expect(albumdialog.description.value)
.eql("")
.expect(albumdialog.category.value)
.eql("");
await t
.typeText(albumdialog.title, "MyFolder", { replace: true })
.typeText(albumdialog.location, "USA", { replace: true })
.typeText(albumdialog.description, "Last holiday")
.typeText(albumdialog.category, "Mountains")
.pressKey("enter")
.click(albumdialog.dialogSave);
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("MyFolder")
.expect(page.cardDescription.nth(0).innerText)
.contains("Last holiday")
.expect(Selector("div.caption").nth(1).innerText)
.contains("Mountains")
.expect(Selector("div.caption").nth(2).innerText)
.contains("USA");
await album.openNthAlbum(0);
await t
.expect(toolbar.toolbarDescription.nth(0).innerText)
.contains("Last holiday")
.expect(toolbar.toolbarTitle.nth(0).innerText)
.contains("MyFolder");
await menu.openPage("folders");
if (t.browser.platform === "mobile") {
await toolbar.search("category:Mountains");
} else {
await toolbar.setFilter("category", "Mountains");
}
await t.expect(page.cardTitle.nth(0).innerText).contains("MyFolder");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t
.expect(albumdialog.description.value)
.eql("Last holiday")
.expect(albumdialog.category.value)
.eql("Mountains")
.expect(albumdialog.location.value)
.eql("USA");
await t
.typeText(albumdialog.title, "Kanada", { replace: true })
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.location)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.dialogSave);
await menu.openPage("folders");
await toolbar.search("Kanada");
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("Kanada")
.expect(page.cardDescription.nth(0).innerText)
.notContains("We went to ski")
.expect(Selector("div.caption").nth(0).innerText)
.notContains("USA");
});
test.meta("testID", "folders-003")("Create, Edit, delete sharing link", async (t) => {
await page.testCreateEditDeleteSharingLink("folders");
});
test.meta("testID", "folders-004")("Create/delete album-clone from folder", async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("folders");
const ThirdFolderUid = await album.getNthAlbumUid("all", 2);
await album.openAlbumWithUid(ThirdFolderUid);
const PhotoCountInFolder = await photo.getPhotoCount("all");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
await menu.openPage("folders");
await album.selectAlbumFromUID(ThirdFolderUid);
await contextmenu.triggerContextMenuAction("clone", "NotYetExistingAlbumForFolder");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbumForFolder");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountInAlbum = await photo.getPhotoCount("all");
await t.expect(PhotoCountInAlbum).eql(PhotoCountInFolder);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await menu.openPage("albums");
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
await menu.openPage("folders");
await album.openAlbumWithUid(ThirdFolderUid);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
});

View file

@ -1,209 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import Label from "../page-model/label";
import PhotoEdit from "../page-model/photo-edit";
fixture`Test labels`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const label = new Label();
const photoedit = new PhotoEdit();
test.meta("testID", "labels-001").meta({ type: "smoke" })(
"Remove/Activate Add/Delete Label from photo",
async (t) => {
await menu.openPage("labels");
await toolbar.search("beacon");
const LabelBeaconUid = await label.getNthLabeltUid(0);
await label.openLabelWithUid(LabelBeaconUid);
await toolbar.setFilter("view", "Cards");
const PhotoBeaconUid = await photo.getNthPhotoUid("all", 0);
await t.click(page.cardTitle.withAttribute("data-uid", PhotoBeaconUid));
const PhotoKeywords = await photoedit.keywords.value;
await t.expect(PhotoKeywords).contains("beacon");
await t
.click(photoedit.labelsTab)
.click(photoedit.removeLabel)
.typeText(photoedit.inputLabelName, "Test")
.click(Selector(photoedit.addLabel))
.click(photoedit.detailsTab);
const PhotoKeywordsAfterEdit = await photoedit.keywords.value;
await t
.expect(PhotoKeywordsAfterEdit)
.contains("test")
.expect(PhotoKeywordsAfterEdit)
.notContains("beacon");
await t.click(photoedit.dialogClose);
await menu.openPage("labels");
await toolbar.search("beacon");
await t.expect(Selector("div.no-results").visible).ok();
await toolbar.search("test");
const LabelTest = await label.getNthLabeltUid(0);
await label.openLabelWithUid(LabelTest);
await t
.click(page.cardTitle.withAttribute("data-uid", PhotoBeaconUid))
.click(photoedit.labelsTab)
.click(photoedit.deleteLabel)
.click(photoedit.activateLabel)
.click(photoedit.detailsTab);
const PhotoKeywordsAfterUndo = await photoedit.keywords.value;
await t
.expect(PhotoKeywordsAfterUndo)
.contains("beacon")
.expect(PhotoKeywordsAfterUndo)
.notContains("test");
await t.click(photoedit.dialogClose);
await menu.openPage("labels");
await toolbar.search("test");
await t.expect(Selector("div.no-results").visible).ok();
await toolbar.search("beacon");
await album.checkAlbumVisibility(LabelBeaconUid, true);
}
);
test.meta("testID", "labels-002")("Toggle between important and all labels", async (t) => {
await menu.openPage("labels");
const ImportantLabelsCount = await label.getLabelCount();
await toolbar.triggerToolbarAction("show-all");
const AllLabelsCount = await label.getLabelCount();
await t.expect(AllLabelsCount).gt(ImportantLabelsCount);
await toolbar.triggerToolbarAction("show-important");
const ImportantLabelsCount2 = await label.getLabelCount();
await t.expect(ImportantLabelsCount).eql(ImportantLabelsCount2);
});
test.meta("testID", "labels-003")("Rename Label", async (t) => {
await menu.openPage("labels");
await toolbar.search("zebra");
const LabelZebraUid = await label.getNthLabeltUid(0);
await label.openNthLabel(0);
const FirstPhotoZebraUid = await photo.getNthPhotoUid("all", 0);
await toolbar.setFilter("view", "Cards");
await t.click(page.cardTitle.withAttribute("data-uid", FirstPhotoZebraUid));
const FirstPhotoTitle = await photoedit.title.value;
const FirstPhotoKeywords = await photoedit.keywords.value;
await t.expect(FirstPhotoTitle).contains("Zebra").expect(FirstPhotoKeywords).contains("zebra");
await t
.click(photoedit.labelsTab)
.click(photoedit.openInlineEdit)
.typeText(photoedit.inputLabelRename, "Horse", { replace: true })
.pressKey("enter")
.click(photoedit.detailsTab);
const FirstPhotoTitleAfterEdit = await photoedit.title.value;
const FirstPhotoKeywordsAfterEdit = await photoedit.keywords.value;
await t
.expect(FirstPhotoTitleAfterEdit)
.contains("Horse")
.expect(FirstPhotoKeywordsAfterEdit)
.contains("horse")
.expect(FirstPhotoTitleAfterEdit)
.notContains("Zebra");
await t.click(photoedit.dialogClose);
await menu.openPage("labels");
await toolbar.search("horse");
await album.checkAlbumVisibility(LabelZebraUid, true);
await label.openLabelWithUid(LabelZebraUid);
await photo.checkPhotoVisibility(FirstPhotoZebraUid, true);
await t
.click(page.cardTitle.withAttribute("data-uid", FirstPhotoZebraUid))
.click(photoedit.labelsTab)
.click(photoedit.openInlineEdit)
.typeText(photoedit.inputLabelRename, "Zebra", { replace: true })
.pressKey("enter")
.click(photoedit.dialogClose);
await menu.openPage("labels");
await toolbar.search("horse");
await t.expect(Selector("div.no-results").visible).ok();
});
test.meta("testID", "labels-003")("Add label to album", async (t) => {
await menu.openPage("albums");
await toolbar.search("Christmas");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCount = await photo.getPhotoCount("all");
await menu.openPage("labels");
await toolbar.search("landscape");
const LabelLandscape = await label.getNthLabeltUid(1);
await label.openLabelWithUid(LabelLandscape);
const FirstPhotoLandscape = await photo.getNthPhotoUid("all", 0);
const SecondPhotoLandscape = await photo.getNthPhotoUid("all", 1);
const ThirdPhotoLandscape = await photo.getNthPhotoUid("all", 2);
const FourthPhotoLandscape = await photo.getNthPhotoUid("all", 3);
const FifthPhotoLandscape = await photo.getNthPhotoUid("all", 4);
const SixthPhotoLandscape = await photo.getNthPhotoUid("all", 5);
await menu.openPage("labels");
await label.triggerHoverAction("uid", LabelLandscape, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("album", "Christmas");
await menu.openPage("albums");
await album.openAlbumWithUid(AlbumUid);
const PhotoCountAfterAdd = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterAdd).eql(PhotoCount + 6);
await photo.triggerHoverAction("uid", FirstPhotoLandscape, "select");
await photo.triggerHoverAction("uid", SecondPhotoLandscape, "select");
await photo.triggerHoverAction("uid", ThirdPhotoLandscape, "select");
await photo.triggerHoverAction("uid", FourthPhotoLandscape, "select");
await photo.triggerHoverAction("uid", FifthPhotoLandscape, "select");
await photo.triggerHoverAction("uid", SixthPhotoLandscape, "select");
await contextmenu.triggerContextMenuAction("remove", "");
const PhotoCountAfterDelete = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterDelete).eql(PhotoCountAfterAdd - 6);
});
test.meta("testID", "labels-004")("Delete label", async (t) => {
await menu.openPage("labels");
await toolbar.search("dome");
const LabelDomeUid = await label.getNthLabeltUid(0);
await label.openLabelWithUid(LabelDomeUid);
const FirstPhotoDomeUid = await photo.getNthPhotoUid("all", 0);
await menu.openPage("labels");
await label.triggerHoverAction("uid", LabelDomeUid, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("delete", "");
await toolbar.search("dome");
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("browse");
await toolbar.setFilter("view", "Cards");
await t
.click(page.cardTitle.withAttribute("data-uid", FirstPhotoDomeUid))
.click(photoedit.labelsTab);
await t.expect(Selector("td").withText("No labels found").visible).ok();
await t.typeText(photoedit.inputLabelName, "Dome").click(photoedit.addLabel);
});

View file

@ -1,37 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "../testcafeconfig";
import Menu from "../../page-model/menu";
import Toolbar from "../../page-model/toolbar";
import Page from "../../page-model/page";
import Library from "../../page-model/library";
fixture`Import file from folder`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const page = new Page();
const library = new Library();
test.meta("testID", "library-import-001").meta({ type: "smoke" })(
"Import files from folder using copy",
async (t) => {
await menu.openPage("labels");
await toolbar.search("bakery");
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("library");
await t
.click(library.importTab)
.typeText(library.openImportFolderSelect, "/B", { replace: true })
.click(page.selectOption.nth(0))
.click(library.import)
//TODO replace wait
.wait(60000);
await menu.openPage("labels");
await toolbar.triggerToolbarAction("reload");
await toolbar.search("bakery");
await t.expect(Selector(".is-label").visible).ok();
}
);

View file

@ -1,132 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "../testcafeconfig";
import Menu from "../../page-model/menu";
import Toolbar from "../../page-model/toolbar";
import Photo from "../../page-model/photo";
import Page from "../../page-model/page";
import Library from "../../page-model/library";
import Album from "../../page-model/album";
fixture`Test index`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const photo = new Photo();
const page = new Page();
const library = new Library();
const album = new Album();
test.meta("testID", "library-index-001").meta({ type: "smoke" })(
"Index files from folder",
async (t) => {
await menu.openPage("labels");
await toolbar.search("cheetah");
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("moments");
const MomentCount = await album.getAlbumCount("all");
await menu.openPage("calendar");
if (t.browser.platform === "mobile") {
await t.navigateTo("/calendar?q=December%202013");
} else {
await toolbar.search("December 2013");
}
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("folders");
if (t.browser.platform === "mobile") {
await t.navigateTo("/folders?q=moment");
} else {
await toolbar.search("Moment");
}
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("states");
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/states?q=KwaZulu");
} else {
await toolbar.search("KwaZulu");
}
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("originals");
await t.click(Selector(".is-folder").withText("moment"));
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("monochrome");
const MonochromeCount = await photo.getPhotoCount("all");
await menu.openPage("library");
await t
.click(library.indexTab)
.click(library.indexFolderSelect)
.click(page.selectOption.withText("/moment"))
.click(library.index)
//TODO replace wait
.wait(50000);
await t.expect(Selector("span").withText("Done.").visible, { timeout: 60000 }).ok();
await menu.openPage("labels");
await toolbar.triggerToolbarAction("reload");
await toolbar.search("cheetah");
await t.expect(Selector(".is-label").visible).ok();
await menu.openPage("moments");
const MomentCountAfterIndex = await album.getAlbumCount("all");
await t
.expect(MomentCountAfterIndex)
.gt(MomentCount)
.click(Selector("a").withText("South Africa 2013"))
.expect(Selector(".is-photo").visible)
.ok();
await menu.openPage("calendar");
await toolbar.triggerToolbarAction("reload");
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/calendar?q=December%202013");
} else {
await toolbar.search("December 2013");
}
await t.expect(Selector(".is-album").visible).ok();
await menu.openPage("folders");
await toolbar.triggerToolbarAction("reload");
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/folders?q=moment");
} else {
await toolbar.search("Moment");
}
await t.expect(Selector(".is-album", { timeout: 15000 }).visible).ok();
await menu.openPage("states");
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/states?q=KwaZulu");
} else {
await toolbar.search("KwaZulu");
}
await t.expect(Selector(".is-album").visible).ok();
await menu.openPage("originals");
await t.expect(Selector(".is-folder").withText("moment").visible, { timeout: 60000 }).ok();
await menu.openPage("monochrome");
const MonochromeCountAfterIndex = await photo.getPhotoCount("all");
await t.expect(MonochromeCountAfterIndex).gt(MonochromeCount);
}
);

View file

@ -1,149 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test moments`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "moments-001")("Update moment details", async (t) => {
await menu.openPage("moments");
await toolbar.search("Nature");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("Nature");
await t.click(page.cardTitle.nth(0));
await t
.expect(albumdialog.title.value)
.eql("Nature & Landscape")
.expect(albumdialog.location.value)
.eql("")
.expect(albumdialog.description.value)
.eql("")
.expect(albumdialog.category.value)
.eql("");
await t
.typeText(albumdialog.title, "Winter", { replace: true })
.typeText(albumdialog.location, "Snow-Land", { replace: true })
.typeText(albumdialog.description, "We went to ski")
.typeText(albumdialog.category, "Mountains")
.pressKey("enter")
.click(albumdialog.dialogSave);
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("Winter")
.expect(page.cardDescription.nth(0).innerText)
.contains("We went to ski")
.expect(Selector("div.caption").nth(1).innerText)
.contains("Mountains")
.expect(Selector("div.caption").nth(2).innerText)
.contains("Snow-Land");
await album.openNthAlbum(0);
await t.expect(toolbar.toolbarTitle.innerText).contains("Winter");
await t.expect(toolbar.toolbarDescription.innerText).contains("We went to ski");
await menu.openPage("moments");
if (t.browser.platform === "mobile") {
await toolbar.search("category:Mountains");
} else {
await toolbar.setFilter("category", "Mountains");
}
await t.expect(page.cardTitle.nth(0).innerText).contains("Winter");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t
.expect(albumdialog.description.value)
.eql("We went to ski")
.expect(albumdialog.category.value)
.eql("Mountains")
.expect(albumdialog.location.value)
.eql("Snow-Land");
await t
.typeText(albumdialog.title, "Nature & Landscape", { replace: true })
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.location)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.dialogSave);
await menu.openPage("moments");
await toolbar.search("Nature");
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("Nature & Landscape")
.expect(page.cardDescription.innerText)
.notContains("We went to ski")
.expect(Selector("div.caption").nth(0).innerText)
.notContains("Snow-Land");
});
test.meta("testID", "moments-002")("Create, Edit, delete sharing link for moment", async (t) => {
await page.testCreateEditDeleteSharingLink("moments");
});
test.meta("testID", "moments-003")("Create/delete album-clone from moment", async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("moments");
const FirstMomentUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(FirstMomentUid);
const PhotoCountInMoment = await photo.getPhotoCount("all");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await menu.openPage("moments");
await album.selectAlbumFromUID(FirstMomentUid);
await contextmenu.triggerContextMenuAction("clone", "NotYetExistingAlbumForMoment");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbumForMoment");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountInAlbum = await photo.getPhotoCount("all");
await t.expect(PhotoCountInAlbum).eql(PhotoCountInMoment);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await menu.openPage("albums");
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
await menu.openPage("moments");
await album.openAlbumWithUid(FirstMomentUid);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
});

View file

@ -1,99 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Photo from "../page-model/photo";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Album from "../page-model/album";
import Originals from "../page-model/originals";
fixture`Test files`.page`${testcafeconfig.url}`;
const menu = new Menu();
const photo = new Photo();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const album = new Album();
const originals = new Originals();
test.meta("testID", "originals-001").meta({ type: "smoke" })("Navigate in originals", async (t) => {
await menu.openPage("originals");
await t.click(Selector("button").withText("Vacation"));
const FirstItemInVacationName = await Selector("div.result", { timeout: 15000 }).nth(0).innerText;
const KanadaFolderUid = await originals.getNthFolderUid(0);
const SecondItemInVacationName = await Selector("div.result").nth(1).innerText;
await t
.expect(FirstItemInVacationName)
.contains("Kanada")
.expect(SecondItemInVacationName)
.contains("Korsika");
await originals.openFolderWithUid(KanadaFolderUid);
const FirstItemInKanadaName = await Selector("div.result").nth(0).innerText;
const SecondItemInKanadaName = await Selector("div.result").nth(1).innerText;
await t
.expect(FirstItemInKanadaName)
.contains("BotanicalGarden")
.expect(SecondItemInKanadaName)
.contains("originals-001_2.jpg");
await t.click(Selector("button").withText("BotanicalGarden"));
const FirstItemInBotanicalGardenName = await Selector("div.result", { timeout: 15000 }).nth(0)
.innerText;
await t.expect(FirstItemInBotanicalGardenName).contains("originals-001_1.jpg");
await t.click(Selector('a[href="/library/files/Vacation"]'));
const FolderCount = await originals.getFolderCount();
await t.expect(FolderCount).eql(2);
});
test.meta("testID", "originals-002").meta({ type: "smoke" })(
"Add original files to album",
async (t) => {
await menu.openPage("albums");
await toolbar.search("KanadaVacation");
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("originals");
await t.click(Selector("button").withText("Vacation"));
const KanadaFolderUid = await originals.getNthFolderUid(0);
await originals.openFolderWithUid(KanadaFolderUid);
const FilesCountInKanada = await originals.getFileCount();
await t.click(Selector("button").withText("BotanicalGarden"));
const FilesCountInKanadaSubfolder = await originals.getFileCount();
await t.navigateTo("/library/files/Vacation");
await originals.triggerHoverAction("is-folder", "uid", KanadaFolderUid, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("album", "KanadaVacation");
await menu.openPage("albums");
await toolbar.search("KanadaVacation");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountAfterAdd = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterAdd).eql(FilesCountInKanada + FilesCountInKanadaSubfolder);
await menu.openPage("albums");
await album.triggerHoverAction("uid", AlbumUid, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("delete", "");
}
);
test.meta("testID", "originals-003")("Download available in originals", async (t) => {
await menu.openPage("originals");
const FirstFile = await originals.getNthFileUid(0);
await originals.triggerHoverAction("is-file", "uid", FirstFile, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.checkContextMenuActionAvailability("download", true);
await contextmenu.clearSelection();
const FirstFolder = await originals.getNthFolderUid(0);
await originals.triggerHoverAction("is-folder", "uid", FirstFolder, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.checkContextMenuActionAvailability("download", true);
await contextmenu.clearSelection();
});

View file

@ -1,280 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Subject from "../page-model/subject";
import PhotoEdit from "../page-model/photo-edit";
fixture`Test people`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const subject = new Subject();
const photoedit = new PhotoEdit();
test.meta("testID", "people-001").meta({ type: "smoke" })(
"Add name to new face and rename subject",
async (t) => {
await menu.openPage("people");
await t.click(subject.newTab);
await subject.triggerToolbarAction("reload", "");
const FaceCount = await subject.getFaceCount();
await t.click(subject.recognizedTab);
const SubjectCount = await subject.getSubjectCount();
await t.click(subject.newTab);
const FirstFaceID = await subject.getNthFaceUid(0);
await subject.openFaceWithUid(FirstFaceID);
const PhotosInFaceCount = await photo.getPhotoCount("all");
await menu.openPage("people");
await t.click(subject.newTab);
await subject.addNameToFace(FirstFaceID, "Jane Doe");
await subject.triggerToolbarAction("reload");
const FaceCountAfterAdd = await subject.getFaceCount();
await t.expect(FaceCountAfterAdd).eql(FaceCount - 1);
await t.click(subject.recognizedTab);
await subject.checkFaceVisibility(FirstFaceID, false);
await t.eval(() => location.reload());
await t.wait(6000);
const SubjectCountAfterAdd = await subject.getSubjectCount();
await t.expect(SubjectCountAfterAdd).eql(SubjectCount + 1);
await toolbar.search("Jane");
const JaneUID = await subject.getNthSubjectUid(0);
await t
.expect(Selector("a[data-uid=" + JaneUID + "] div.caption").innerText)
.contains(PhotosInFaceCount.toString());
await subject.openSubjectWithUid(JaneUID);
const PhotosInSubjectCount = await photo.getPhotoCount("all");
await t.expect(PhotosInFaceCount).eql(PhotosInSubjectCount);
await photo.triggerHoverAction("nth", 0, "select");
await photo.triggerHoverAction("nth", 1, "select");
await photo.triggerHoverAction("nth", 2, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
await t.expect(photoedit.inputName.nth(0).value).contains("Jane Doe");
await t.click(photoedit.dialogClose);
await menu.openPage("people");
await subject.renameSubject(JaneUID, "Max Mu");
await t
.expect(Selector("a[data-uid=" + JaneUID + "] div.v-card__title").innerText)
.contains("Max Mu");
await subject.openSubjectWithUid(JaneUID);
await t.eval(() => location.reload());
await contextmenu.checkContextMenuCount("3");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
await t.expect(photoedit.inputName.nth(0).value).contains("Max Mu");
await t.click(photoedit.dialogNext);
await t.expect(photoedit.inputName.nth(0).value).contains("Max Mu").click(photoedit.dialogNext);
await t
.expect(photoedit.inputName.nth(0).value)
.contains("Max Mu")
.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await toolbar.search("person:max-mu");
const PhotosInSubjectAfterRenameCount = await photo.getPhotoCount("all");
await t.expect(PhotosInSubjectAfterRenameCount).eql(PhotosInSubjectCount);
}
);
test.meta("testID", "people-002").meta({ type: "smoke" })(
"Add + Reject name on people tab",
async (t) => {
await menu.openPage("people");
await t.click(subject.newTab);
await subject.triggerToolbarAction("reload");
const FirstFaceID = await subject.getNthFaceUid(0);
await subject.addNameToFace(FirstFaceID, "Andrea Doe");
await t.click(subject.recognizedTab);
await toolbar.search("Andrea");
const AndreaUID = await subject.getNthSubjectUid(0);
await subject.openSubjectWithUid(AndreaUID);
await t.eval(() => location.reload());
await t.wait(5000);
const PhotosInAndreaCount = await photo.getPhotoCount("all");
await photo.triggerHoverAction("nth", 1, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t
.click(photoedit.peopleTab)
.expect(photoedit.inputName.nth(0).value)
.eql("Andrea Doe")
.click(photoedit.rejectName.nth(0));
await t.expect(photoedit.inputName.nth(0).value).eql("");
await t
.typeText(photoedit.inputName.nth(0), "Nicole", { replace: true })
.pressKey("enter")
.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await t.eval(() => location.reload());
await t.wait(5000);
const PhotosInAndreaAfterRejectCount = await photo.getPhotoCount("all");
const Diff = PhotosInAndreaCount - PhotosInAndreaAfterRejectCount;
await toolbar.search("person:nicole");
await t.eval(() => location.reload());
await t.wait(5000);
const PhotosInNicoleCount = await photo.getPhotoCount("all");
await t.expect(Diff).gte(PhotosInNicoleCount);
}
);
test.meta("testID", "people-003")("Test mark subject as favorite", async (t) => {
await menu.openPage("people");
const FirstSubjectUid = await subject.getNthSubjectUid(0);
const SecondSubjectUid = await subject.getNthSubjectUid(1);
await subject.triggerHoverAction("uid", SecondSubjectUid, "favorite");
await subject.triggerToolbarAction("reload");
const FirstSubjectUidAfterFavorite = await subject.getNthSubjectUid(0);
await t.expect(FirstSubjectUid).notEql(FirstSubjectUidAfterFavorite);
await t.expect(SecondSubjectUid).eql(FirstSubjectUidAfterFavorite);
await subject.checkHoverActionState("uid", SecondSubjectUid, "favorite", true);
await subject.triggerHoverAction("uid", SecondSubjectUid, "favorite");
await subject.checkHoverActionState("uid", SecondSubjectUid, "favorite", false);
});
test.meta("testID", "people-004")("Test new face autocomplete", async (t) => {
await menu.openPage("people");
await t.click(subject.newTab);
await subject.triggerToolbarAction("reload");
const FirstFaceID = await subject.getNthFaceUid(0);
await t
.expect(Selector("div.menuable__content__active").nth(0).visible)
.notOk()
.click(Selector("div[data-id=" + FirstFaceID + "] div.input-name input"))
.typeText(Selector("div[data-id=" + FirstFaceID + "] div.input-name input"), "Otto");
await t
.expect(Selector("div.menuable__content__active").nth(0).withText("Otto Visible").visible)
.ok();
});
test.meta("testID", "people-005")("Remove face", async (t) => {
await toolbar.search("face:new");
const FirstPhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
const MarkerCount = await subject.getMarkerCount();
if ((await photoedit.inputName.nth(0).value) == "") {
await t
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.notOk()
.expect(photoedit.inputName.nth(0).value)
.eql("")
.click(photoedit.removeMarker)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.ok()
.click(photoedit.undoRemoveMarker);
} else if ((await photoedit.inputName.nth(0).value) != "") {
await t
.expect(photoedit.inputName.nth(1).value)
.eql("")
.click(photoedit.removeMarker)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.ok()
.click(photoedit.undoRemoveMarker);
}
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await t.eval(() => location.reload());
await t.wait(5000);
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
if ((await photoedit.inputName.nth(0).value) == "") {
await t
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.notOk()
.expect(photoedit.inputName.nth(0).value)
.eql("")
.click(photoedit.removeMarker)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.ok();
} else if ((await photoedit.inputName.nth(0).value) != "") {
await t
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.notOk()
.expect(photoedit.inputName.nth(1).value)
.eql("")
.click(photoedit.removeMarker)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.ok();
}
await t.click(photoedit.dialogClose);
await t.eval(() => location.reload());
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
const MarkerCountAfterRemove = await subject.getMarkerCount();
await t.expect(MarkerCountAfterRemove).eql(MarkerCount - 1);
});
test.meta("testID", "people-006")("Hide face", async (t) => {
await menu.openPage("people");
await t.click(subject.newTab);
await subject.triggerToolbarAction("reload");
const FirstFaceID = await subject.getNthFaceUid(0);
await subject.checkFaceVisibility(FirstFaceID, true);
await subject.triggerHoverAction("id", FirstFaceID, "hidden");
await t.eval(() => location.reload());
await t.wait(5000);
await subject.checkFaceVisibility(FirstFaceID, false);
await subject.triggerToolbarAction("show-hidden");
await t.eval(() => location.reload());
await t.wait(6000);
await subject.checkFaceVisibility(FirstFaceID, true);
await subject.triggerHoverAction("id", FirstFaceID, "hidden");
await subject.triggerToolbarAction("exclude-hidden");
await t.eval(() => location.reload());
await t.wait(6000);
await subject.checkFaceVisibility(FirstFaceID, true);
});
test.meta("testID", "people-007")("Hide person", async (t) => {
await menu.openPage("people");
await t.click(subject.recognizedTab);
const FirstPersonUid = await subject.getNthSubjectUid(0);
await subject.checkSubjectVisibility("uid", FirstPersonUid, true);
await subject.triggerHoverAction("uid", FirstPersonUid, "hidden");
await t.eval(() => location.reload());
await t.wait(6000);
await subject.checkSubjectVisibility("uid", FirstPersonUid, false);
await subject.triggerToolbarAction("show-hidden");
await t.eval(() => location.reload());
await t.wait(6000);
await subject.checkSubjectVisibility("uid", FirstPersonUid, true);
await subject.triggerHoverAction("uid", FirstPersonUid, "hidden");
await subject.triggerToolbarAction("exclude-hidden");
await t.eval(() => location.reload());
await t.wait(5000);
await subject.checkSubjectVisibility("uid", FirstPersonUid, true);
});

View file

@ -1,494 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import PhotoEdit from "../page-model/photo-edit";
import Album from "../page-model/album";
import Subject from "../page-model/subject";
import Label from "../page-model/label";
fixture`Test photos archive and private functionalities`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const photoedit = new PhotoEdit();
const album = new Album();
const label = new Label();
const subject = new Subject();
test.meta("testID", "photos-archive-private-001").meta({ type: "smoke" })(
"Private/unprivate photo/video using clipboard and list",
async (t) => {
await toolbar.setFilter("view", "Mosaic");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
const ThirdPhotoUid = await photo.getNthPhotoUid("image", 2);
const FirstVideoUid = await photo.getNthPhotoUid("video", 0);
const SecondVideoUid = await photo.getNthPhotoUid("video", 1);
const ThirdVideoUid = await photo.getNthPhotoUid("video", 2);
await menu.openPage("private");
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(ThirdPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(SecondVideoUid, false);
await photo.checkPhotoVisibility(ThirdVideoUid, false);
await menu.openPage("browse");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("private", "");
await toolbar.setFilter("view", "List");
await photo.triggerListViewActions("uid", SecondPhotoUid, "private");
await photo.triggerListViewActions("uid", SecondVideoUid, "private");
await toolbar.setFilter("view", "Cards");
await photo.triggerHoverAction("uid", ThirdPhotoUid, "select");
await photo.triggerHoverAction("uid", ThirdVideoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOn("private");
await t.click(photoedit.dialogNext);
await photoedit.turnSwitchOn("private");
await t.click(photoedit.dialogClose);
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(ThirdPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(SecondVideoUid, false);
await photo.checkPhotoVisibility(ThirdVideoUid, false);
await menu.openPage("video");
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(SecondVideoUid, false);
await photo.checkPhotoVisibility(ThirdVideoUid, false);
await menu.openPage("private");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await photo.checkPhotoVisibility(ThirdPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.checkPhotoVisibility(SecondVideoUid, true);
await photo.checkPhotoVisibility(ThirdVideoUid, true);
await contextmenu.clearSelection();
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await photo.triggerHoverAction("uid", ThirdPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await photo.triggerHoverAction("uid", SecondVideoUid, "select");
await photo.triggerHoverAction("uid", ThirdVideoUid, "select");
await contextmenu.checkContextMenuCount("6");
await contextmenu.triggerContextMenuAction("private", "");
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(ThirdPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(SecondVideoUid, false);
await photo.checkPhotoVisibility(ThirdVideoUid, false);
await menu.openPage("browse");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await photo.checkPhotoVisibility(ThirdPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.checkPhotoVisibility(SecondVideoUid, true);
await photo.checkPhotoVisibility(ThirdVideoUid, true);
}
);
test.meta("testID", "photos-archive-private-002").meta({ type: "smoke" })(
"Archive/restore video, photos, private photos and review photos using clipboard",
async (t) => {
await toolbar.setFilter("view", "Mosaic");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
const FirstVideoUid = await photo.getNthPhotoUid("video", 0);
await menu.openPage("private");
const FirstPrivatePhotoUid = await photo.getNthPhotoUid("all", 0);
await menu.openPage("review");
const FirstReviewPhotoUid = await photo.getNthPhotoUid("all", 0);
await menu.openPage("archive");
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(FirstPrivatePhotoUid, false);
await photo.checkPhotoVisibility(FirstReviewPhotoUid, false);
await menu.openPage("browse");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("archive", "");
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(FirstPrivatePhotoUid, false);
await photo.checkPhotoVisibility(FirstReviewPhotoUid, false);
await menu.openPage("review");
await photo.triggerHoverAction("uid", FirstReviewPhotoUid, "select");
await contextmenu.triggerContextMenuAction("archive", "");
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstReviewPhotoUid, false);
await menu.openPage("private");
await photo.triggerHoverAction("uid", FirstPrivatePhotoUid, "select");
await contextmenu.triggerContextMenuAction("archive", "");
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstPrivatePhotoUid, false);
await menu.openPage("archive");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.checkPhotoVisibility(FirstPrivatePhotoUid, true);
await photo.checkPhotoVisibility(FirstReviewPhotoUid, true);
await photo.triggerHoverAction("uid", FirstPrivatePhotoUid, "select");
await photo.triggerHoverAction("uid", FirstReviewPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("restore", "");
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(FirstPrivatePhotoUid, false);
await photo.checkPhotoVisibility(FirstReviewPhotoUid, false);
await menu.openPage("browse");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.checkPhotoVisibility(FirstPrivatePhotoUid, false);
await photo.checkPhotoVisibility(FirstReviewPhotoUid, false);
await menu.openPage("private");
await photo.checkPhotoVisibility(FirstPrivatePhotoUid, true);
await menu.openPage("review");
await photo.checkPhotoVisibility(FirstReviewPhotoUid, true);
}
);
test.meta("testID", "photos-archive-private-003")(
"Check that archived files are not shown in monochrome/panoramas/stacks/scans/review/albums/favorites/private/videos/calendar/moments/states/labels/folders/originals",
async (t) => {
await menu.openPage("archive");
const InitialPhotoCountInArchive = await photo.getPhotoCount("all");
await menu.openPage("monochrome");
const MonochromePhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", MonochromePhoto, "select");
await menu.openPage("panoramas");
const PanoramaPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PanoramaPhoto, "select");
await menu.openPage("stacks");
const StackedPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", StackedPhoto, "select");
await menu.openPage("scans");
const ScannedPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", ScannedPhoto, "select");
await menu.openPage("review");
const ReviewPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", ReviewPhoto, "select");
await menu.openPage("favorites");
const FavoritesPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", FavoritesPhoto, "select");
await menu.openPage("private");
const PrivatePhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PrivatePhoto, "select");
await menu.openPage("video");
const Video = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", Video, "select");
await menu.openPage("calendar");
await toolbar.search("January 2017");
await album.openNthAlbum(0);
const CalendarPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", CalendarPhoto, "select");
await menu.openPage("moments");
await album.openNthAlbum(0);
const MomentPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", MomentPhoto, "select");
await menu.openPage("states");
await toolbar.search("Western Cape");
await album.openNthAlbum(0);
const StatesPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", StatesPhoto, "select");
await menu.openPage("labels");
await toolbar.search("Seashore");
await label.openNthLabel(0);
const LabelPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", LabelPhoto, "select");
await menu.openPage("people");
await subject.openNthSubject(0);
const SubjectPhoto = await photo.getNthPhotoUid("all", 1);
await photo.triggerHoverAction("uid", SubjectPhoto, "select");
await menu.openPage("folders");
await toolbar.search("archive");
await album.openNthAlbum(0);
const FolderPhoto = await photo.getNthPhotoUid("all", 1);
await photo.triggerHoverAction("uid", FolderPhoto, "select");
await contextmenu.checkContextMenuCount("14");
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await toolbar.triggerToolbarAction("reload");
const PhotoCountInArchiveAfterArchive = await photo.getPhotoCount("all");
await t.expect(PhotoCountInArchiveAfterArchive).eql(InitialPhotoCountInArchive + 14);
await menu.openPage("monochrome");
await photo.checkPhotoVisibility(MonochromePhoto, false);
await menu.openPage("panoramas");
await photo.checkPhotoVisibility(PanoramaPhoto, false);
await menu.openPage("stacks");
await photo.checkPhotoVisibility(StackedPhoto, false);
await menu.openPage("scans");
await photo.checkPhotoVisibility(ScannedPhoto, false);
await menu.openPage("review");
await photo.checkPhotoVisibility(ReviewPhoto, false);
await menu.openPage("favorites");
await photo.checkPhotoVisibility(FavoritesPhoto, false);
await menu.openPage("private");
await photo.checkPhotoVisibility(PrivatePhoto, false);
await menu.openPage("video");
await photo.checkPhotoVisibility(Video, false);
await t.navigateTo("/calendar/aqmxlr71p6zo22dk/january-2017");
await photo.checkPhotoVisibility(CalendarPhoto, false);
await menu.openPage("moments");
await album.openNthAlbum(0);
await photo.checkPhotoVisibility(MomentPhoto, false);
await t.navigateTo("/states/aqmxlr71tebcohrw/western-cape-south-africa");
await photo.checkPhotoVisibility(StatesPhoto, false);
await t.navigateTo("/all?q=label%3Aseashore");
await photo.checkPhotoVisibility(LabelPhoto, false);
await menu.openPage("people");
await subject.openNthSubject(0);
await photo.checkPhotoVisibility(SubjectPhoto, false);
await t.navigateTo("/folders/aqnah1321mgkt1w2/archive");
await photo.checkPhotoVisibility(FolderPhoto, false);
await menu.openPage("archive");
await photo.triggerHoverAction("uid", MonochromePhoto, "select");
await photo.triggerHoverAction("uid", PanoramaPhoto, "select");
await photo.triggerHoverAction("uid", StackedPhoto, "select");
await photo.triggerHoverAction("uid", ScannedPhoto, "select");
await photo.triggerHoverAction("uid", FavoritesPhoto, "select");
await photo.triggerHoverAction("uid", ReviewPhoto, "select");
await photo.triggerHoverAction("uid", PrivatePhoto, "select");
await photo.triggerHoverAction("uid", Video, "select");
await photo.triggerHoverAction("uid", CalendarPhoto, "select");
await photo.triggerHoverAction("uid", MomentPhoto, "select");
await photo.triggerHoverAction("uid", StatesPhoto, "select");
await photo.triggerHoverAction("uid", LabelPhoto, "select");
await photo.triggerHoverAction("uid", SubjectPhoto, "select");
await photo.triggerHoverAction("uid", FolderPhoto, "select");
await contextmenu.checkContextMenuCount("14");
await contextmenu.triggerContextMenuAction("restore", "");
const PhotoCountInArchiveAfterRestore = await photo.getPhotoCount("all");
await t.expect(PhotoCountInArchiveAfterRestore).eql(InitialPhotoCountInArchive);
await menu.openPage("private");
await photo.checkPhotoVisibility(PrivatePhoto, true);
}
);
test.meta("testID", "photos-archive-private-004").meta({ type: "smoke" })(
"Check that private files are not shown in monochrome/panoramas/stacks/scans/review/albums/favorites/archive/videos/calendar/moments/states/labels/folders/originals",
async (t) => {
await menu.openPage("private");
const InitialPhotoCountInPrivate = await photo.getPhotoCount("all");
await menu.openPage("monochrome");
const MonochromePhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", MonochromePhoto, "select");
await menu.openPage("panoramas");
const PanoramaPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PanoramaPhoto, "select");
await menu.openPage("stacks");
const StackedPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", StackedPhoto, "select");
await menu.openPage("scans");
const ScannedPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", ScannedPhoto, "select");
await menu.openPage("review");
const ReviewPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", ReviewPhoto, "select");
await menu.openPage("favorites");
const FavoritesPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", FavoritesPhoto, "select");
await menu.openPage("video");
const Video = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", Video, "select");
await menu.openPage("albums");
await toolbar.search("Holiday");
await album.openNthAlbum(0);
const AlbumPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", AlbumPhoto, "select");
await menu.openPage("calendar");
await toolbar.search("January 2017");
await album.openNthAlbum(0);
const CalendarPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", CalendarPhoto, "select");
await menu.openPage("moments");
await album.openNthAlbum(0);
const MomentPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", MomentPhoto, "select");
await menu.openPage("states");
await toolbar.search("Western Cape");
await album.openNthAlbum(0);
const StatesPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", StatesPhoto, "select");
await menu.openPage("labels");
await toolbar.search("Seashore");
await label.openNthLabel(0);
const LabelPhoto = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", LabelPhoto, "select");
await menu.openPage("people");
await subject.openNthSubject(0);
const SubjectPhoto = await photo.getNthPhotoUid("all", 1);
await photo.triggerHoverAction("uid", SubjectPhoto, "select");
await menu.openPage("folders");
await toolbar.search("archive");
await album.openNthAlbum(0);
const FolderPhoto = await photo.getNthPhotoUid("all", 1);
await photo.triggerHoverAction("uid", FolderPhoto, "select");
await contextmenu.checkContextMenuCount("14");
await contextmenu.triggerContextMenuAction("private", "");
await menu.openPage("private");
await toolbar.triggerToolbarAction("reload");
const PhotoCountInPrivateAfterArchive = await photo.getPhotoCount("all");
await t.expect(PhotoCountInPrivateAfterArchive).eql(InitialPhotoCountInPrivate + 14);
await menu.openPage("monochrome");
await photo.checkPhotoVisibility(MonochromePhoto, false);
await menu.openPage("panoramas");
await photo.checkPhotoVisibility(PanoramaPhoto, false);
await menu.openPage("stacks");
await photo.checkPhotoVisibility(StackedPhoto, false);
await menu.openPage("scans");
await photo.checkPhotoVisibility(ScannedPhoto, false);
await menu.openPage("review");
await photo.checkPhotoVisibility(ReviewPhoto, false);
await menu.openPage("favorites");
await photo.checkPhotoVisibility(FavoritesPhoto, false);
await menu.openPage("video");
await photo.checkPhotoVisibility(Video, false);
await t.navigateTo("/albums?q=Holiday");
await album.openNthAlbum(0);
await photo.checkPhotoVisibility(AlbumPhoto, true);
await t.navigateTo("/calendar/aqmxlr71p6zo22dk/january-2017");
await photo.checkPhotoVisibility(CalendarPhoto, false);
await menu.openPage("moments");
await album.openNthAlbum(0);
await photo.checkPhotoVisibility(MomentPhoto, false);
await t.navigateTo("/states/aqmxlr71tebcohrw/western-cape-south-africa");
await photo.checkPhotoVisibility(StatesPhoto, false);
await t.navigateTo("/all?q=label%3Aseashore");
await photo.checkPhotoVisibility(LabelPhoto, false);
await menu.openPage("people");
await subject.openNthSubject(0);
await photo.checkPhotoVisibility(SubjectPhoto, false);
await t.navigateTo("/folders/aqnah1321mgkt1w2/archive");
await photo.checkPhotoVisibility(FolderPhoto, false);
await menu.openPage("private");
await photo.triggerHoverAction("uid", MonochromePhoto, "select");
await photo.triggerHoverAction("uid", PanoramaPhoto, "select");
await photo.triggerHoverAction("uid", StackedPhoto, "select");
await photo.triggerHoverAction("uid", ScannedPhoto, "select");
await photo.triggerHoverAction("uid", FavoritesPhoto, "select");
await photo.triggerHoverAction("uid", ReviewPhoto, "select");
await photo.triggerHoverAction("uid", Video, "select");
await photo.triggerHoverAction("uid", CalendarPhoto, "select");
await photo.triggerHoverAction("uid", AlbumPhoto, "select");
await photo.triggerHoverAction("uid", MomentPhoto, "select");
await photo.triggerHoverAction("uid", StatesPhoto, "select");
await photo.triggerHoverAction("uid", LabelPhoto, "select");
await photo.triggerHoverAction("uid", SubjectPhoto, "select");
await photo.triggerHoverAction("uid", FolderPhoto, "select");
await contextmenu.checkContextMenuCount("14");
await contextmenu.triggerContextMenuAction("private", "");
await toolbar.triggerToolbarAction("reload");
const PhotoCountInPrivateAfterRestore = await photo.getPhotoCount("all");
await t.expect(PhotoCountInPrivateAfterRestore).eql(InitialPhotoCountInPrivate);
await menu.openPage("monochrome");
await photo.checkPhotoVisibility(MonochromePhoto, true);
await menu.openPage("panoramas");
await photo.checkPhotoVisibility(PanoramaPhoto, true);
await menu.openPage("stacks");
await photo.checkPhotoVisibility(StackedPhoto, true);
await menu.openPage("scans");
await photo.checkPhotoVisibility(ScannedPhoto, true);
await menu.openPage("review");
await photo.checkPhotoVisibility(ReviewPhoto, true);
await menu.openPage("favorites");
await photo.checkPhotoVisibility(FavoritesPhoto, true);
await menu.openPage("video");
await photo.checkPhotoVisibility(Video, true);
await t.navigateTo("/albums?q=Holiday");
await album.openNthAlbum(0);
await photo.checkPhotoVisibility(AlbumPhoto, true);
await t.navigateTo("/calendar/aqmxlr71p6zo22dk/january-2017");
await photo.checkPhotoVisibility(CalendarPhoto, true);
await menu.openPage("moments");
await album.openNthAlbum(0);
await photo.checkPhotoVisibility(MomentPhoto, true);
await t.navigateTo("/states/aqmxlr71tebcohrw/western-cape-south-africa");
await photo.checkPhotoVisibility(StatesPhoto, true);
await t.navigateTo("/all?q=label%3Aseashore");
await photo.checkPhotoVisibility(LabelPhoto, true);
await menu.openPage("people");
await subject.openNthSubject(0);
await photo.checkPhotoVisibility(SubjectPhoto, true);
await t.navigateTo("/folders/aqnah1321mgkt1w2/archive");
await photo.checkPhotoVisibility(FolderPhoto, true);
}
);

View file

@ -1,119 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import { RequestLogger } from "testcafe";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import PhotoViewer from "../page-model/photoviewer";
import Page from "../page-model/page";
const logger = RequestLogger(/http:\/\/localhost:2343\/api\/v1\/*/, {
logResponseHeaders: true,
logResponseBody: true,
});
fixture`Test photos download`.page`${testcafeconfig.url}`
.requestHooks(logger)
.skip("Does not work in container and we have no content-disposition header anymore");
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const photoviewer = new PhotoViewer();
const page = new Page();
test.meta("testID", "photos-download-001").meta({ type: "smoke" })(
"Test download jpg file from context menu and fullscreen",
async (t) => {
await toolbar.search("name:monochrome-2.jpg");
const PhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PhotoUid, "select");
await logger.clear();
await contextmenu.triggerContextMenuAction("download", "");
const requestInfo = await logger.requests[1].response;
console.log(requestInfo);
const requestInfo0 = await logger.requests[0].response;
console.log(requestInfo0);
await page.validateDownloadRequest(requestInfo, "monochrome-2", ".jpg");
await logger.clear();
await contextmenu.clearSelection();
await toolbar.search("name:IMG_20200711_174006.jpg");
const SecondPhotoUid = await photo.getNthPhotoUid("all", 0);
await t.click(Selector("div").withAttribute("data-uid", SecondPhotoUid));
await photoviewer.openPhotoViewer("uid", SecondPhotoUid);
await logger.clear();
await photoviewer.triggerPhotoViewerAction("download");
await logger.clear();
await photoviewer.triggerPhotoViewerAction("close");
}
);
test.meta("testID", "photos-download-002").meta({ type: "smoke" })(
"Test download video from context menu",
async (t) => {
await toolbar.search("name:Mohn.mp4");
const PhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PhotoUid, "select");
await logger.clear();
await contextmenu.triggerContextMenuAction("download", "");
const requestInfo = await logger.requests[0].response;
console.log(requestInfo);
const requestInfo2 = await logger.requests[1].response;
await page.validateDownloadRequest(requestInfo, "Mohn", ".mp4.jpg");
await page.validateDownloadRequest(requestInfo2, "Mohn", ".mp4");
await logger.clear();
await contextmenu.clearSelection();
}
);
test.meta("testID", "photos-download-003")(
"Test download multiple jpg files from context menu",
async (t) => {
await toolbar.search("name:panorama_2.jpg");
const PhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PhotoUid, "select");
await toolbar.search("name:IMG_6478.JPG");
const SecondPhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await logger.clear();
await contextmenu.triggerContextMenuAction("download", "");
const requestInfo = await logger.requests[1].response;
console.log(requestInfo);
await page.validateDownloadRequest(requestInfo, "photoprism-download", ".zip");
await logger.clear();
await contextmenu.clearSelection();
}
);
//TODO Check RAW files as well
test.meta("testID", "photos-download-004")(
"Test raw file from context menu and fullscreen mode",
async (t) => {
await toolbar.search("name:elephantRAW");
const PhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PhotoUid, "select");
await logger.clear();
await contextmenu.triggerContextMenuAction("download", "");
const requestInfo = await logger.requests[1].response;
await page.validateDownloadRequest(requestInfo, "elephantRAW", ".JPG");
await logger.clear();
await contextmenu.clearSelection();
await t.click(Selector("div").withAttribute("data-uid", Photo));
await t.expect(Selector("#photo-viewer").visible).ok().hover(Selector(".action-download"));
await logger.clear();
await t.click(Selector(".action-download"));
const requestInfo3 = await logger.requests[1].response;
//const requestInfo4 = await logger.requests[2].response;
await page.validateDownloadRequest(requestInfo3, "elephantRAW", ".JPG");
//await page.validateDownloadRequest(requestInfo4, "elephantRAW", ".mp4");
await logger.clear();
}
);

View file

@ -1,266 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import fs from "fs";
import Menu from "../page-model/menu";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import PhotoEdit from "../page-model/photo-edit";
import Originals from "../page-model/originals";
import Album from "../page-model/album";
import Library from "../page-model/library";
fixture`Test photos upload and delete`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const photoedit = new PhotoEdit();
const originals = new Originals();
const library = new Library();
test.meta("testID", "photos-upload-delete-001").meta({ type: "smoke" })(
"Upload + Delete jpg/json",
async (t) => {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/10")).notOk();
await toolbar.search("digikam");
const PhotoCount = await photo.getPhotoCount("all");
await t.expect(PhotoCount).eql(0);
await toolbar.triggerToolbarAction("upload");
await t
.setFilesToUpload(Selector(".input-upload"), [
"./upload-files/digikam.jpg",
"./upload-files/digikam.json",
])
.wait(15000);
const PhotoCountAfterUpload = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterUpload).eql(1);
const UploadedPhoto = await photo.getNthPhotoUid("all", 0);
await t.navigateTo("/library/files/2020/10");
const FileCount = await originals.getFileCount();
await t.expect(FileCount).eql(2);
await menu.openPage("browse");
await toolbar.search("digikam");
await photo.triggerHoverAction("uid", UploadedPhoto, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.filesTab);
await t
.expect(Selector("div.caption").withText(".json").visible)
.ok()
.expect(Selector("div.caption").withText(".jpg").visible)
.ok();
await t.click(photoedit.dialogClose);
if (t.browser.platform !== "mobile") {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/10")).ok();
const originalsLength = fs.readdirSync("../storage/acceptance/originals/2020/10").length;
await t.expect(originalsLength).eql(2);
}
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await photo.triggerHoverAction("uid", UploadedPhoto, "select");
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("browse");
await toolbar.search("digikam");
await photo.checkPhotoVisibility(UploadedPhoto, false);
await t.navigateTo("/library/files/2020/10");
const FileCountAfterDelete = await originals.getFileCount();
await t.expect(FileCountAfterDelete).eql(0);
if (t.browser.platform !== "mobile") {
const originalsLengthAfterDelete = fs.readdirSync(
"../storage/acceptance/originals/2020/10"
).length;
await t.expect(originalsLengthAfterDelete).eql(0);
}
}
);
test.meta("testID", "photos-upload-delete-002")("Upload + Delete video", async (t) => {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/06")).notOk();
await toolbar.search("korn");
const PhotoCount = await photo.getPhotoCount("all");
await t.expect(PhotoCount).eql(0);
await toolbar.triggerToolbarAction("upload");
await t.setFilesToUpload(Selector(".input-upload"), ["./upload-files/korn.mp4"]).wait(15000);
const PhotoCountAfterUpload = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterUpload).eql(1);
const UploadedPhoto = await photo.getNthPhotoUid("all", 0);
await t.navigateTo("/library/files/2020/06");
const FileCount = await originals.getFileCount();
await t.expect(FileCount).eql(1);
await menu.openPage("browse");
await toolbar.search("korn");
await photo.triggerHoverAction("uid", UploadedPhoto, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.filesTab);
await t
.expect(Selector("div.caption").withText(".mp4").visible)
.ok()
.expect(Selector("div.caption").withText(".jpg").visible)
.ok();
await t.click(photoedit.dialogClose);
if (t.browser.platform !== "mobile") {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/06")).ok();
const originalsLength = fs.readdirSync("../storage/acceptance/originals/2020/06").length;
await t.expect(originalsLength).eql(1);
const sidecarLength = fs.readdirSync("../storage/acceptance/originals/2020/06").length;
await t.expect(sidecarLength).eql(1);
}
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await photo.triggerHoverAction("uid", UploadedPhoto, "select");
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("browse");
await toolbar.search("korn");
await photo.checkPhotoVisibility(UploadedPhoto, false);
await t.navigateTo("/library/files/2020/06");
const FileCountAfterDelete = await originals.getFileCount();
await t.expect(FileCountAfterDelete).eql(0);
if (t.browser.platform !== "mobile") {
const originalsLengthAfterDelete = fs.readdirSync(
"../storage/acceptance/originals/2020/06"
).length;
await t.expect(originalsLengthAfterDelete).eql(0);
const sidecarLengthAfterDelete = fs.readdirSync(
"../storage/acceptance/originals/2020/06"
).length;
await t.expect(sidecarLengthAfterDelete).eql(0);
}
});
test.meta("testID", "photos-upload-delete-003")("Upload to existing Album + Delete", async (t) => {
await menu.openPage("albums");
await toolbar.search("Christmas");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCount = await photo.getPhotoCount("all");
await toolbar.triggerToolbarAction("upload");
await t
.click(Selector(".input-albums"))
.click(page.selectOption.withText("Christmas"))
.setFilesToUpload(Selector(".input-upload"), ["./upload-files/ladybug.jpg"])
.wait(15000);
const PhotoCountAfterUpload = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterUpload).eql(PhotoCount + 1);
await menu.openPage("browse");
await toolbar.search("ladybug");
const UploadedPhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", UploadedPhotoUid, "select");
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await photo.triggerHoverAction("uid", UploadedPhotoUid, "select");
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("browse");
await toolbar.search("ladybug");
await photo.checkPhotoVisibility(UploadedPhotoUid, false);
await menu.openPage("albums");
await album.openAlbumWithUid(AlbumUid);
await photo.checkPhotoVisibility(UploadedPhotoUid, false);
const PhotoCountAfterDelete = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterDelete).eql(PhotoCount);
});
test.meta("testID", "photos-upload-delete-004")("Upload jpg to new Album + Delete", async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await toolbar.triggerToolbarAction("upload");
await t
.click(Selector(".input-albums"))
.typeText(Selector(".input-albums input"), "NewCreatedAlbum")
.pressKey("enter")
.setFilesToUpload(Selector(".input-upload"), ["./upload-files/digikam.jpg"])
.wait(15000);
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
const AlbumCountAfterUpload = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterUpload).eql(AlbumCount + 1);
await toolbar.search("NewCreatedAlbum");
await album.openNthAlbum(0);
const PhotoCount = await photo.getPhotoCount("all");
await t.expect(PhotoCount).eql(1);
await menu.openPage("browse");
await toolbar.search("digikam");
const UploadedPhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", UploadedPhotoUid, "select");
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await photo.triggerHoverAction("uid", UploadedPhotoUid, "select");
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("browse");
await toolbar.search("digikam");
await photo.checkPhotoVisibility(UploadedPhotoUid, false);
await menu.openPage("albums");
await toolbar.search("NewCreatedAlbum");
await album.openNthAlbum(0);
await photo.checkPhotoVisibility(UploadedPhotoUid, false);
const PhotoCountAfterDelete = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterDelete).eql(0);
await menu.openPage("albums");
await toolbar.search("NewCreatedAlbum");
await album.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("delete", "");
});
test.meta("testID", "photos-upload-delete-005").meta({ type: "smoke" })(
"Try uploading nsfw file",
async (t) => {
await toolbar.triggerToolbarAction("upload");
await t
.setFilesToUpload(Selector(".input-upload"), ["./upload-files/hentai_2.jpg"])
.wait(15000);
await menu.openPage("library");
await t.click(library.logsTab);
await t.expect(Selector("p").withText("hentai_2.jpg might be offensive").visible).ok();
}
);
test.meta("testID", "photos-upload-delete-006").meta({ type: "smoke" })(
"Try uploading txt file",
async (t) => {
await toolbar.triggerToolbarAction("upload");
await t.setFilesToUpload(Selector(".input-upload"), ["./upload-files/foo.txt"]).wait(15000);
await menu.openPage("library");
await t.click(library.logsTab);
await t.expect(Selector("p").withText(" foo.txt is not a jpeg file").visible).ok();
}
);

View file

@ -1,377 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import { ClientFunction } from "testcafe";
import Menu from "../page-model/menu";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import PhotoViewer from "../page-model/photoviewer";
import Page from "../page-model/page";
import PhotoEdit from "../page-model/photo-edit";
const scroll = ClientFunction((x, y) => window.scrollTo(x, y));
const getcurrentPosition = ClientFunction(() => window.pageYOffset);
fixture`Test photos`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const photoviewer = new PhotoViewer();
const page = new Page();
const photoedit = new PhotoEdit();
test.meta("testID", "photos-001")("Scroll to top", async (t) => {
await toolbar.setFilter("view", "Cards");
await t
.expect(Selector("button.is-photo-scroll-top").exists)
.notOk()
.expect(getcurrentPosition())
.eql(0)
.expect(Selector('div[class="v-image__image v-image__image--cover"]').nth(0).visible)
.ok();
await scroll(0, 1400);
await scroll(0, 900);
await t.click(Selector("button.p-scroll-top")).expect(getcurrentPosition()).eql(0);
});
//TODO Covered by admin role test
test.meta("testID", "photos-002")(
"Download single photo/video using clipboard and fullscreen mode",
async (t) => {
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
const FirstVideoUid = await photo.getNthPhotoUid("video", 0);
await photoviewer.openPhotoViewer("uid", SecondPhotoUid);
await photoviewer.checkPhotoViewerActionAvailability("download", true);
await photoviewer.triggerPhotoViewerAction("close");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.checkContextMenuCount("2");
await contextmenu.checkContextMenuActionAvailability("download", true);
}
);
test.meta("testID", "photos-003").meta({ type: "smoke" })(
"Approve photo using approve and by adding location",
async (t) => {
await menu.openPage("review");
const FirstPhotoUid = await photo.getNthPhotoUid("all", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("all", 1);
const ThirdPhotoUid = await photo.getNthPhotoUid("all", 2);
await menu.openPage("browse");
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await menu.openPage("review");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.detailsClose);
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.detailsApprove);
if (t.browser.platform === "mobile") {
await t.click(photoedit.detailsApply).click(photoedit.detailsClose);
} else {
await t.click(photoedit.detailsDone);
}
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t
.typeText(photoedit.latitude, "9.999", { replace: true })
.typeText(photoedit.longitude, "9.999", { replace: true });
if (t.browser.platform === "mobile") {
await t.click(photoedit.detailsApply).click(photoedit.detailsClose);
} else {
await t.click(photoedit.detailsDone);
}
await toolbar.setFilter("view", "Cards");
const ApproveButtonThirdPhoto =
'div.is-photo[data-uid="' + ThirdPhotoUid + '"] button.action-approve';
await t.click(Selector(ApproveButtonThirdPhoto));
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(ThirdPhotoUid, false);
await menu.openPage("browse");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await photo.checkPhotoVisibility(ThirdPhotoUid, true);
}
);
test.meta("testID", "photos-004").meta({ type: "smoke" })("Like/dislike photo/video", async (t) => {
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
const FirstVideoUid = await photo.getNthPhotoUid("video", 0);
await menu.openPage("favorites");
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await menu.openPage("browse");
await photo.triggerHoverAction("uid", FirstPhotoUid, "favorite");
await photo.triggerHoverAction("uid", FirstVideoUid, "favorite");
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOn("favorite");
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await menu.openPage("favorites");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await photo.triggerHoverAction("uid", SecondPhotoUid, "favorite");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOff("favorite");
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await photoviewer.openPhotoViewer("uid", FirstPhotoUid);
await photoviewer.triggerPhotoViewerAction("like");
await photoviewer.triggerPhotoViewerAction("close");
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
});
test.meta("testID", "photos-005").meta({ type: "smoke" })("Edit photo/video", async (t) => {
await toolbar.setFilter("view", "Cards");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
await t.click(page.cardTitle.withAttribute("data-uid", FirstPhotoUid));
await t.expect(photoedit.latitude.visible).ok();
await t.click(photoedit.dialogNext);
await t.expect(photoedit.dialogPrevious.getAttribute("disabled")).notEql("disabled");
await t.click(photoedit.dialogPrevious).click(photoedit.dialogClose);
await photoviewer.openPhotoViewer("uid", FirstPhotoUid);
await photoviewer.triggerPhotoViewerAction("edit");
const FirstPhotoTitle = await photoedit.title.value;
const FirstPhotoLocalTime = await photoedit.localTime.value;
const FirstPhotoDay = await photoedit.day.value;
const FirstPhotoMonth = await photoedit.month.value;
const FirstPhotoYear = await photoedit.year.value;
const FirstPhotoTimezone = await photoedit.timezone.value;
const FirstPhotoLatitude = await photoedit.latitude.value;
const FirstPhotoLongitude = await photoedit.longitude.value;
const FirstPhotoAltitude = await photoedit.altitude.value;
const FirstPhotoCountry = await photoedit.country.value;
const FirstPhotoCamera = await photoedit.camera.innerText;
const FirstPhotoIso = await photoedit.iso.value;
const FirstPhotoExposure = await photoedit.exposure.value;
const FirstPhotoLens = await photoedit.lens.innerText;
const FirstPhotoFnumber = await photoedit.fnumber.value;
const FirstPhotoFocalLength = await photoedit.focallength.value;
const FirstPhotoSubject = await photoedit.subject.value;
const FirstPhotoArtist = await photoedit.artist.value;
const FirstPhotoCopyright = await photoedit.copyright.value;
const FirstPhotoLicense = await photoedit.license.value;
const FirstPhotoDescription = await photoedit.description.value;
const FirstPhotoKeywords = await photoedit.keywords.value;
const FirstPhotoNotes = await photoedit.notes.value;
await t
.typeText(photoedit.title, "Not saved photo title", { replace: true })
.click(photoedit.detailsClose)
.click(Selector("button.action-date-edit").withAttribute("data-uid", FirstPhotoUid));
await t.expect(photoedit.title.value).eql(FirstPhotoTitle);
await photoedit.editPhoto(
"New Photo Title",
"Europe/Moscow",
"15",
"07",
"2019",
"04:30:30",
"-1",
"41.15333",
"20.168331",
"32",
"1/32",
"29",
"33",
"Super nice edited photo",
"Happy",
"Happy2020",
"Super nice cat license",
"Description of a nice image :)",
", cat, love",
"Some notes"
);
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await toolbar.triggerToolbarAction("reload");
}
await t
.expect(page.cardTitle.withAttribute("data-uid", FirstPhotoUid).innerText)
.eql("New Photo Title");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
//const expectedValues = [{ FirstPhotoTitle: photoedit.title }, { "bluh bla": photoedit.day }];
/*const expectedValues = [
[FirstPhotoTitle, photoedit.title],
["blah", photoedit.day],
];
await photoedit.checkEditFormValuesNewNew(expectedValues);*/
await photoedit.checkEditFormValues(
"New Photo Title",
"15",
"07",
"2019",
"04:30:30",
"Europe/Moscow",
"Albania",
"-1",
"",
"",
"",
"32",
"1/32",
"",
"29",
"33",
"Super nice edited photo",
"Happy",
"Happy2020",
"Super nice cat license",
"Description of a nice image :)",
"cat",
"Some notes"
);
await photoedit.undoPhotoEdit(
FirstPhotoTitle,
FirstPhotoTimezone,
FirstPhotoDay,
FirstPhotoMonth,
FirstPhotoYear,
FirstPhotoLocalTime,
FirstPhotoAltitude,
FirstPhotoLatitude,
FirstPhotoLongitude,
FirstPhotoCountry,
FirstPhotoIso,
FirstPhotoExposure,
FirstPhotoFnumber,
FirstPhotoFocalLength,
FirstPhotoSubject,
FirstPhotoArtist,
FirstPhotoCopyright,
FirstPhotoLicense,
FirstPhotoDescription,
FirstPhotoKeywords,
FirstPhotoNotes
);
await contextmenu.checkContextMenuCount("1");
await contextmenu.clearSelection();
});
test.skip.meta("testID", "photos-006")("Navigate from card view to place", async (t) => {
await toolbar.setFilter("view", "Cards");
await t.click(page.cardLocation.nth(0));
await t
.expect(Selector("#map").exists, { timeout: 15000 })
.ok()
.expect(Selector("div.p-map-control").visible)
.ok()
.expect(Selector(".input-search input").value)
.notEql("");
});
test.meta("testID", "photos-007")("Mark photos/videos as panorama/scan", async (t) => {
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const FirstVideoUid = await photo.getNthPhotoUid("video", 1);
await menu.openPage("scans");
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await menu.openPage("panoramas");
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await menu.openPage("browse");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOn("scan");
await photoedit.turnSwitchOn("panorama");
await t.click(photoedit.dialogNext);
await photoedit.turnSwitchOn("scan");
await photoedit.turnSwitchOn("panorama");
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await menu.openPage("scans");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await menu.openPage("panoramas");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOff("scan");
await photoedit.turnSwitchOff("panorama");
await t.click(photoedit.dialogNext);
await photoedit.turnSwitchOff("scan");
await photoedit.turnSwitchOff("panorama");
await t.click(photoedit.dialogClose);
await toolbar.triggerToolbarAction("reload");
await contextmenu.clearSelection();
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
});

View file

@ -1,53 +0,0 @@
import { Selector } from "testcafe";
import { ClientFunction } from "testcafe";
import testcafeconfig from "./testcafeconfig.json";
import Menu from "../page-model/menu";
const getLocation = ClientFunction(() => document.location.href);
fixture`Search and open photo from places`.page`${testcafeconfig.url}`.skip(
"Places don't loadin chrome from within the container"
);
const menu = new Menu();
test.meta("testID", "places-001")("Test places", async (t) => {
await menu.openPage("places");
await t
.expect(Selector("#map").exists, { timeout: 15000 })
.ok()
.expect(Selector("div.p-map-control").visible)
.ok();
await t.typeText(Selector('input[aria-label="Search"]'), "Berlin").pressKey("enter");
await t
.expect(Selector("div.p-map-control").visible)
.ok()
.expect(getLocation())
.contains("Berlin");
await menu.openPage("browse");
await t.expect(Selector("div.is-photo").exists).ok();
await menu.openPage("places");
await t
.expect(Selector("#map").exists, { timeout: 15000 })
.ok()
.expect(Selector("div.p-map-control").visible)
.ok();
await t
.typeText(Selector('input[aria-label="Search"]'), "canada", { replace: true })
.pressKey("enter")
.wait(8000);
await t.expect(Selector('div[title="Cape / Bowen Island / 2019"]').visible).ok();
await t.click(Selector('div[title="Cape / Bowen Island / 2019"]'));
await t.expect(Selector("#photo-viewer").visible).ok();
});

View file

@ -1,25 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "../testcafeconfig";
import Menu from "../../page-model/menu";
fixture`Test about`.page`${testcafeconfig.url}`;
const menu = new Menu();
test.meta("testID", "about-001")("About page is displayed with all links", async (t) => {
await menu.openPage("about");
await t
.expect(Selector('a[href="https://photoprism.app/"]').visible)
.ok()
.expect(Selector('a[href="https://link.photoprism.app/patreon"]').visible)
.ok();
});
test.meta("testID", "about-002")("License page is displayed with all links", async (t) => {
await menu.openPage("license");
await t
.expect(Selector("h3").withText("GNU AFFERO GENERAL PUBLIC LICENSE").visible)
.ok()
.expect(Selector('a[href="https://www.gnu.org/licenses/agpl-3.0.en.html"]').visible)
.ok();
});

View file

@ -1,416 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "../testcafeconfig";
import Menu from "../../page-model/menu";
import Toolbar from "../../page-model/toolbar";
import ContextMenu from "../../page-model/context-menu";
import PhotoViewer from "../../page-model/photoviewer";
import Page from "../../page-model/page";
import Photo from "../../page-model/photo";
import PhotoEdit from "../../page-model/photo-edit";
import Album from "../../page-model/album";
import Settings from "../../page-model/settings";
import Library from "../../page-model/library";
fixture`Test settings`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photoviewer = new PhotoViewer();
const page = new Page();
const photo = new Photo();
const photoedit = new PhotoEdit();
const album = new Album();
const settings = new Settings();
const library = new Library();
test.meta("testID", "settings-general-001").meta({ type: "smoke" })("Disable delete", async (t) => {
await menu.openPage("archive");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("delete", true);
await contextmenu.clearSelection();
await menu.openPage("settings");
await t.click(settings.deleteCheckbox);
await menu.openPage("archive");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("restore", true);
await contextmenu.checkContextMenuActionAvailability("delete", false);
await contextmenu.clearSelection();
await menu.openPage("browse");
await toolbar.search("stack:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.filesTab);
await t.click(photoedit.toggleExpandFile.nth(1));
await t.expect(photoedit.deleteFile.visible).notOk();
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await menu.openPage("settings");
await t.click(settings.deleteCheckbox);
});
test.meta("testID", "settings-general-002").meta({ type: "smoke" })(
"Change language",
async (t) => {
await t.expect(Selector(".nav-browse").innerText).contains("Search");
await menu.openPage("settings");
await t
.click(settings.languageInput)
.hover(Selector("div").withText("Deutsch").parent('div[role="listitem"]'))
.click(Selector("div").withText("Deutsch").parent('div[role="listitem"]'));
await t.eval(() => location.reload());
await t.expect(Selector(".nav-browse").innerText).contains("Suche");
await t
.click(settings.languageInput)
.hover(Selector("div").withText("English").parent('div[role="listitem"]'))
.click(Selector("div").withText("English").parent('div[role="listitem"]'));
await t.expect(Selector(".nav-browse").innerText).contains("Search");
}
);
test.meta("testID", "settings-general-003").meta({ type: "smoke" })(
"Disable pages: import, originals, logs, moments, places, library",
async (t) => {
await t.expect(page.cardLocation.exists).ok();
await menu.openPage("library");
await t
.expect(library.importTab.visible)
.ok()
.expect(library.logsTab.visible)
.ok()
.expect(library.indexTab.visible)
.ok();
await menu.checkMenuItemAvailability("originals", true);
await menu.checkMenuItemAvailability("folders", true);
await menu.checkMenuItemAvailability("moments", true);
await menu.checkMenuItemAvailability("places", true);
await menu.checkMenuItemAvailability("library", true);
await menu.openPage("settings");
await t
.click(settings.importCheckbox)
.click(settings.filesCheckbox)
.click(settings.momentsCheckbox)
.click(settings.logsCheckbox)
.click(settings.placesCheckbox);
await t.eval(() => location.reload());
await menu.openPage("browse");
await t.expect(page.cardLocation.exists).notOk();
await menu.openPage("library");
await t
.expect(library.importTab.visible)
.notOk()
.expect(library.logsTab.visible)
.notOk()
.expect(library.indexTab.visible)
.ok();
await menu.checkMenuItemAvailability("originals", false);
await menu.checkMenuItemAvailability("folders", true);
await menu.checkMenuItemAvailability("moments", false);
await menu.checkMenuItemAvailability("places", false);
await menu.checkMenuItemAvailability("library", true);
await menu.openPage("settings");
await t
.click(settings.importCheckbox)
.click(settings.filesCheckbox)
.click(settings.momentsCheckbox)
.click(settings.logsCheckbox)
.click(settings.placesCheckbox)
.click(settings.libraryCheckbox);
await menu.checkMenuItemAvailability("originals", false);
await menu.checkMenuItemAvailability("folders", true);
await menu.checkMenuItemAvailability("moments", true);
await menu.checkMenuItemAvailability("places", true);
await menu.checkMenuItemAvailability("library", false);
await t.click(settings.libraryCheckbox);
await menu.checkMenuItemAvailability("originals", true);
await menu.checkMenuItemAvailability("library", true);
}
);
test.meta("testID", "settings-general-004").meta({ type: "smoke" })(
"Disable people and labels",
async (t) => {
await t.click(page.cardTitle.nth(0));
await t.click(photoedit.labelsTab);
await t.expect(photoedit.addLabel.visible).ok();
await t.click(photoedit.peopleTab);
await t.expect(Selector("div.p-faces").visible).ok();
await t.click(photoedit.dialogClose);
await menu.checkMenuItemAvailability("people", true);
await menu.checkMenuItemAvailability("labels", true);
await menu.openPage("settings");
await t.click(settings.peopleCheckbox).click(settings.labelsCheckbox);
await t.eval(() => location.reload());
await menu.openPage("browse");
await t.click(page.cardTitle.nth(0));
await t.click(photoedit.labelsTab);
await t.expect(photoedit.addLabel.exists).notOk();
await t.click(photoedit.peopleTab);
await t.expect(Selector("div.p-faces ").exists).notOk();
await t.click(photoedit.dialogClose);
await menu.checkMenuItemAvailability("people", false);
await menu.checkMenuItemAvailability("labels", false);
await menu.openPage("settings");
await t.click(settings.peopleCheckbox).click(settings.labelsCheckbox);
await menu.checkMenuItemAvailability("people", true);
await menu.checkMenuItemAvailability("labels", true);
}
);
test.meta("testID", "settings-general-005").meta({ type: "smoke" })(
"Disable private, archive and quality filter",
async (t) => {
await menu.checkMenuItemAvailability("private", true);
await menu.checkMenuItemAvailability("archive", true);
await menu.checkMenuItemAvailability("review", true);
await toolbar.search("photo:true stack:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("archive", true);
await contextmenu.checkContextMenuActionAvailability("private", true);
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.infoTab);
await photoedit.checkFieldDisabled(photoedit.privateInput, false);
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await toolbar.search("Viewpoint / Mexico / 2017");
await photo.checkPhotoVisibility("pqmxlr7188hz4bih", false);
await toolbar.search("Truck / Vancouver / 2019");
await photo.checkPhotoVisibility("pqmxlr0kg161o9ek", false);
await toolbar.search("Archive / 2020");
await photo.checkPhotoVisibility("pqnah1k2frui6p63", false);
await menu.openPage("settings");
await t
.click(settings.archiveCheckbox)
.click(settings.privateCheckbox)
.click(Selector(settings.libraryTab))
.click(settings.reviewCheckbox);
await t.eval(() => location.reload());
await menu.checkMenuItemAvailability("private", false);
await menu.checkMenuItemAvailability("archive", false);
await menu.checkMenuItemAvailability("review", false);
await menu.openPage("browse");
await toolbar.search("photo:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("archive", false);
await contextmenu.checkContextMenuActionAvailability("private", false);
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.infoTab);
//await photoedit.checkFieldDisabled(photoedit.privateInput, true);
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await toolbar.search("Viewpoint / Mexico / 2017");
await photo.checkPhotoVisibility("pqmxlr7188hz4bih", true);
await toolbar.search("Truck / Vancouver / 2019");
await photo.checkPhotoVisibility("pqmxlr0kg161o9ek", false);
await toolbar.search("Archive / 2020");
await photo.checkPhotoVisibility("pqnah1k2frui6p63", true);
await menu.openPage("settings");
await t
.click(settings.privateCheckbox)
.click(settings.archiveCheckbox)
.click(Selector(settings.libraryTab))
.click(settings.reviewCheckbox);
await menu.checkMenuItemAvailability("archive", true);
await menu.checkMenuItemAvailability("private", true);
await menu.checkMenuItemAvailability("review", true);
}
);
test.meta("testID", "settings-general-006").meta({ type: "smoke" })(
"Disable upload, download, edit and share",
async (t) => {
await toolbar.checkToolbarActionAvailability("upload", true);
await toolbar.search("photo:true stack:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("download", true);
await contextmenu.checkContextMenuActionAvailability("share", true);
await contextmenu.checkContextMenuActionAvailability("edit", true);
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.checkAllDetailsFieldsDisabled(false);
await t.expect(photoedit.infoTab.visible).ok();
await t.click(photoedit.filesTab);
await t
.expect(photoedit.downloadFile.nth(0).visible)
.ok()
.click(photoedit.toggleExpandFile.nth(1))
.expect(photoedit.downloadFile.nth(1).visible)
.ok()
.expect(photoedit.deleteFile.visible)
.ok()
.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await photoviewer.openPhotoViewer("nth", 0);
await photoviewer.checkPhotoViewerActionAvailability("download", true);
await photoviewer.triggerPhotoViewerAction("close");
await menu.openPage("settings");
await t
.click(settings.uploadCheckbox)
.click(settings.downloadCheckbox)
.click(settings.editCheckbox)
.click(settings.shareCheckbox);
await t.eval(() => location.reload());
await t.navigateTo("/calendar");
await toolbar.checkToolbarActionAvailability("upload", false);
await album.checkHoverActionAvailability("nth", 2, "share", false);
await album.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("edit", true);
await contextmenu.checkContextMenuActionAvailability("download", false);
await contextmenu.checkContextMenuActionAvailability("share", false);
await contextmenu.clearSelection();
await album.openNthAlbum(0);
await toolbar.checkToolbarActionAvailability("upload", false);
await toolbar.checkToolbarActionAvailability("download", false);
await toolbar.checkToolbarActionAvailability("share", false);
await toolbar.checkToolbarActionAvailability("edit", true);
await t.navigateTo("/folders");
await toolbar.checkToolbarActionAvailability("upload", false);
await album.checkHoverActionAvailability("nth", 0, "share", false);
await album.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("edit", true);
await contextmenu.checkContextMenuActionAvailability("download", false);
await contextmenu.checkContextMenuActionAvailability("share", false);
await contextmenu.clearSelection();
await album.openNthAlbum(0);
await toolbar.checkToolbarActionAvailability("upload", false);
await toolbar.checkToolbarActionAvailability("download", false);
await toolbar.checkToolbarActionAvailability("share", false);
await toolbar.checkToolbarActionAvailability("edit", true);
await t.navigateTo("/albums");
await toolbar.checkToolbarActionAvailability("upload", false);
await album.checkHoverActionAvailability("nth", 0, "share", false);
await album.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("edit", true);
await contextmenu.checkContextMenuActionAvailability("delete", true);
await contextmenu.checkContextMenuActionAvailability("download", false);
await contextmenu.checkContextMenuActionAvailability("share", false);
await contextmenu.clearSelection();
await album.openNthAlbum(0);
await toolbar.checkToolbarActionAvailability("upload", false);
await toolbar.checkToolbarActionAvailability("download", false);
await toolbar.checkToolbarActionAvailability("share", false);
await toolbar.checkToolbarActionAvailability("edit", true);
await t.navigateTo("/browse");
await toolbar.checkToolbarActionAvailability("upload", false);
await toolbar.search("photo:true stack:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("download", false);
await contextmenu.checkContextMenuActionAvailability("share", false);
await contextmenu.checkContextMenuActionAvailability("edit", false);
await contextmenu.clearSelection();
await t.click(page.cardTitle.nth(0));
await photoedit.checkAllDetailsFieldsDisabled(true);
await t.expect(photoedit.infoTab.visible).notOk();
await t.click(photoedit.filesTab);
await t
.expect(photoedit.downloadFile.nth(0).visible)
.notOk()
.click(photoedit.toggleExpandFile.nth(1))
.expect(photoedit.downloadFile.nth(1).visible)
.notOk()
.expect(photoedit.deleteFile.visible)
.ok();
await t.click(photoedit.dialogClose);
await toolbar.search("photo:true");
await photoviewer.openPhotoViewer("nth", 0);
await photoviewer.checkPhotoViewerActionAvailability("download", false);
await photoviewer.checkPhotoViewerActionAvailability("edit", true);
await photoviewer.triggerPhotoViewerAction("close");
await menu.openPage("settings");
await t
.click(settings.uploadCheckbox)
.click(settings.downloadCheckbox)
.click(settings.editCheckbox)
.click(settings.shareCheckbox);
}
);

View file

@ -1,148 +0,0 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test states`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "states-001")("Update state details", async (t) => {
await menu.openPage("states");
await toolbar.search("Canada");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("British Columbia");
await t.click(page.cardTitle.nth(0));
await t
.expect(albumdialog.title.value)
.eql("British Columbia")
.expect(albumdialog.location.value)
.eql("Canada")
.expect(albumdialog.description.value)
.eql("")
.expect(albumdialog.category.value)
.eql("");
await t
.typeText(albumdialog.title, "Wonderland", { replace: true })
.typeText(albumdialog.location, "Earth", { replace: true })
.typeText(albumdialog.description, "We love earth")
.typeText(albumdialog.category, "Mountains")
.pressKey("enter")
.click(albumdialog.dialogSave);
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("Wonderland")
.expect(page.cardDescription.nth(0).innerText)
.contains("We love earth")
.expect(Selector("div.caption").nth(1).innerText)
.contains("Mountains")
.expect(Selector("div.caption").nth(2).innerText)
.contains("Earth");
await album.openNthAlbum(0);
await t.expect(toolbar.toolbarTitle.innerText).contains("Wonderland");
await t.expect(toolbar.toolbarDescription.innerText).contains("We love earth");
await menu.openPage("states");
if (t.browser.platform === "mobile") {
await toolbar.search("category:Mountains");
} else {
await toolbar.setFilter("category", "Mountains");
}
await t.expect(page.cardTitle.nth(0).innerText).contains("Wonderland");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t
.expect(albumdialog.description.value)
.eql("We love earth")
.expect(albumdialog.category.value)
.eql("Mountains")
.expect(albumdialog.location.value)
.eql("Earth");
await t
.typeText(albumdialog.title, "British Columbia / Canada", { replace: true })
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.typeText(albumdialog.location, "Canada", { replace: true })
.click(albumdialog.dialogSave);
await menu.openPage("states");
await toolbar.search("Canada");
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("British Columbia / Canada")
.expect(page.cardDescription.innerText)
.notContains("We love earth")
.expect(Selector("div.caption").nth(0).innerText)
.notContains("Earth");
});
test.meta("testID", "states-002")("Create, Edit, delete sharing link for state", async (t) => {
await page.testCreateEditDeleteSharingLink("states");
});
test.meta("testID", "states-003")("Create/delete album-clone from state", async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("states");
await toolbar.search("Canada");
const FirstStateUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(FirstStateUid);
const PhotoCountInState = await photo.getPhotoCount("all");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await menu.openPage("states");
await album.selectAlbumFromUID(FirstStateUid);
await contextmenu.triggerContextMenuAction("clone", "NotYetExistingAlbumForState");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbumForState");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountInAlbum = await photo.getPhotoCount("all");
await t.expect(PhotoCountInAlbum).eql(PhotoCountInState);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await menu.openPage("albums");
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
await menu.openPage("states");
await album.openAlbumWithUid(FirstStateUid);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
});

View file

@ -1,4 +0,0 @@
{
"url": "localhost:2343/browse"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

View file

@ -1,120 +0,0 @@
[{
"SourceFile": "digikam.jpg",
"ExifToolVersion": 11.88,
"FileName": "digikam.jpg",
"Directory": ".",
"FileSize": "195 kB",
"FileModifyDate": "2020:10:19 10:29:43+02:00",
"FileAccessDate": "2020:10:19 10:29:43+02:00",
"FileInodeChangeDate": "2020:10:19 10:29:43+02:00",
"FilePermissions": "rw-rw-r--",
"FileType": "JPEG",
"FileTypeExtension": "jpg",
"MIMEType": "image/jpeg",
"JFIFVersion": 1.01,
"CurrentIPTCDigest": "92f4f2920e4cd46aa5c45f9d2ce7affa",
"CodedCharacterSet": "UTF8",
"Keywords": ["Berlin","Shop"],
"ExifByteOrder": "Big-endian (Motorola, MM)",
"Make": "HUAWEI",
"Model": "ELE-L29",
"Orientation": "Unknown (0)",
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": "inches",
"Software": "ELE-L29 10.1.0.150(C431E22R2P5)",
"ModifyDate": "2020:10:17 17:48:24",
"YCbCrPositioning": "Centered",
"DocumentName": "",
"ExposureTime": "1/50",
"FNumber": 1.8,
"ExposureProgram": "Program AE",
"ISO": 100,
"ExifVersion": "0210",
"DateTimeOriginal": "2020:10:17 17:48:24",
"CreateDate": "2020:10:17 17:48:24",
"ComponentsConfiguration": "Y, Cb, Cr, -",
"CompressedBitsPerPixel": 0.95,
"ShutterSpeedValue": "1/999963365",
"ApertureValue": 1.8,
"BrightnessValue": 0,
"ExposureCompensation": 0,
"MaxApertureValue": 1.8,
"MeteringMode": "Multi-segment",
"LightSource": "Daylight",
"Flash": "No Flash",
"FocalLength": "5.6 mm",
"MakerNoteUnknownText": "Auto",
"SubSecTime": 950488,
"SubSecTimeOriginal": 950488,
"SubSecTimeDigitized": 950488,
"FlashpixVersion": "0100",
"ColorSpace": "sRGB",
"ExifImageWidth": 3648,
"ExifImageHeight": 2736,
"InteropIndex": "R98 - DCF basic file (sRGB)",
"InteropVersion": "0100",
"SensingMethod": "One-chip color area",
"FileSource": "Digital Camera",
"SceneType": "Directly photographed",
"CustomRendered": "Custom",
"ExposureMode": "Auto",
"WhiteBalance": "Auto",
"DigitalZoomRatio": 1,
"FocalLengthIn35mmFormat": "27 mm",
"SceneCaptureType": "Standard",
"GainControl": "None",
"Contrast": "Normal",
"Saturation": "Normal",
"Sharpness": "Normal",
"SubjectDistanceRange": "Unknown",
"GPSVersionID": "2.2.0.0",
"GPSLatitudeRef": "North",
"GPSLongitudeRef": "East",
"GPSAltitudeRef": "Above Sea Level",
"GPSTimeStamp": "15:48:23",
"GPSProcessingMethod": "GPS",
"GPSDateStamp": "2020:10:17",
"DeviceSettingDescription": "(Binary data 4 bytes, use -b option to extract)",
"Compression": "JPEG (old-style)",
"ThumbnailOffset": 83310,
"ThumbnailLength": 27920,
"XMPToolkit": "XMP Core 4.4.0-Exiv2",
"Warning": "[minor] Fixed incorrect URI for xmlns:MicrosoftPhoto",
"Rating": 4,
"Categories": "<Categories><Category Assigned=\"1\">Berlin</Category><Category Assigned=\"1\">Shop</Category></Categories>",
"RatingPercent": 75,
"ColorLabel": 9,
"PickLabel": 3,
"Urgency": "9 (user-defined priority)",
"LastKeywordXMP": ["Berlin","Shop"],
"TagsList": ["Berlin","Shop"],
"HierarchicalSubject": ["Berlin","Shop"],
"CatalogSets": ["Berlin","Shop"],
"Subject": ["Berlin","Shop"],
"ImageWidth": 500,
"ImageHeight": 375,
"EncodingProcess": "Baseline DCT, Huffman coding",
"BitsPerSample": 8,
"ColorComponents": 3,
"YCbCrSubSampling": "YCbCr4:2:0 (2 2)",
"Aperture": 1.8,
"ImageSize": "500x375",
"Megapixels": 0.188,
"ScaleFactor35efl": 4.8,
"ShutterSpeed": "1/50",
"SubSecCreateDate": "2020:10:17 17:48:24.950488",
"SubSecDateTimeOriginal": "2020:10:17 17:48:24.950488",
"SubSecModifyDate": "2020:10:17 17:48:24.950488",
"ThumbnailImage": "(Binary data 27920 bytes, use -b option to extract)",
"GPSAltitude": "84.4 m Above Sea Level",
"GPSDateTime": "2020:10:17 15:48:23Z",
"GPSLatitude": "52 deg 27' 37.88\" N",
"GPSLongitude": "13 deg 19' 53.05\" E",
"CircleOfConfusion": "0.006 mm",
"FOV": "67.4 deg",
"FocalLength35efl": "5.6 mm (35 mm equivalent: 27.0 mm)",
"GPSPosition": "52 deg 27' 37.88\" N, 13 deg 19' 53.05\" E",
"HyperfocalDistance": "2.79 m",
"LightValue": 7.3
}]

View file

@ -1 +0,0 @@
example text file, you can ignore this

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

View file

@ -1,10 +1,24 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import PhotoViewer from "../page-model/photoviewer";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test albums`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const photoviewer = new PhotoViewer();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "authentication-000")(
"Time to start instance (will be marked as unstable)",
@ -13,181 +27,182 @@ test.meta("testID", "authentication-000")(
}
);
test.meta("testID", "albums-001")("Create/delete album on /albums", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbums = await Selector("a.is-album").count;
await t.click(Selector("button.action-add"));
const countAlbumsAfterCreate = await Selector("a.is-album").count;
const NewAlbum = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.expect(countAlbumsAfterCreate).eql(countAlbums + 1);
await page.selectFromUID(NewAlbum);
await page.deleteSelected();
const countAlbumsAfterDelete = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterDelete).eql(countAlbumsAfterCreate - 1);
});
test.meta("testID", "albums-001").meta({ type: "smoke" })(
"Create/delete album on /albums",
async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await toolbar.triggerToolbarAction("add");
const AlbumCountAfterCreate = await album.getAlbumCount("all");
const NewAlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(AlbumCountAfterCreate).eql(AlbumCount + 1);
await album.selectAlbumFromUID(NewAlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCountAfterCreate - 1);
}
);
test.meta("testID", "albums-002").meta({ type: "smoke" })(
"Create/delete album during add to album",
async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("browse");
await toolbar.search("photo:true");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await photo.selectPhotoFromUID(SecondPhotoUid);
await photo.selectPhotoFromUID(FirstPhotoUid);
await contextmenu.triggerContextMenuAction("album", "NotYetExistingAlbum");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbum");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
}
);
test.meta("testID", "albums-003").meta({ type: "smoke" })("Update album details", async (t) => {
await menu.openPage("albums");
await toolbar.search("Holiday");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("Holiday");
await t.click(page.cardTitle.nth(0)).typeText(albumdialog.title, "Animals", { replace: true });
await t.expect(albumdialog.description.value).eql("").expect(albumdialog.category.value).eql("");
test.meta("testID", "albums-002")("Update album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.search("Holiday");
const AlbumUid = await Selector("a.is-album", { timeout: 55000 }).nth(0).getAttribute("data-uid");
await t
.expect(Selector("button.action-title-edit").nth(0).innerText)
.contains("Holiday")
.click(Selector(".action-title-edit").nth(0))
.typeText(Selector(".input-title input"), "Animals", { replace: true })
.expect(Selector(".input-description textarea").value)
.eql("")
.expect(Selector(".input-category input").value)
.eql("")
.typeText(Selector(".input-description textarea"), "All my animals")
.typeText(Selector(".input-category input"), "Pets")
.typeText(albumdialog.description, "All my animals")
.typeText(albumdialog.category, "Pets")
.pressKey("enter")
.click(".action-confirm")
.click(Selector("a.is-album").nth(0));
const PhotoCount = await Selector("div.is-photo").count;
.click(albumdialog.dialogSave);
await t.expect(page.cardTitle.nth(0).innerText).contains("Animals");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t.typeText(albumdialog.title, "Holiday", { replace: true });
await t
.expect(Selector(".v-card__text").nth(0).innerText)
.contains("All my animals")
.expect(Selector("div").withText("Animals").exists)
.ok();
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("photo:true");
const FirstPhotoUid = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
const SecondPhotoUid = await Selector("div.is-photo.type-image").nth(1).getAttribute("data-uid");
await page.selectPhotoFromUID(SecondPhotoUid);
await page.selectFromUIDInFullscreen(FirstPhotoUid);
await page.addSelectedToAlbum("Animals", "album");
await page.openNav();
await t.click(Selector(".nav-albums"));
if (t.browser.platform === "mobile") {
await page.search("category:Family");
} else {
await t
.click(Selector(".input-category"))
.click(Selector('div[role="listitem"]').withText("Family"));
}
await t.expect(Selector("button.action-title-edit").nth(0).innerText).contains("Christmas");
await page.openNav();
await t.click(Selector(".nav-albums")).click(".action-reload");
if (t.browser.platform === "mobile") {
} else {
await t
.click(Selector(".input-category"))
.click(Selector('div[role="listitem"]').withText("All Categories"), { timeout: 55000 });
}
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
const PhotoCountAfterAdd = await Selector("div.is-photo").count;
await t.expect(PhotoCountAfterAdd).eql(PhotoCount + 2);
await page.selectPhotoFromUID(FirstPhotoUid);
await page.selectPhotoFromUID(SecondPhotoUid);
await page.removeSelected();
const PhotoCountAfterDelete = await Selector("div.is-photo").count;
await t
.expect(PhotoCountAfterDelete)
.eql(PhotoCountAfterAdd - 2)
.click(Selector(".action-edit"))
.typeText(Selector(".input-title input"), "Holiday", { replace: true })
.expect(Selector(".input-description textarea").value)
.expect(albumdialog.description.value)
.eql("All my animals")
.expect(Selector(".input-category input").value)
.eql("Pets")
.click(Selector(".input-description textarea"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(Selector(".input-category input"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(".action-confirm");
await page.openNav();
.expect(albumdialog.category.value)
.eql("Pets");
await t
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.dialogSave);
await menu.openPage("albums");
await t
.click(Selector(".nav-albums"))
.expect(Selector("div").withText("Holiday").visible)
.ok()
.expect(Selector("div").withText("Animals").exists)
.notOk();
});
test.meta("testID", "albums-003")("Download album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.checkButtonVisibility("download", true, true);
test.meta("testID", "albums-004").meta({ type: "smoke" })(
"Add/Remove Photos to/from album",
async (t) => {
await menu.openPage("albums");
await toolbar.search("Holiday");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCount = await photo.getPhotoCount("all");
await menu.openPage("browse");
await toolbar.search("photo:true");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await photo.selectPhotoFromUID(SecondPhotoUid);
await photoviewer.openPhotoViewer("uid", FirstPhotoUid);
await photoviewer.triggerPhotoViewerAction("select");
await photoviewer.triggerPhotoViewerAction("close");
await contextmenu.triggerContextMenuAction("album", "Holiday");
await menu.openPage("albums");
await album.openAlbumWithUid(AlbumUid);
const PhotoCountAfterAdd = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterAdd).eql(PhotoCount + 2);
await photo.selectPhotoFromUID(FirstPhotoUid);
await photo.selectPhotoFromUID(SecondPhotoUid);
await contextmenu.triggerContextMenuAction("remove", "");
const PhotoCountAfterRemove = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterRemove).eql(PhotoCountAfterAdd - 2);
}
);
test.meta("testID", "albums-005")("Use album search and filters", async (t) => {
await menu.openPage("albums");
if (t.browser.platform === "mobile") {
await toolbar.search("category:Family");
} else {
await toolbar.setFilter("category", "Family");
}
await t.expect(page.cardTitle.nth(0).innerText).contains("Christmas");
const AlbumCount = await album.getAlbumCount("all");
await t.expect(AlbumCount).eql(1);
if (t.browser.platform === "mobile") {
} else {
await toolbar.setFilter("category", "All Categories");
}
await toolbar.search("Holiday");
await t.expect(page.cardTitle.nth(0).innerText).contains("Holiday");
const AlbumCount2 = await album.getAlbumCount("all");
await t.expect(AlbumCount2).eql(1);
});
test.meta("testID", "albums-004")("View folders", async (t) => {
await page.openNav();
test.meta("testID", "albums-006")("Test album autocomplete", async (t) => {
await toolbar.search("photo:true");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
await photo.selectPhotoFromUID(FirstPhotoUid);
await contextmenu.openContextMenu();
await t.click(Selector("button.action-album")).click(Selector(".input-album input"));
await t
.click(Selector(".nav-folders"))
.expect(Selector("a").withText("BotanicalGarden").visible)
.expect(page.selectOption.withText("Holiday").visible)
.ok()
.expect(Selector("a").withText("Kanada").visible)
.expect(page.selectOption.withText("Christmas").visible)
.ok();
await t.typeText(Selector(".input-album input"), "C", { replace: true });
await t
.expect(page.selectOption.withText("Holiday").visible)
.notOk()
.expect(page.selectOption.withText("Christmas").visible)
.ok()
.expect(Selector("a").withText("KorsikaAdventure").visible)
.expect(page.selectOption.withText("C").visible)
.ok();
});
test.meta("testID", "albums-005")("View calendar", async (t) => {
await page.openNav();
await t
.click(Selector(".nav-calendar"))
.expect(Selector("a").withText("May 2019").visible)
.ok()
.expect(Selector("a").withText("October 2019").visible)
.ok();
});
//TODO test that sharing link works as expected
test.meta("testID", "albums-006")("Create, Edit, delete sharing link", async (t) => {
await page.testCreateEditDeleteSharingLink("albums");
});
test.meta("testID", "albums-007")("Create/delete album during add to album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbums = await Selector("a.is-album").count;
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("photo:true");
const FirstPhotoUid = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
const SecondPhotoUid = await Selector("div.is-photo.type-image").nth(1).getAttribute("data-uid");
await page.selectPhotoFromUID(SecondPhotoUid);
await page.selectFromUIDInFullscreen(FirstPhotoUid);
await page.addSelectedToAlbum("NotYetExistingAlbum", "album");
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterCreation = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterCreation).eql(countAlbums + 1);
await page.search("NotYetExistingAlbum");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await page.selectFromUID(AlbumUid);
await page.deleteSelected();
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterDelete = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterDelete).eql(countAlbums);
});
test.meta("testID", "albums-008")("Test album autocomplete", async (t) => {
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("photo:true");
const FirstPhotoUid = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
await page.selectPhotoFromUID(FirstPhotoUid);
await t
.click(Selector("button.action-menu"))
.click(Selector("button.action-album"))
.click(Selector(".input-album input"))
.expect(Selector("div.v-list__tile__title").withText("Holiday").visible)
.ok()
.expect(Selector("div.v-list__tile__title").withText("Christmas").visible)
.ok()
.typeText(Selector(".input-album input"), "C", { replace: true })
.expect(Selector("div.v-list__tile__title").withText("Christmas").visible)
.ok()
.expect(Selector("div.v-list__tile__title").withText("C").visible)
.ok()
.expect(Selector("div.v-list__tile__title").withText("Holiday").visible)
.notOk();
});
test.meta("testID", "albums-007").meta({ type: "smoke" })(
"Create, Edit, delete sharing link",
async (t) => {
await page.testCreateEditDeleteSharingLink("albums");
}
);

View file

@ -1,148 +1,146 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import { RequestLogger } from "testcafe";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
const logger = RequestLogger(/http:\/\/localhost:2343\/api\/v1\/*/, {
logResponseHeaders: true,
logResponseBody: true,
fixture`Test calendar`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "calendar-001").meta({ type: "smoke" })("View calendar", async (t) => {
await menu.openPage("calendar");
await t
.expect(Selector("a").withText("May 2019").visible)
.ok()
.expect(Selector("a").withText("October 2019").visible)
.ok();
});
fixture`Test calendar`.page`${testcafeconfig.url}`.requestHooks(logger);
test.meta("testID", "calendar-002")("Update calendar details", async (t) => {
await menu.openPage("calendar");
await toolbar.search("March 2014");
const AlbumUid = await album.getNthAlbumUid("all", 0);
const page = new Page();
await t.expect(page.cardTitle.nth(0).innerText).contains("March 2014");
await t.click(page.cardTitle.nth(0)).typeText(albumdialog.location, "Snow", { replace: true });
await t.expect(albumdialog.description.value).eql("").expect(albumdialog.category.value).eql("");
test.meta("testID", "calendar-001")("Update calendar", async (t) => {
await page.openNav();
await t.click(Selector(".nav-calendar"));
await page.search("March 2014");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t
.expect(Selector("button.action-title-edit").nth(0).innerText)
.contains("March 2014")
.click(Selector(".action-title-edit").nth(0))
.typeText(Selector(".input-location input"), "Snow", { replace: true })
.expect(Selector(".input-description textarea").value)
.eql("")
.expect(Selector(".input-category input").value)
.eql("")
.typeText(Selector(".input-description textarea"), "We went to ski")
.typeText(Selector(".input-category input"), "Mountains")
.typeText(albumdialog.description, "We went to ski")
.typeText(albumdialog.category, "Mountains")
.pressKey("enter")
.click(".action-confirm")
.expect(Selector("button.action-title-edit").nth(0).innerText)
.click(albumdialog.dialogSave);
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("March 2014")
.expect(Selector('div[title="Description"]').nth(0).innerText)
.expect(page.cardDescription.nth(0).innerText)
.contains("We went to ski")
.expect(Selector("div.caption").nth(1).innerText)
.contains("Mountains")
.expect(Selector("div.caption").nth(2).innerText)
.contains("Snow")
.click(Selector("a.is-album").nth(0));
await t
.expect(Selector(".v-card__text").nth(0).innerText)
.contains("We went to ski")
.expect(Selector("div").withText("March 2014").exists)
.ok();
await page.openNav();
await t.click(Selector(".nav-calendar"));
.contains("Snow");
await album.openNthAlbum(0);
await t.expect(toolbar.toolbarTitle.innerText).contains("March 2014");
await t.expect(toolbar.toolbarDescription.innerText).contains("We went to ski");
await menu.openPage("calendar");
if (t.browser.platform === "mobile") {
await page.search("category:Mountains");
await toolbar.search("category:Mountains");
} else {
await t
.click(Selector(".input-category"))
.click(Selector('div[role="listitem"]').withText("Mountains"));
await toolbar.setFilter("category", "Mountains");
}
await t.expect(Selector("button.action-title-edit").nth(0).innerText).contains("March 2014");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
await t.expect(page.cardTitle.nth(0).innerText).contains("March 2014");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t
.click(Selector(".action-edit"))
.expect(Selector(".input-description textarea").value)
.expect(albumdialog.description.value)
.eql("We went to ski")
.expect(Selector(".input-category input").value)
.expect(albumdialog.category.value)
.eql("Mountains")
.expect(Selector(".input-location input").value)
.eql("Snow")
.click(Selector(".input-category input"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(Selector(".input-description textarea"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(Selector(".input-location input"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(".action-confirm");
await page.openNav();
await t.click(Selector(".nav-calendar"));
await page.search("March 2014");
.expect(albumdialog.location.value)
.eql("Snow");
await t
.expect(Selector('div[title="Description"]').innerText)
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.location)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.dialogSave);
await menu.openPage("calendar");
await toolbar.search("March 2014");
await t
.expect(page.cardDescription.innerText)
.notContains("We went to ski")
.expect(Selector("div.caption").nth(0).innerText)
.notContains("Snow");
});
test.meta("testID", "calendar-002")("Download calendar", async (t) => {
await page.openNav();
await t.click(Selector(".nav-calendar"));
await page.checkButtonVisibility("download", true, true);
});
//TODO test that sharing link works as expected
test.meta("testID", "calendar-003")("Create, Edit, delete sharing link", async (t) => {
test.meta("testID", "calendar-003")("Create, Edit, delete sharing link for calendar", async (t) => {
await page.testCreateEditDeleteSharingLink("calendar");
});
test.meta("testID", "calendar-004")("Create/delete album during add to album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbums = await Selector("a.is-album").count;
await page.openNav();
await t.click(Selector(".nav-calendar"));
const SecondCalendar = await Selector("a.is-album").nth(1).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", SecondCalendar));
const PhotoCountInCalendar = await Selector("div.is-photo").count;
const FirstPhoto = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
const SecondPhoto = await Selector("div.is-photo.type-image").nth(1).getAttribute("data-uid");
await page.openNav();
await t.click(Selector(".nav-calendar"));
await page.selectFromUID(SecondCalendar);
await page.addSelectedToAlbum("NotYetExistingAlbumForCalendar", "clone");
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterCreation = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterCreation).eql(countAlbums + 1);
await page.search("NotYetExistingAlbumForCalendar");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
const PhotoCountInAlbum = await Selector("div.is-photo").count;
await t
.expect(PhotoCountInAlbum)
.eql(PhotoCountInCalendar)
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.ok();
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.selectFromUID(AlbumUid);
await page.deleteSelected();
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterDelete = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterDelete).eql(countAlbums);
await t
.click(Selector(".nav-calendar"))
.click(Selector("a.is-album").withAttribute("data-uid", SecondCalendar))
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.ok();
});
test.meta("testID", "calendar-004").meta({ type: "smoke" })(
"Create/delete album-clone from calendar",
async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("calendar");
const SecondCalendarUid = await album.getNthAlbumUid("all", 1);
await album.openAlbumWithUid(SecondCalendarUid);
const PhotoCountInCalendar = await photo.getPhotoCount("all");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await menu.openPage("calendar");
await album.selectAlbumFromUID(SecondCalendarUid);
await contextmenu.triggerContextMenuAction("clone", "NotYetExistingAlbumForCalendar");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
test.meta("testID", "calendar-005")("No delete calendar functionality", async (t) => {
await page.openNav();
await t.click(Selector(".nav-calendar"));
await page.checkButtonVisibility("delete", false, false);
});
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbumForCalendar");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountInAlbum = await photo.getPhotoCount("all");
await t.expect(PhotoCountInAlbum).eql(PhotoCountInCalendar);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await menu.openPage("albums");
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
await menu.openPage("calendar");
await album.openAlbumWithUid(SecondCalendarUid);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
}
);

View file

@ -1,17 +1,18 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import Toolbar from "../page-model/toolbar";
fixture`Test components`.page`${testcafeconfig.url}`;
const page = new Page();
const toolbar = new Toolbar();
test.meta("testID", "components-001")("Test filter options", async (t) => {
test.meta("testID", "components-001").meta({ type: "smoke" })("Test filter options", async (t) => {
await t.expect(Selector("body").withText("object Object").exists).notOk();
});
test.meta("testID", "components-002")("Fullscreen mode", async (t) => {
test.meta("testID", "components-002").meta({ type: "smoke" })("Fullscreen mode", async (t) => {
await t.click(Selector("div.v-image__image").nth(0));
if (await Selector("#photo-viewer").visible) {
await t
.expect(Selector("#photo-viewer").visible)
@ -23,8 +24,9 @@ test.meta("testID", "components-002")("Fullscreen mode", async (t) => {
}
});
test.meta("testID", "components-003")("Mosaic view", async (t) => {
await page.setFilter("view", "Mosaic");
test.meta("testID", "components-003").meta({ type: "smoke" })("Mosaic view", async (t) => {
await toolbar.setFilter("view", "Mosaic");
await t
.expect(Selector("div.v-image__image").visible)
.ok()
@ -37,7 +39,8 @@ test.meta("testID", "components-003")("Mosaic view", async (t) => {
});
test.meta("testID", "components-004")("List view", async (t) => {
await page.setFilter("view", "List");
await toolbar.setFilter("view", "List");
await t
.expect(Selector("table.v-datatable").visible)
.ok()
@ -45,8 +48,9 @@ test.meta("testID", "components-004")("List view", async (t) => {
.ok();
});
test.meta("testID", "components-005")("#Card view", async (t) => {
await page.setFilter("view", "Cards");
test.meta("testID", "components-005").meta({ type: "smoke" })("Card view", async (t) => {
await toolbar.setFilter("view", "Cards");
await t
.expect(Selector("div.v-image__image").visible)
.ok()

View file

@ -1,205 +1,160 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test folders`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "folders-001").meta({ type: "smoke" })("View folders", async (t) => {
await menu.openPage("folders");
test.meta("testID", "folders-001")("Update folders", async (t) => {
await page.openNav();
await t.click(Selector(".nav-folders"));
await page.search("Kanada");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t
.expect(Selector("button.action-title-edit").nth(0).innerText)
.contains("Kanada")
.click(Selector(".action-title-edit").nth(0))
.expect(Selector(".input-title input").value)
.expect(Selector("a").withText("BotanicalGarden").visible)
.ok()
.expect(Selector("a").withText("Kanada").visible)
.ok()
.expect(Selector("a").withText("KorsikaAdventure").visible)
.ok();
});
test.meta("testID", "folders-002")("Update folder details", async (t) => {
await menu.openPage("folders");
await toolbar.search("Kanada");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("Kanada");
await t.click(page.cardTitle.nth(0));
await t
.expect(albumdialog.title.value)
.eql("Kanada")
.expect(Selector(".input-location input").value)
.expect(albumdialog.location.value)
.eql("")
.typeText(Selector(".input-title input"), "MyFolder", { replace: true })
.typeText(Selector(".input-location input"), "USA", { replace: true })
.expect(Selector(".input-description textarea").value)
.expect(albumdialog.description.value)
.eql("")
.expect(Selector(".input-category input").value)
.eql("")
.typeText(Selector(".input-description textarea"), "Last holiday")
.typeText(Selector(".input-category input"), "Mountains")
.expect(albumdialog.category.value)
.eql("");
await t
.typeText(albumdialog.title, "MyFolder", { replace: true })
.typeText(albumdialog.location, "USA", { replace: true })
.typeText(albumdialog.description, "Last holiday")
.typeText(albumdialog.category, "Mountains")
.pressKey("enter")
.click(".action-confirm")
.expect(Selector("button.action-title-edit").nth(0).innerText)
.click(albumdialog.dialogSave);
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("MyFolder")
.expect(Selector('div[title="Description"]').nth(0).innerText)
.expect(page.cardDescription.nth(0).innerText)
.contains("Last holiday")
.expect(Selector("div.caption").nth(1).innerText)
.contains("Mountains")
.expect(Selector("div.caption").nth(2).innerText)
.contains("USA")
.click(Selector("a.is-album").nth(0));
.contains("USA");
await album.openNthAlbum(0);
await t
.expect(Selector(".v-card__text").nth(0).innerText)
.expect(toolbar.toolbarDescription.nth(0).innerText)
.contains("Last holiday")
.expect(Selector("div").withText("MyFolder").exists)
.ok();
await page.openNav();
await t.click(Selector(".nav-folders"));
.expect(toolbar.toolbarTitle.nth(0).innerText)
.contains("MyFolder");
await menu.openPage("folders");
if (t.browser.platform === "mobile") {
await page.search("category:Mountains");
await toolbar.search("category:Mountains");
} else {
await t
.click(Selector(".input-category"))
.click(Selector('div[role="listitem"]').withText("Mountains"));
await toolbar.setFilter("category", "Mountains");
}
await t.expect(Selector("button.action-title-edit").nth(0).innerText).contains("MyFolder");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
await t.expect(page.cardTitle.nth(0).innerText).contains("MyFolder");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t
.click(Selector(".action-edit"))
.expect(Selector(".input-description textarea").value)
.expect(albumdialog.description.value)
.eql("Last holiday")
.expect(Selector(".input-category input").value)
.expect(albumdialog.category.value)
.eql("Mountains")
.expect(Selector(".input-location input").value)
.eql("USA")
.typeText(Selector(".input-title input"), "Kanada", { replace: true })
.click(Selector(".input-category input"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(Selector(".input-description textarea"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(Selector(".input-location input"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(".action-confirm");
await page.openNav();
await t.click(Selector(".nav-folders"));
await page.search("Kanada");
.expect(albumdialog.location.value)
.eql("USA");
await t
.expect(Selector("button.action-title-edit").nth(0).innerText)
.typeText(albumdialog.title, "Kanada", { replace: true })
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.location)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.dialogSave);
await menu.openPage("folders");
await toolbar.search("Kanada");
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("Kanada")
.expect(Selector('div[title="Description"]').innerText)
.expect(page.cardDescription.nth(0).innerText)
.notContains("We went to ski")
.expect(Selector("div.caption").nth(0).innerText)
.notContains("USA");
});
test.meta("testID", "folders-002")("Download folders", async (t) => {
await page.openNav();
await t.click(Selector(".nav-folders"));
await page.checkButtonVisibility("download", true, true);
});
//TODO test that sharing link works as expected
test.meta("testID", "folders-003")("Create, Edit, delete sharing link", async (t) => {
await page.testCreateEditDeleteSharingLink("folders");
/*await page.openNav();
await t.click(Selector(".nav-folders"));
const FirstAlbum = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await page.selectFromUID(FirstAlbum);
const clipboardCount = await Selector("span.count-clipboard");
await t
.expect(clipboardCount.textContent)
.eql("1")
.click(Selector("button.action-menu"))
.click(Selector("button.action-share"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0));
const InitialUrl = await Selector(".action-url").innerText;
const InitialSecret = await Selector(".input-secret input").value;
const InitialExpire = await Selector("div.v-select__selections").innerText;
await t
.expect(InitialUrl)
.notContains("secretfortesting")
.expect(InitialExpire)
.contains("Never")
.typeText(Selector(".input-secret input"), "secretForTesting", { replace: true })
.click(Selector(".input-expires input"))
.click(Selector("div").withText("After 1 day").parent('div[role="listitem"]'))
.click(Selector("button.action-save"))
.click(Selector("button.action-close"));
await page.clearSelection();
await t
.click(Selector("a.is-album").withAttribute("data-uid", FirstAlbum))
.click(Selector("button.action-share"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0));
const UrlAfterChange = await Selector(".action-url").innerText;
const ExpireAfterChange = await Selector("div.v-select__selections").innerText;
await t
.expect(UrlAfterChange)
.contains("secretfortesting")
.expect(ExpireAfterChange)
.contains("After 1 day")
.typeText(Selector(".input-secret input"), InitialSecret, { replace: true })
.click(Selector(".input-expires input"))
.click(Selector("div").withText("Never").parent('div[role="listitem"]'))
.click(Selector("button.action-save"))
.click(Selector("div.v-expansion-panel__header__icon"));
const LinkCount = await Selector(".action-url").count;
await t.click(".action-add-link");
const LinkCountAfterAdd = await Selector(".action-url").count;
await t
.expect(LinkCountAfterAdd)
.eql(LinkCount + 1)
.click(Selector("div.v-expansion-panel__header__icon"))
.click(Selector(".action-delete"));
const LinkCountAfterDelete = await Selector(".action-url").count;
await t
.expect(LinkCountAfterDelete)
.eql(LinkCountAfterAdd - 1)
.click(Selector("button.action-close"));
await page.openNav();
await t
.click(".nav-folders")
.click("a.uid-" + FirstAlbum + " .action-share")
.click(Selector("div.v-expansion-panel__header__icon"))
.click(Selector(".action-delete"));*/
});
test.meta("testID", "folders-004")("Create/delete album during add to album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbums = await Selector("a.is-album").count;
await page.openNav();
await t.click(Selector(".nav-folders"));
const ThirdFolder = await Selector("a.is-album").nth(2).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", ThirdFolder));
const PhotoCountInFolder = await Selector("div.is-photo").count;
const FirstPhoto = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
await page.openNav();
await t.click(Selector(".nav-folders"));
await page.selectFromUID(ThirdFolder);
await page.addSelectedToAlbum("NotYetExistingAlbumForFolder", "clone");
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterCreation = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterCreation).eql(countAlbums + 1);
await page.search("NotYetExistingAlbumForFolder");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
const PhotoCountInAlbum = await Selector("div.is-photo").count;
await t
.expect(PhotoCountInAlbum)
.eql(PhotoCountInFolder)
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok();
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.selectFromUID(AlbumUid);
await page.deleteSelected();
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterDelete = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterDelete).eql(countAlbums);
await t
.click(Selector(".nav-folders"))
.click(Selector("a.is-album").withAttribute("data-uid", ThirdFolder))
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok();
});
test.meta("testID", "folders-004")("Create/delete album-clone from folder", async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("folders");
const ThirdFolderUid = await album.getNthAlbumUid("all", 2);
await album.openAlbumWithUid(ThirdFolderUid);
const PhotoCountInFolder = await photo.getPhotoCount("all");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
await menu.openPage("folders");
await album.selectAlbumFromUID(ThirdFolderUid);
await contextmenu.triggerContextMenuAction("clone", "NotYetExistingAlbumForFolder");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
test.meta("testID", "folders-005")("No delete folder functionality", async (t) => {
await page.openNav();
await t.click(Selector(".nav-folders"));
await page.checkButtonVisibility("delete", false, false);
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbumForFolder");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountInAlbum = await photo.getPhotoCount("all");
await t.expect(PhotoCountInAlbum).eql(PhotoCountInFolder);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await menu.openPage("albums");
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
await menu.openPage("folders");
await album.openAlbumWithUid(ThirdFolderUid);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
});

View file

@ -1,220 +1,209 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import Label from "../page-model/label";
import PhotoEdit from "../page-model/photo-edit";
fixture`Test labels`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const label = new Label();
const photoedit = new PhotoEdit();
test.meta("testID", "labels-001")("Remove/Activate Add/Delete Label from photo", async (t) => {
await page.openNav();
await t.click(Selector(".nav-labels"));
const countImportantLabels = await Selector("a.is-label").count;
await t.click(Selector("button.action-show-all"));
const countAllLabels = await Selector("a.is-label").count;
await t
.expect(countAllLabels)
.gt(countImportantLabels)
.click(Selector("button.action-show-important"));
await page.search("beacon");
const LabelBeacon = await Selector("a.is-label").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-label").withAttribute("data-uid", LabelBeacon));
await page.setFilter("view", "Cards");
const PhotoBeacon = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await t.click(Selector(".action-title-edit").withAttribute("data-uid", PhotoBeacon));
const PhotoKeywords = await Selector(".input-keywords textarea").value;
await t
.expect(PhotoKeywords)
.contains("beacon")
.click(Selector("#tab-labels"))
.click(Selector("button.action-remove"), { timeout: 5000 })
.typeText(Selector(".input-label input"), "Test")
.click(Selector("button.p-photo-label-add"))
.click(Selector("#tab-details"));
const PhotoKeywordsAfterEdit = await Selector(".input-keywords textarea").value;
await t
.expect(PhotoKeywordsAfterEdit)
.contains("test")
.expect(PhotoKeywordsAfterEdit)
.notContains("beacon")
.click(Selector(".action-close"));
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("beacon");
await t.expect(Selector("div.no-results").visible).ok();
await page.search("test");
const LabelTest = await Selector("a.is-label").nth(0).getAttribute("data-uid");
await t
.click(Selector("a.is-label").withAttribute("data-uid", LabelTest))
.click(Selector(".action-title-edit").withAttribute("data-uid", PhotoBeacon))
.click(Selector("#tab-labels"))
.click(Selector(".action-delete"), { timeout: 5000 })
.click(Selector(".action-on"))
.click(Selector("#tab-details"));
const PhotoKeywordsAfterUndo = await Selector(".input-keywords textarea").value;
await t
.expect(PhotoKeywordsAfterUndo)
.contains("beacon")
.expect(PhotoKeywordsAfterUndo)
.notContains("test")
.click(Selector(".action-close"));
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("test");
await t.expect(Selector("div.no-results").visible).ok();
await page.search("beacon");
await t.expect(Selector("a").withAttribute("data-uid", LabelBeacon).visible).ok();
test.meta("testID", "labels-001").meta({ type: "smoke" })(
"Remove/Activate Add/Delete Label from photo",
async (t) => {
await menu.openPage("labels");
await toolbar.search("beacon");
const LabelBeaconUid = await label.getNthLabeltUid(0);
await label.openLabelWithUid(LabelBeaconUid);
await toolbar.setFilter("view", "Cards");
const PhotoBeaconUid = await photo.getNthPhotoUid("all", 0);
await t.click(page.cardTitle.withAttribute("data-uid", PhotoBeaconUid));
const PhotoKeywords = await photoedit.keywords.value;
await t.expect(PhotoKeywords).contains("beacon");
await t
.click(photoedit.labelsTab)
.click(photoedit.removeLabel)
.typeText(photoedit.inputLabelName, "Test")
.click(Selector(photoedit.addLabel))
.click(photoedit.detailsTab);
const PhotoKeywordsAfterEdit = await photoedit.keywords.value;
await t
.expect(PhotoKeywordsAfterEdit)
.contains("test")
.expect(PhotoKeywordsAfterEdit)
.notContains("beacon");
await t.click(photoedit.dialogClose);
await menu.openPage("labels");
await toolbar.search("beacon");
await t.expect(Selector("div.no-results").visible).ok();
await toolbar.search("test");
const LabelTest = await label.getNthLabeltUid(0);
await label.openLabelWithUid(LabelTest);
await t
.click(page.cardTitle.withAttribute("data-uid", PhotoBeaconUid))
.click(photoedit.labelsTab)
.click(photoedit.deleteLabel)
.click(photoedit.activateLabel)
.click(photoedit.detailsTab);
const PhotoKeywordsAfterUndo = await photoedit.keywords.value;
await t
.expect(PhotoKeywordsAfterUndo)
.contains("beacon")
.expect(PhotoKeywordsAfterUndo)
.notContains("test");
await t.click(photoedit.dialogClose);
await menu.openPage("labels");
await toolbar.search("test");
await t.expect(Selector("div.no-results").visible).ok();
await toolbar.search("beacon");
await album.checkAlbumVisibility(LabelBeaconUid, true);
}
);
test.meta("testID", "labels-002")("Toggle between important and all labels", async (t) => {
await menu.openPage("labels");
const ImportantLabelsCount = await label.getLabelCount();
await toolbar.triggerToolbarAction("show-all");
const AllLabelsCount = await label.getLabelCount();
await t.expect(AllLabelsCount).gt(ImportantLabelsCount);
await toolbar.triggerToolbarAction("show-important");
const ImportantLabelsCount2 = await label.getLabelCount();
await t.expect(ImportantLabelsCount).eql(ImportantLabelsCount2);
});
test.meta("testID", "labels-002")("Rename Label", async (t) => {
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("zebra");
const LabelZebra = await Selector("a.is-label").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-label").nth(0));
const FirstPhotoZebra = await Selector("div.is-photo", { timeout: 5000 })
.nth(0)
.getAttribute("data-uid");
const SecondPhotoZebra = await Selector("div.is-photo", { timeout: 5000 })
.nth(1)
.getAttribute("data-uid");
await page.setFilter("view", "Cards");
await t.click(Selector(".action-title-edit").withAttribute("data-uid", FirstPhotoZebra));
const FirstPhotoTitle = await Selector(".input-title input", { timeout: 5000 }).value;
const FirstPhotoKeywords = await Selector(".input-keywords textarea", { timeout: 5000 }).value;
test.meta("testID", "labels-003")("Rename Label", async (t) => {
await menu.openPage("labels");
await toolbar.search("zebra");
const LabelZebraUid = await label.getNthLabeltUid(0);
await label.openNthLabel(0);
const FirstPhotoZebraUid = await photo.getNthPhotoUid("all", 0);
await toolbar.setFilter("view", "Cards");
await t.click(page.cardTitle.withAttribute("data-uid", FirstPhotoZebraUid));
const FirstPhotoTitle = await photoedit.title.value;
const FirstPhotoKeywords = await photoedit.keywords.value;
await t.expect(FirstPhotoTitle).contains("Zebra").expect(FirstPhotoKeywords).contains("zebra");
await t
.expect(FirstPhotoTitle)
.contains("Zebra")
.expect(FirstPhotoKeywords)
.contains("zebra")
.click(Selector("#tab-labels"))
.click(Selector("div.p-inline-edit"))
.typeText(Selector(".input-rename input"), "Horse", { replace: true })
.click(photoedit.labelsTab)
.click(photoedit.openInlineEdit)
.typeText(photoedit.inputLabelRename, "Horse", { replace: true })
.pressKey("enter")
.click(Selector("#tab-details"));
const FirstPhotoTitleAfterEdit = await Selector(".input-title input", { timeout: 5000 }).value;
const FirstPhotoKeywordsAfterEdit = await Selector(".input-keywords textarea", { timeout: 5000 })
.value;
.click(photoedit.detailsTab);
const FirstPhotoTitleAfterEdit = await photoedit.title.value;
const FirstPhotoKeywordsAfterEdit = await photoedit.keywords.value;
await t
.expect(FirstPhotoTitleAfterEdit)
.contains("Horse")
.expect(FirstPhotoKeywordsAfterEdit)
.contains("horse")
.expect(FirstPhotoTitleAfterEdit)
.notContains("Zebra")
.click(Selector(".action-close"));
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("horse");
.notContains("Zebra");
await t.click(photoedit.dialogClose);
await menu.openPage("labels");
await toolbar.search("horse");
await album.checkAlbumVisibility(LabelZebraUid, true);
await label.openLabelWithUid(LabelZebraUid);
await photo.checkPhotoVisibility(FirstPhotoZebraUid, true);
await t
.expect(Selector("a").withAttribute("data-uid", LabelZebra).visible)
.ok()
.click(Selector("a.is-label").withAttribute("data-uid", LabelZebra))
.expect(Selector("div").withAttribute("data-uid", SecondPhotoZebra).visible)
.ok()
.click(Selector(".action-title-edit").withAttribute("data-uid", FirstPhotoZebra))
.click(Selector("#tab-labels"))
.click(Selector("div.p-inline-edit"))
.typeText(Selector(".input-rename input"), "Zebra", { replace: true })
.click(page.cardTitle.withAttribute("data-uid", FirstPhotoZebraUid))
.click(photoedit.labelsTab)
.click(photoedit.openInlineEdit)
.typeText(photoedit.inputLabelRename, "Zebra", { replace: true })
.pressKey("enter")
.click(Selector(".action-close"));
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("horse");
.click(photoedit.dialogClose);
await menu.openPage("labels");
await toolbar.search("horse");
await t.expect(Selector("div.no-results").visible).ok();
});
test.meta("testID", "labels-003")("Add label to album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.search("Christmas");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
const PhotoCount = await Selector("div.is-photo").count;
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("landscape");
const LabelLandscape = await Selector("a.is-label").nth(1).getAttribute("data-uid");
await t.click(Selector("a.is-label").withAttribute("data-uid", LabelLandscape));
const FirstPhotoLandscape = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
const SecondPhotoLandscape = await Selector("div.is-photo").nth(1).getAttribute("data-uid");
const ThirdPhotoLandscape = await Selector("div.is-photo").nth(2).getAttribute("data-uid");
const FourthPhotoLandscape = await Selector("div.is-photo").nth(3).getAttribute("data-uid");
const FifthPhotoLandscape = await Selector("div.is-photo").nth(4).getAttribute("data-uid");
const SixthPhotoLandscape = await Selector("div.is-photo").nth(5).getAttribute("data-uid");
await page.openNav();
await t.click(".nav-labels");
await page.selectFromUID(LabelLandscape);
await menu.openPage("albums");
await toolbar.search("Christmas");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCount = await photo.getPhotoCount("all");
await menu.openPage("labels");
await toolbar.search("landscape");
const LabelLandscape = await label.getNthLabeltUid(1);
await label.openLabelWithUid(LabelLandscape);
const FirstPhotoLandscape = await photo.getNthPhotoUid("all", 0);
const SecondPhotoLandscape = await photo.getNthPhotoUid("all", 1);
const ThirdPhotoLandscape = await photo.getNthPhotoUid("all", 2);
const FourthPhotoLandscape = await photo.getNthPhotoUid("all", 3);
const FifthPhotoLandscape = await photo.getNthPhotoUid("all", 4);
const SixthPhotoLandscape = await photo.getNthPhotoUid("all", 5);
await menu.openPage("labels");
await label.triggerHoverAction("uid", LabelLandscape, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("album", "Christmas");
await menu.openPage("albums");
await album.openAlbumWithUid(AlbumUid);
const PhotoCountAfterAdd = await photo.getPhotoCount("all");
const clipboardCount = await Selector("span.count-clipboard");
await t.expect(clipboardCount.textContent).eql("1");
await page.addSelectedToAlbum("Christmas", "album");
await page.openNav();
await t
.click(Selector(".nav-albums"))
.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
const PhotoCountAfterAdd = await Selector("div.is-photo", { timeout: 5000 }).count;
await t.expect(PhotoCountAfterAdd).eql(PhotoCount + 6);
await page.selectPhotoFromUID(FirstPhotoLandscape);
await page.selectPhotoFromUID(SecondPhotoLandscape);
await page.selectPhotoFromUID(ThirdPhotoLandscape);
await page.selectPhotoFromUID(FourthPhotoLandscape);
await page.selectPhotoFromUID(FifthPhotoLandscape);
await page.selectPhotoFromUID(SixthPhotoLandscape);
await page.removeSelected();
const PhotoCountAfterDelete = await Selector("div.is-photo", { timeout: 5000 }).count;
await photo.triggerHoverAction("uid", FirstPhotoLandscape, "select");
await photo.triggerHoverAction("uid", SecondPhotoLandscape, "select");
await photo.triggerHoverAction("uid", ThirdPhotoLandscape, "select");
await photo.triggerHoverAction("uid", FourthPhotoLandscape, "select");
await photo.triggerHoverAction("uid", FifthPhotoLandscape, "select");
await photo.triggerHoverAction("uid", SixthPhotoLandscape, "select");
await contextmenu.triggerContextMenuAction("remove", "");
const PhotoCountAfterDelete = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterDelete).eql(PhotoCountAfterAdd - 6);
});
test.meta("testID", "labels-004")("Delete label", async (t) => {
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("dome");
const LabelDome = await Selector("a.is-label", { timeout: 5000 }).nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-label").withAttribute("data-uid", LabelDome));
const FirstPhotoDome = await Selector("div.is-photo", { timeout: 5000 })
.nth(0)
.getAttribute("data-uid");
await page.openNav();
await t.click(".nav-labels");
await page.selectFromUID(LabelDome);
const clipboardCount = await Selector("span.count-clipboard", { timeout: 5000 });
await t.expect(clipboardCount.textContent).eql("1");
await page.deleteSelected();
await page.search("dome");
await t.expect(Selector("div.no-results").visible).ok();
await page.openNav();
await t.click(".nav-browse");
await page.setFilter("view", "Cards");
await t
.click(Selector(".action-title-edit").withAttribute("data-uid", FirstPhotoDome))
.click(Selector("#tab-labels"))
.expect(Selector("td").withText("No labels found").visible)
.ok()
.typeText(Selector(".input-label input"), "Dome")
.click(Selector("button.p-photo-label-add"));
});
await menu.openPage("labels");
await toolbar.search("dome");
const LabelDomeUid = await label.getNthLabeltUid(0);
await label.openLabelWithUid(LabelDomeUid);
const FirstPhotoDomeUid = await photo.getNthPhotoUid("all", 0);
await menu.openPage("labels");
await label.triggerHoverAction("uid", LabelDomeUid, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("delete", "");
await toolbar.search("dome");
/*Does not work on sqlite
test.skip("testID", "labels-005")("Check label count", async (t) => {
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("cat");
const LabelCat = await Selector("a.is-label", { timeout: 55000 }).nth(0).getAttribute("data-uid");
const CatCaption = await Selector("a[data-uid=" + LabelCat + "] div.caption").innerText;
console.log(CatCaption);
await t.click(Selector("a.is-label").withAttribute("data-uid", LabelCat));
const countPhotosCat = await Selector("div.is-photo").count;
await t.expect(CatCaption).contains(countPhotosCat.toString());
console.log(countPhotosCat);
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("people");
const LabelPeople = await Selector("a.is-label", { timeout: 55000 }).nth(0).getAttribute("data-uid");
const PeopleCaption = await Selector("a[data-uid=" + LabelCat + "] div.caption").innerText;
console.log(PeopleCaption);
await t.click(Selector("a.is-label").withAttribute("data-uid", LabelPeople));
const countPhotosPeople = await Selector("div.is-photo").count;
await t.expect(CatCaption).contains(countPhotosPeople.toString());
console.log(countPhotosPeople);
});*/
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("browse");
await toolbar.setFilter("view", "Cards");
await t
.click(page.cardTitle.withAttribute("data-uid", FirstPhotoDomeUid))
.click(photoedit.labelsTab);
await t.expect(Selector("td").withText("No labels found").visible).ok();
await t.typeText(photoedit.inputLabelName, "Dome").click(photoedit.addLabel);
});

View file

@ -1,26 +1,37 @@
import { Selector } from "testcafe";
import testcafeconfig from "../testcafeconfig";
import Page from "../page-model";
import Menu from "../../page-model/menu";
import Toolbar from "../../page-model/toolbar";
import Page from "../../page-model/page";
import Library from "../../page-model/library";
fixture`Import file from folder`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const page = new Page();
test.meta("testID", "library-import-001")("Import files from folder using copy", async (t) => {
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("bakery");
await t.expect(Selector("div.no-results").visible).ok();
await page.openNav();
await t
.click(Selector(".nav-library"))
.click(Selector("#tab-library-import"))
.typeText(Selector(".input-import-folder input"), "/B", { replace: true })
.click(Selector("div.v-list__tile__title").nth(0))
.click(Selector(".action-import"))
//TODO replace wait
.wait(60000);
await page.openNav();
await t.click(Selector(".nav-labels")).click(Selector(".action-reload"));
await page.search("bakery");
await t.expect(Selector(".is-label").visible).ok();
});
const library = new Library();
test.meta("testID", "library-import-001").meta({ type: "smoke" })(
"Import files from folder using copy",
async (t) => {
await menu.openPage("labels");
await toolbar.search("bakery");
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("library");
await t
.click(library.importTab)
.typeText(library.openImportFolderSelect, "/B", { replace: true })
.click(page.selectOption.nth(0))
.click(library.import)
//TODO replace wait
.wait(60000);
await menu.openPage("labels");
await toolbar.triggerToolbarAction("reload");
await toolbar.search("bakery");
await t.expect(Selector(".is-label").visible).ok();
}
);

View file

@ -1,116 +1,132 @@
import { Selector } from "testcafe";
import testcafeconfig from "../testcafeconfig";
import Page from "../page-model";
import Menu from "../../page-model/menu";
import Toolbar from "../../page-model/toolbar";
import Photo from "../../page-model/photo";
import Page from "../../page-model/page";
import Library from "../../page-model/library";
import Album from "../../page-model/album";
fixture`Test index`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const photo = new Photo();
const page = new Page();
test.meta("testID", "library-index-001")("Index files from folder", async (t) => {
await page.openNav();
await t.click(Selector(".nav-labels"));
await page.search("cheetah");
await t.expect(Selector("div.no-results").visible).ok();
await page.openNav();
await t.click(Selector(".nav-moments"));
const MomentCount = await Selector("a.is-album").count;
await page.openNav();
await t.click(Selector(".nav-calendar"));
if (t.browser.platform === "mobile") {
await t.navigateTo("/calendar?q=December%202013");
} else {
await page.search("December 2013");
const library = new Library();
const album = new Album();
test.meta("testID", "library-index-001").meta({ type: "smoke" })(
"Index files from folder",
async (t) => {
await menu.openPage("labels");
await toolbar.search("cheetah");
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("moments");
const MomentCount = await album.getAlbumCount("all");
await menu.openPage("calendar");
if (t.browser.platform === "mobile") {
await t.navigateTo("/calendar?q=December%202013");
} else {
await toolbar.search("December 2013");
}
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("folders");
if (t.browser.platform === "mobile") {
await t.navigateTo("/folders?q=moment");
} else {
await toolbar.search("Moment");
}
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("states");
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/states?q=KwaZulu");
} else {
await toolbar.search("KwaZulu");
}
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("originals");
await t.click(Selector(".is-folder").withText("moment"));
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("monochrome");
const MonochromeCount = await photo.getPhotoCount("all");
await menu.openPage("library");
await t
.click(library.indexTab)
.click(library.indexFolderSelect)
.click(page.selectOption.withText("/moment"))
.click(library.index)
//TODO replace wait
.wait(50000);
await t.expect(Selector("span").withText("Done.").visible, { timeout: 60000 }).ok();
await menu.openPage("labels");
await toolbar.triggerToolbarAction("reload");
await toolbar.search("cheetah");
await t.expect(Selector(".is-label").visible).ok();
await menu.openPage("moments");
const MomentCountAfterIndex = await album.getAlbumCount("all");
await t
.expect(MomentCountAfterIndex)
.gt(MomentCount)
.click(Selector("a").withText("South Africa 2013"))
.expect(Selector(".is-photo").visible)
.ok();
await menu.openPage("calendar");
await toolbar.triggerToolbarAction("reload");
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/calendar?q=December%202013");
} else {
await toolbar.search("December 2013");
}
await t.expect(Selector(".is-album").visible).ok();
await menu.openPage("folders");
await toolbar.triggerToolbarAction("reload");
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/folders?q=moment");
} else {
await toolbar.search("Moment");
}
await t.expect(Selector(".is-album", { timeout: 15000 }).visible).ok();
await menu.openPage("states");
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/states?q=KwaZulu");
} else {
await toolbar.search("KwaZulu");
}
await t.expect(Selector(".is-album").visible).ok();
await menu.openPage("originals");
await t.expect(Selector(".is-folder").withText("moment").visible, { timeout: 60000 }).ok();
await menu.openPage("monochrome");
const MonochromeCountAfterIndex = await photo.getPhotoCount("all");
await t.expect(MonochromeCountAfterIndex).gt(MonochromeCount);
}
await t.expect(Selector("div.no-results").visible).ok();
await page.openNav();
await t.click(Selector(".nav-folders"));
if (t.browser.platform === "mobile") {
await t.navigateTo("/folders?q=moment");
} else {
await page.search("Moment");
}
await t.expect(Selector("div.no-results").visible).ok();
await page.openNav();
await t.click(Selector(".nav-places + div > i")).click(Selector(".nav-states"));
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/states?q=KwaZulu");
} else {
await page.search("KwaZulu");
}
await t.expect(Selector("div.no-results").visible).ok();
await page.openNav();
await t
.click(Selector(".nav-library+div>i"))
.click(Selector(".nav-originals"))
.click(Selector(".is-folder").withText("moment"))
.expect(Selector("div.no-results").visible)
.ok();
await page.openNav();
await t.click(Selector(".nav-browse + div")).click(Selector(".nav-monochrome"));
const MonochromeCount = await Selector("a.is-album").count;
await page.openNav();
await t
.click(Selector(".nav-library"))
.click(Selector("#tab-library-index"))
.click(Selector(".input-index-folder input"))
.click(Selector("div.v-list__tile__title").withText("/moment"))
.click(Selector(".action-index"))
//TODO replace wait
.wait(50000)
.expect(Selector("span").withText("Done.").visible, { timeout: 60000 })
.ok();
await page.openNav();
await t.click(Selector(".nav-labels")).click(Selector(".action-reload"));
await page.search("cheetah");
await t.expect(Selector(".is-label").visible).ok();
await page.openNav();
await t.click(Selector(".nav-moments"));
const MomentCountAfterIndex = await Selector("a.is-album").count;
await t
.expect(MomentCountAfterIndex)
.gt(MomentCount)
.click(Selector("a").withText("South Africa 2013"))
.expect(Selector(".is-photo").visible)
.ok();
await page.openNav();
await t.click(Selector(".nav-calendar")).click(Selector(".action-reload"));
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/calendar?q=December%202013");
} else {
await page.search("December 2013");
}
await t.expect(Selector(".is-album").visible).ok();
await page.openNav();
await t.click(Selector(".nav-folders")).click(Selector(".action-reload"));
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/folders?q=moment");
} else {
await page.search("Moment");
}
await t.expect(Selector(".is-album").visible).ok();
await page.openNav();
await t
.click(Selector(".nav-places+div>i"))
.click(Selector(".nav-states"))
.click(Selector(".action-reload"));
if (t.browser.platform === "mobile") {
console.log(t.browser.platform);
await t.navigateTo("/states?q=KwaZulu");
} else {
await page.search("KwaZulu");
}
await t.expect(Selector(".is-album").visible).ok();
await page.openNav();
await t
.click(Selector(".nav-library+div>i"))
.click(Selector(".nav-originals"))
.click(Selector(".action-reload"))
.expect(Selector(".is-folder").withText("moment").visible, { timeout: 60000 })
.ok();
await page.openNav();
await t.click(Selector(".nav-browse + div")).click(Selector(".nav-monochrome"));
const MonochromeCountAfterIndex = await Selector(".is-photo.type-image", { timeout: 5000 }).count;
await t.expect(MonochromeCountAfterIndex).gt(MonochromeCount);
});
);

View file

@ -1,210 +1,149 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test moments`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "moments-001")("Update moment details", async (t) => {
await menu.openPage("moments");
await toolbar.search("Nature");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("Nature");
await t.click(page.cardTitle.nth(0));
test.meta("testID", "moments-001")("Update moment", async (t) => {
await page.openNav();
await t.click(Selector(".nav-moments"));
await page.search("Nature");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t
.expect(Selector("button.action-title-edit").nth(0).innerText)
.contains("Nature")
.click(Selector(".action-title-edit").nth(0))
.expect(Selector(".input-title input").value)
.expect(albumdialog.title.value)
.eql("Nature & Landscape")
.expect(Selector(".input-location input").value)
.expect(albumdialog.location.value)
.eql("")
.typeText(Selector(".input-title input"), "Winter", { replace: true })
.typeText(Selector(".input-location input"), "Snow-Land", { replace: true })
.expect(Selector(".input-description textarea").value)
.expect(albumdialog.description.value)
.eql("")
.expect(Selector(".input-category input").value)
.eql("")
.typeText(Selector(".input-description textarea"), "We went to ski")
.typeText(Selector(".input-category input"), "Mountains")
.expect(albumdialog.category.value)
.eql("");
await t
.typeText(albumdialog.title, "Winter", { replace: true })
.typeText(albumdialog.location, "Snow-Land", { replace: true })
.typeText(albumdialog.description, "We went to ski")
.typeText(albumdialog.category, "Mountains")
.pressKey("enter")
.click(".action-confirm")
.expect(Selector("button.action-title-edit").nth(0).innerText)
.click(albumdialog.dialogSave);
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("Winter")
.expect(Selector('div[title="Description"]').nth(0).innerText)
.expect(page.cardDescription.nth(0).innerText)
.contains("We went to ski")
.expect(Selector("div.caption").nth(1).innerText)
.contains("Mountains")
.expect(Selector("div.caption").nth(2).innerText)
.contains("Snow-Land")
.click(Selector("a.is-album").nth(0));
await t
.expect(Selector(".v-card__text").nth(0).innerText)
.contains("We went to ski")
.expect(Selector("div").withText("Winter").exists)
.ok();
await page.openNav();
await t.click(Selector(".nav-moments"));
.contains("Snow-Land");
await album.openNthAlbum(0);
await t.expect(toolbar.toolbarTitle.innerText).contains("Winter");
await t.expect(toolbar.toolbarDescription.innerText).contains("We went to ski");
await menu.openPage("moments");
if (t.browser.platform === "mobile") {
await page.search("category:Mountains");
await toolbar.search("category:Mountains");
} else {
await t
.click(Selector(".input-category"))
.click(Selector('div[role="listitem"]').withText("Mountains"));
await toolbar.setFilter("category", "Mountains");
}
await t.expect(Selector("button.action-title-edit").nth(0).innerText).contains("Winter");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
await t.expect(page.cardTitle.nth(0).innerText).contains("Winter");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t
.click(Selector(".action-edit"))
.expect(Selector(".input-description textarea").value)
.expect(albumdialog.description.value)
.eql("We went to ski")
.expect(Selector(".input-category input").value)
.expect(albumdialog.category.value)
.eql("Mountains")
.expect(Selector(".input-location input").value)
.eql("Snow-Land")
.typeText(Selector(".input-title input"), "Nature & Landscape", { replace: true })
.click(Selector(".input-category input"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(Selector(".input-description textarea"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(Selector(".input-location input"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(".action-confirm");
await page.openNav();
await t.click(Selector(".nav-moments"));
await page.search("Nature");
.expect(albumdialog.location.value)
.eql("Snow-Land");
await t
.expect(Selector("button.action-title-edit").nth(0).innerText)
.typeText(albumdialog.title, "Nature & Landscape", { replace: true })
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.location)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.dialogSave);
await menu.openPage("moments");
await toolbar.search("Nature");
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("Nature & Landscape")
.expect(Selector('div[title="Description"]').innerText)
.expect(page.cardDescription.innerText)
.notContains("We went to ski")
.expect(Selector("div.caption").nth(0).innerText)
.notContains("Snow-Land");
});
test.meta("testID", "moments-002")("Download moments", async (t) => {
await page.openNav();
await t.click(Selector(".nav-moments"));
await page.checkButtonVisibility("download", true, true);
});
//TODO test that sharing link works as expected
test.meta("testID", "moments-003")("Create, Edit, delete sharing link", async (t) => {
test.meta("testID", "moments-002")("Create, Edit, delete sharing link for moment", async (t) => {
await page.testCreateEditDeleteSharingLink("moments");
/*await page.openNav();
await t.click(Selector(".nav-moments"));
const FirstAlbum = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await page.selectFromUID(FirstAlbum);
const clipboardCount = await Selector("span.count-clipboard");
await t
.expect(clipboardCount.textContent)
.eql("1")
.click(Selector("button.action-menu"))
.click(Selector("button.action-share"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0));
const InitialUrl = await Selector(".action-url").innerText;
const InitialSecret = await Selector(".input-secret input").value;
const InitialExpire = await Selector("div.v-select__selections").innerText;
await t
.expect(InitialUrl)
.notContains("secretfortesting")
.expect(InitialExpire)
.contains("Never")
.typeText(Selector(".input-secret input"), "secretForTesting", { replace: true })
.click(Selector(".input-expires input"))
.click(Selector("div").withText("After 1 day").parent('div[role="listitem"]'))
.click(Selector("button.action-save"))
.click(Selector("button.action-close"));
await page.clearSelection();
await t
.click(Selector("a.is-album").withAttribute("data-uid", FirstAlbum))
.click(Selector("button.action-share"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0));
const UrlAfterChange = await Selector(".action-url").innerText;
const ExpireAfterChange = await Selector("div.v-select__selections").innerText;
await t
.expect(UrlAfterChange)
.contains("secretfortesting")
.expect(ExpireAfterChange)
.contains("After 1 day")
.typeText(Selector(".input-secret input"), InitialSecret, { replace: true })
.click(Selector(".input-expires input"))
.click(Selector("div").withText("Never").parent('div[role="listitem"]'))
.click(Selector("button.action-save"))
.click(Selector("div.v-expansion-panel__header__icon"));
const LinkCount = await Selector(".action-url").count;
await t.click(".action-add-link");
const LinkCountAfterAdd = await Selector(".action-url").count;
await t
.expect(LinkCountAfterAdd)
.eql(LinkCount + 1)
.click(Selector("div.v-expansion-panel__header__icon"))
.click(Selector(".action-delete"));
const LinkCountAfterDelete = await Selector(".action-url").count;
await t
.expect(LinkCountAfterDelete)
.eql(LinkCountAfterAdd - 1)
.click(Selector("button.action-close"));
await page.openNav();
await t
.click(".nav-moments")
.click("a.uid-" + FirstAlbum + " .action-share")
.click(Selector("div.v-expansion-panel__header__icon"))
.click(Selector(".action-delete"));*/
});
test.meta("testID", "moments-004")("Create/delete album during add to album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbums = await Selector("a.is-album").count;
await page.openNav();
await t.click(Selector(".nav-moments"));
const FirstMoment = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", FirstMoment));
const PhotoCountInMoment = await Selector("div.is-photo").count;
const FirstPhoto = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
const SecondPhoto = await Selector("div.is-photo.type-image").nth(1).getAttribute("data-uid");
await page.openNav();
await t.click(Selector(".nav-moments"));
await page.selectFromUID(FirstMoment);
await page.addSelectedToAlbum("NotYetExistingAlbumForMoment", "clone");
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterCreation = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterCreation).eql(countAlbums + 1);
await page.search("NotYetExistingAlbumForMoment");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
const PhotoCountInAlbum = await Selector("div.is-photo").count;
await t
.expect(PhotoCountInAlbum)
.eql(PhotoCountInMoment)
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.ok();
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.selectFromUID(AlbumUid);
await page.deleteSelected();
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterDelete = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterDelete).eql(countAlbums);
await t
.click(Selector(".nav-moments"))
.click(Selector("a.is-album").withAttribute("data-uid", FirstMoment))
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.ok();
});
test.meta("testID", "moments-003")("Create/delete album-clone from moment", async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("moments");
const FirstMomentUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(FirstMomentUid);
const PhotoCountInMoment = await photo.getPhotoCount("all");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await menu.openPage("moments");
await album.selectAlbumFromUID(FirstMomentUid);
await contextmenu.triggerContextMenuAction("clone", "NotYetExistingAlbumForMoment");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
test.meta("testID", "moments-005")("Delete moments button visible", async (t) => {
await page.openNav();
await t.click(Selector(".nav-moments"));
await page.checkButtonVisibility("delete", true, false);
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbumForMoment");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountInAlbum = await photo.getPhotoCount("all");
await t.expect(PhotoCountInAlbum).eql(PhotoCountInMoment);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await menu.openPage("albums");
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
await menu.openPage("moments");
await album.openAlbumWithUid(FirstMomentUid);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
});

View file

@ -1,68 +1,99 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import Menu from "../page-model/menu";
import Photo from "../page-model/photo";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Album from "../page-model/album";
import Originals from "../page-model/originals";
fixture`Test files`.page`${testcafeconfig.url}`;
const page = new Page();
const menu = new Menu();
const photo = new Photo();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const album = new Album();
const originals = new Originals();
test.meta("testID", "originals-001").meta({ type: "smoke" })("Navigate in originals", async (t) => {
await menu.openPage("originals");
await t.click(Selector("button").withText("Vacation"));
const FirstItemInVacationName = await Selector("div.result", { timeout: 15000 }).nth(0).innerText;
const KanadaFolderUid = await originals.getNthFolderUid(0);
const SecondItemInVacationName = await Selector("div.result").nth(1).innerText;
test.meta("testID", "originals-001")("Add original files to album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.search("KanadaVacation");
await t.expect(Selector("div.no-results").visible).ok();
await page.openNav();
await t
.click(Selector("div.nav-library + div"))
.click(Selector(".nav-originals"))
.click(Selector("button").withText("Vacation"));
const FirstItemInVacation = await Selector("div.result").nth(0).innerText;
const KanadaUid = await Selector("div.result").nth(0).getAttribute("data-uid");
const SecondItemInVacation = await Selector("div.result").nth(1).innerText;
await t
.expect(FirstItemInVacation)
.expect(FirstItemInVacationName)
.contains("Kanada")
.expect(SecondItemInVacation)
.contains("Korsika")
.click(Selector("button").withText("Kanada"));
.expect(SecondItemInVacationName)
.contains("Korsika");
await originals.openFolderWithUid(KanadaFolderUid);
const FirstItemInKanadaName = await Selector("div.result").nth(0).innerText;
const SecondItemInKanadaName = await Selector("div.result").nth(1).innerText;
const FirstItemInKanada = await Selector("div.result").nth(0).innerText;
const SecondItemInKanada = await Selector("div.result").nth(1).innerText;
await t
.expect(FirstItemInKanada)
.expect(FirstItemInKanadaName)
.contains("BotanicalGarden")
.expect(SecondItemInKanada)
.contains("originals-001_2.jpg")
.click(Selector("button").withText("BotanicalGarden"))
.click(Selector('a[href="/library/files/Vacation"]'));
await page.selectPhotoFromUID(KanadaUid);
const clipboardCount = await Selector("span.count-clipboard", { timeout: 5000 });
await t.expect(clipboardCount.textContent).eql("1");
await page.addSelectedToAlbum("KanadaVacation", "album");
await page.openNav();
await t
.click(Selector(".nav-albums"));
await page.search("KanadaVacation");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").nth(0));
const PhotoCountAfterAdd = await Selector("div.is-photo", { timeout: 5000 }).count;
await t.expect(PhotoCountAfterAdd).eql(2);
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.selectFromUID(AlbumUid);
await page.deleteSelected();
.expect(SecondItemInKanadaName)
.contains("originals-001_2.jpg");
await t.click(Selector("button").withText("BotanicalGarden"));
const FirstItemInBotanicalGardenName = await Selector("div.result", { timeout: 15000 }).nth(0)
.innerText;
await t.expect(FirstItemInBotanicalGardenName).contains("originals-001_1.jpg");
await t.click(Selector('a[href="/library/files/Vacation"]'));
const FolderCount = await originals.getFolderCount();
await t.expect(FolderCount).eql(2);
});
test.meta("testID", "originals-002")("Download original files", async (t) => {
await page.openNav();
await t.click(Selector("div.nav-library + div")).click(Selector(".nav-originals"));
const FirstFile = await Selector("div.is-file").nth(0).getAttribute("data-uid");
await page.selectPhotoFromUID(FirstFile);
const clipboardCount = await Selector("span.count-clipboard", { timeout: 5000 });
await t
.expect(clipboardCount.textContent)
.eql("1")
.click(Selector("button.action-menu"))
.expect(Selector("button.action-download").visible)
.ok();
test.meta("testID", "originals-002").meta({ type: "smoke" })(
"Add original files to album",
async (t) => {
await menu.openPage("albums");
await toolbar.search("KanadaVacation");
await t.expect(Selector("div.no-results").visible).ok();
await menu.openPage("originals");
await t.click(Selector("button").withText("Vacation"));
const KanadaFolderUid = await originals.getNthFolderUid(0);
await originals.openFolderWithUid(KanadaFolderUid);
const FilesCountInKanada = await originals.getFileCount();
await t.click(Selector("button").withText("BotanicalGarden"));
const FilesCountInKanadaSubfolder = await originals.getFileCount();
await t.navigateTo("/library/files/Vacation");
await originals.triggerHoverAction("is-folder", "uid", KanadaFolderUid, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("album", "KanadaVacation");
await menu.openPage("albums");
await toolbar.search("KanadaVacation");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountAfterAdd = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterAdd).eql(FilesCountInKanada + FilesCountInKanadaSubfolder);
await menu.openPage("albums");
await album.triggerHoverAction("uid", AlbumUid, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("delete", "");
}
);
test.meta("testID", "originals-003")("Download available in originals", async (t) => {
await menu.openPage("originals");
const FirstFile = await originals.getNthFileUid(0);
await originals.triggerHoverAction("is-file", "uid", FirstFile, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.checkContextMenuActionAvailability("download", true);
await contextmenu.clearSelection();
const FirstFolder = await originals.getNthFolderUid(0);
await originals.triggerHoverAction("is-folder", "uid", FirstFolder, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.checkContextMenuActionAvailability("download", true);
await contextmenu.clearSelection();
});

View file

@ -1,663 +0,0 @@
import { Selector, t } from "testcafe";
import { RequestLogger } from "testcafe";
const logger = RequestLogger(/http:\/\/localhost:2343\/api\/v1\/*/, {
logResponseHeaders: true,
logResponseBody: true,
});
export default class Page {
constructor() {
this.view = Selector("div.p-view-select", { timeout: 15000 });
this.camera = Selector("div.p-camera-select", { timeout: 15000 });
this.countries = Selector("div.p-countries-select", { timeout: 15000 });
this.time = Selector("div.p-time-select", { timeout: 15000 });
this.search1 = Selector("div.input-search input", { timeout: 15000 });
}
async setFilter(filter, option) {
let filterSelector = "";
switch (filter) {
case "view":
filterSelector = "div.p-view-select";
break;
case "camera":
filterSelector = "div.p-camera-select";
break;
case "time":
filterSelector = "div.p-time-select";
break;
case "countries":
filterSelector = "div.p-countries-select";
break;
default:
throw "unknown filter";
}
if (!(await Selector(filterSelector).visible)) {
await t.click(Selector(".p-expand-search"));
}
await t.click(filterSelector, { timeout: 15000 });
if (option) {
await t.click(Selector('div[role="listitem"]').withText(option), { timeout: 15000 });
} else {
await t.click(Selector('div[role="listitem"]').nth(1), { timeout: 15000 });
}
}
async search(term) {
await t
.typeText(this.search1, term, { replace: true })
.pressKey("enter")
.wait(10000)
.expect(this.search1.value)
.contains(term);
}
async openNav() {
if (await Selector("button.nav-show").exists) {
await t.click(Selector("button.nav-show"));
} else if (await Selector("div.nav-expand").exists) {
await t.click(Selector("div.nav-expand i"));
}
}
async selectFromUID(uid) {
await t
.hover(Selector("a").withAttribute("data-uid", uid))
.click(Selector(`.uid-${uid} .input-select`));
}
async selectPhotoFromUID(uid) {
await t
.hover(Selector("div").withAttribute("data-uid", uid))
.click(Selector(`.uid-${uid} .input-select`));
}
async selectFromUIDInFullscreen(uid) {
await t.hover(Selector("div").withAttribute("data-uid", uid));
if (await Selector(`.uid-${uid} .action-fullscreen`).exists) {
await t.click(Selector(`.uid-${uid} .action-fullscreen`));
} else {
await t.click(Selector("div").withAttribute("data-uid", uid));
}
await t
.expect(Selector("#photo-viewer").visible)
.ok()
.click(Selector('button[title="Select"]'))
.click(Selector(".action-close", { timeout: 4000 }));
}
async toggleSelectNthPhoto(nPhoto) {
await t
.hover(Selector(".is-photo.type-image", { timeout: 4000 }).nth(nPhoto))
.click(Selector(".is-photo.type-image .input-select").nth(nPhoto));
}
async toggleLike(uid) {
await t.click(Selector(`.uid-${uid} .input-favorite`));
}
async archiveSelected() {
if (!(await Selector("#t-clipboard button.action-archive").visible)) {
await t.click(Selector("button.action-menu", { timeout: 5000 }));
}
if (t.browser.platform === "mobile") {
if (!(await Selector("#t-clipboard button.action-archive").visible)) {
await t.click(Selector("button.action-menu", { timeout: 5000 }));
if (!(await Selector("#t-clipboard button.action-archive").visible)) {
await t.click(Selector("button.action-menu", { timeout: 5000 }));
}
if (!(await Selector("#t-clipboard button.action-archive").visible)) {
await t.click(Selector("button.action-menu", { timeout: 5000 }));
}
}
}
await t.click(Selector("#t-clipboard button.action-archive", { timeout: 5000 }));
}
async privateSelected() {
await t.click(Selector("button.action-menu", { timeout: 5000 }));
if (!(await Selector("button.action-private").visible)) {
await t.click(Selector("button.action-menu", { timeout: 5000 }));
if (!(await Selector("button.action-private").visible)) {
await t.click(Selector("button.action-menu", { timeout: 5000 }));
}
if (!(await Selector("button.action-private").visible)) {
await t.click(Selector("button.action-menu", { timeout: 5000 }));
}
}
await t.click(Selector("button.action-private", { timeout: 5000 }));
}
async restoreSelected() {
await t.click(Selector("button.action-menu")).click(Selector("button.action-restore"));
}
async editSelected() {
if (await Selector("button.action-edit").visible) {
await t.click(Selector("button.action-edit"));
} else if (await Selector("button.action-menu").exists) {
await t.click(Selector("button.action-menu")).click(Selector("button.action-edit"));
}
}
async deleteSelected() {
await t
.click(Selector("button.action-menu"))
.click(Selector("button.action-delete"))
.click(Selector("button.action-confirm"));
}
async removeSelected() {
await t.click(Selector("button.action-menu")).click(Selector("button.action-remove"));
}
async addSelectedToAlbum(name, type) {
await t
.click(Selector("button.action-menu"))
.click(Selector("button.action-" + type, { timeout: 15000 }))
.typeText(Selector(".input-album input"), name, { replace: true })
.pressKey("enter");
}
async turnSwitchOff(type) {
await t
.click("#tab-info")
.expect(
Selector(".input-" + type + " input", { timeout: 8000 }).hasAttribute(
"aria-checked",
"true"
)
)
.ok()
.click(Selector(".input-" + type + " input"))
.expect(
Selector(".input-" + type + " input", { timeout: 8000 }).hasAttribute(
"aria-checked",
"false"
)
)
.ok();
}
async turnSwitchOn(type) {
await t
.click("#tab-info")
.expect(
Selector(".input-" + type + " input", { timeout: 8000 }).hasAttribute(
"aria-checked",
"false"
)
)
.ok()
.click(Selector(".input-" + type + " input"))
.expect(
Selector(".input-" + type + " input", { timeout: 8000 }).hasAttribute(
"aria-checked",
"true"
)
)
.ok();
}
async clearSelection() {
if (await Selector(".action-clear").visible) {
await t.click(Selector(".action-clear"));
} else {
await t.click(Selector(".action-menu")).click(Selector(".action-clear"));
}
}
async login(username, password) {
await t
.typeText(Selector(".input-name input"), username, { replace: true, timeout: 5000 })
.typeText(Selector(".input-password input"), password, { replace: true })
.click(Selector(".action-confirm"));
}
async logout() {
await t.click(Selector("div.nav-logout"));
}
async testCreateEditDeleteSharingLink(type) {
await this.openNav();
if (type === "states") {
await t.click(Selector(".nav-places + div"));
}
await t.click(Selector(".nav-" + type));
const FirstAlbum = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await this.selectFromUID(FirstAlbum);
const clipboardCount = await Selector("span.count-clipboard");
await t
.expect(clipboardCount.textContent)
.eql("1")
.click(Selector("button.action-menu"))
.click(Selector("button.action-share"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0));
const InitialUrl = await Selector(".action-url").innerText;
const InitialSecret = await Selector(".input-secret input").value;
const InitialExpire = await Selector("div.v-select__selections").innerText;
await t
.expect(InitialUrl)
.notContains("secretfortesting")
.expect(InitialExpire)
.contains("Never")
.typeText(Selector(".input-secret input"), "secretForTesting", { replace: true })
.click(Selector(".input-expires input"))
.click(Selector("div").withText("After 1 day").parent('div[role="listitem"]'))
.click(Selector("button.action-save"))
.click(Selector("button.action-close"));
await this.clearSelection();
await t
.click(Selector("a.is-album").withAttribute("data-uid", FirstAlbum))
.click(Selector("button.action-share"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0));
const UrlAfterChange = await Selector(".action-url").innerText;
const ExpireAfterChange = await Selector("div.v-select__selections").innerText;
await t
.expect(UrlAfterChange)
.contains("secretfortesting")
.expect(ExpireAfterChange)
.contains("After 1 day")
.typeText(Selector(".input-secret input"), InitialSecret, { replace: true })
.click(Selector(".input-expires input"))
.click(Selector("div").withText("Never").parent('div[role="listitem"]'))
.click(Selector("button.action-save"))
.click(Selector("div.v-expansion-panel__header__icon"));
const LinkCount = await Selector(".action-url").count;
await t.click(".action-add-link");
const LinkCountAfterAdd = await Selector(".action-url").count;
await t
.expect(LinkCountAfterAdd)
.eql(LinkCount + 1)
.click(Selector("div.v-expansion-panel__header__icon"))
.click(Selector(".action-delete"));
const LinkCountAfterDelete = await Selector(".action-url").count;
await t
.expect(LinkCountAfterDelete)
.eql(LinkCountAfterAdd - 1)
.click(Selector("button.action-close"));
await this.openNav();
await t
.click(".nav-" + type)
.click("a.uid-" + FirstAlbum + " .action-share")
.click(Selector("div.v-expansion-panel__header__icon"))
.click(Selector(".action-delete"));
}
async checkButtonVisibility(button, inContextMenu, inAlbum) {
const FirstAlbum = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await this.selectFromUID(FirstAlbum);
await t.click(Selector("button.action-menu"));
if (inContextMenu) {
await t.expect(Selector("button.action-" + button).visible).ok();
} else {
await t.expect(Selector("button.action-" + button).visible).notOk();
}
await this.clearSelection();
if (t.browser.platform !== "mobile") {
await t.click(Selector("a.is-album").nth(0));
if (inAlbum) {
await t.expect(Selector("button.action-" + button).visible).ok();
} else {
await t.expect(Selector("button.action-" + button).visible).notOk();
}
}
}
async deletePhotoFromUID(uid) {
await this.selectPhotoFromUID(uid);
await this.archiveSelected();
await this.openNav();
await t.click(Selector(".nav-browse + div")).click(Selector(".nav-archive"));
await this.selectPhotoFromUID(uid);
await t
.click(Selector("button.action-menu", { timeout: 5000 }))
.click(Selector(".remove"))
.click(Selector(".action-confirm"))
.expect(Selector("div").withAttribute("data-uid", uid).exists, { timeout: 5000 })
.notOk();
}
async validateDownloadRequest(request, filename, extension) {
const downloadedFileName = request.headers["content-disposition"];
await t
.expect(request.statusCode === 200)
.ok()
.expect(downloadedFileName)
.contains(filename)
.expect(downloadedFileName)
.contains(extension);
await logger.clear();
}
async checkEditFormValues(
title,
day,
month,
year,
localTime,
utcTime,
timezone,
country,
altitude,
lat,
lng,
camera,
iso,
exposure,
lens,
fnumber,
flength,
subject,
artist,
copyright,
license,
description,
keywords,
notes
) {
if (title !== "") {
await t.expect(Selector(".input-title input").value).eql(title);
}
if (day !== "") {
await t.expect(Selector(".input-day input").value).eql(day);
}
if (month !== "") {
await t.expect(Selector(".input-month input").value).eql(month);
}
if (year !== "") {
await t.expect(Selector(".input-year input").value).eql(year);
}
if (timezone !== "") {
await t.expect(Selector(".input-timezone input").value).eql(timezone);
}
if (localTime !== "") {
await t.expect(Selector(".input-local-time input").value).eql(localTime);
}
if (utcTime !== "") {
await t.expect(Selector(".input-utc-time input").value).eql(utcTime);
}
if (altitude !== "") {
await t.expect(Selector(".input-altitude input").value).eql(altitude);
}
if (country !== "") {
await t.expect(Selector("div").withText(country).visible).ok();
}
if (lat !== "") {
await t.expect(Selector(".input-latitude input").value).eql(lat);
}
if (lng !== "") {
await t.expect(Selector(".input-longitude input").value).eql(lng);
}
if (camera !== "") {
await t.expect(Selector("div").withText(camera).visible).ok();
}
if (lens !== "") {
await t.expect(Selector("div").withText(lens).visible).ok();
}
if (iso !== "") {
await t.expect(Selector(".input-iso input").value).eql(iso);
}
if (exposure !== "") {
await t.expect(Selector(".input-exposure input").value).eql(exposure);
}
if (fnumber !== "") {
await t.expect(Selector(".input-fnumber input").value).eql(fnumber);
}
if (flength !== "") {
await t.expect(Selector(".input-focal-length input").value).eql(flength);
}
if (subject !== "") {
await t.expect(Selector(".input-subject textarea").value).eql(subject);
}
if (artist !== "") {
await t.expect(Selector(".input-artist input").value).eql(artist);
}
if (copyright !== "") {
await t.expect(Selector(".input-copyright input").value).eql(copyright);
}
if (license !== "") {
await t.expect(Selector(".input-license textarea").value).eql(license);
}
if (description !== "") {
await t.expect(Selector(".input-description textarea").value).eql(description);
}
if (notes !== "") {
await t.expect(Selector(".input-notes textarea").value).contains(notes);
}
if (keywords !== "") {
await t.expect(Selector(".input-keywords textarea").value).contains(keywords);
}
}
async editPhoto(
title,
timezone,
day,
month,
year,
localTime,
altitude,
lat,
lng,
iso,
exposure,
fnumber,
flength,
subject,
artist,
copyright,
license,
description,
keywords,
notes
) {
await t
.typeText(Selector(".input-title input"), title, { replace: true })
.typeText(Selector(".input-timezone input"), timezone, { replace: true })
.click(Selector("div").withText(timezone).parent('div[role="listitem"]'))
.typeText(Selector(".input-day input"), day, { replace: true })
.pressKey("enter")
.typeText(Selector(".input-month input"), month, { replace: true })
.pressKey("enter")
.typeText(Selector(".input-year input"), year, { replace: true })
.click(Selector("div").withText(year).parent('div[role="listitem"]'))
.click(Selector(".input-local-time input"))
.pressKey("ctrl+a delete")
.typeText(Selector(".input-local-time input"), localTime, { replace: true })
.pressKey("enter")
.typeText(Selector(".input-altitude input"), altitude, { replace: true })
.typeText(Selector(".input-latitude input"), lat, { replace: true })
.typeText(Selector(".input-longitude input"), lng, { replace: true })
//.click(Selector('.input-camera input'))
//.hover(Selector('div').withText('Apple iPhone 6').parent('div[role="listitem"]'))
//.click(Selector('div').withText('Apple iPhone 6').parent('div[role="listitem"]'))
//.click(Selector('.input-lens input'))
//.click(Selector('div').withText('Apple iPhone 5s back camera 4.15mm f/2.2').parent('div[role="listitem"]'))
.typeText(Selector(".input-iso input"), iso, { replace: true })
.typeText(Selector(".input-exposure input"), exposure, { replace: true })
.typeText(Selector(".input-fnumber input"), fnumber, { replace: true })
.typeText(Selector(".input-focal-length input"), flength, { replace: true })
.typeText(Selector(".input-subject textarea"), subject, { replace: true })
.typeText(Selector(".input-artist input"), artist, { replace: true })
.typeText(Selector(".input-copyright input"), copyright, { replace: true })
.typeText(Selector(".input-license textarea"), license, { replace: true })
.typeText(Selector(".input-description textarea"), description, {
replace: true,
})
.typeText(Selector(".input-keywords textarea"), keywords)
.typeText(Selector(".input-notes textarea"), notes, { replace: true })
.click(Selector("button.action-approve"));
await t.expect(Selector(".input-latitude input").visible, { timeout: 5000 }).ok();
if (t.browser.platform === "mobile") {
await t.click(Selector("button.action-apply")).click(Selector("button.action-close"));
} else {
await t.click(Selector("button.action-done", { timeout: 5000 }));
}
}
async undoPhotoEdit(
title,
timezone,
day,
month,
year,
localTime,
altitude,
lat,
lng,
country,
iso,
exposure,
fnumber,
flength,
subject,
artist,
copyright,
license,
description,
keywords,
notes
) {
if (title.empty || title === "") {
await t.click(Selector(".input-title input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-title input"), title, { replace: true });
}
await t
.typeText(Selector(".input-day input"), day, { replace: true })
.pressKey("enter")
.typeText(Selector(".input-month input"), month, { replace: true })
.pressKey("enter")
.typeText(Selector(".input-year input"), year, { replace: true })
.pressKey("enter");
if (localTime.empty || localTime === "") {
await t.click(Selector(".input-local-time input")).pressKey("ctrl+a delete");
} else {
await t
.click(Selector(".input-local-time input"))
.pressKey("ctrl+a delete")
.typeText(Selector(".input-local-time input"), localTime, { replace: true })
.pressKey("enter");
}
if (timezone.empty || timezone === "") {
await t
.click(Selector(".input-timezone input"))
.typeText(Selector(".input-timezone input"), "UTC", { replace: true })
.pressKey("enter");
} else {
await t
.typeText(Selector(".input-timezone input"), timezone, { replace: true })
.pressKey("enter");
}
if (lat.empty || lat === "") {
await t.click(Selector(".input-latitude input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-latitude input"), lat, { replace: true });
}
if (lng.empty || lng === "") {
await t.click(Selector(".input-longitude input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-longitude input"), lng, { replace: true });
}
if (altitude.empty || altitude === "") {
await t.click(Selector(".input-altitude input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-altitude input"), altitude, { replace: true });
}
if (country.empty || country === "") {
await t.click(Selector(".input-longitude input")).pressKey("ctrl+a delete");
} else {
await t
.click(Selector(".input-country input"))
.pressKey("ctrl+a delete")
.typeText(Selector(".input-country input"), country, { replace: true })
.pressKey("enter");
}
// if (FirstPhotoCamera.empty || FirstPhotoCamera === "")
//{ await t
//.click(Selector('.input-camera input'))
// .hover(Selector('div').withText('Unknown').parent('div[role="listitem"]'))
// .click(Selector('div').withText('Unknown').parent('div[role="listitem"]'))}
//else
//{await t
// .click(Selector('.input-camera input'))
// .hover(Selector('div').withText(FirstPhotoCamera).parent('div[role="listitem"]'))
// .click(Selector('div').withText(FirstPhotoCamera).parent('div[role="listitem"]'))}
//if (FirstPhotoLens.empty || FirstPhotoLens === "")
//{ await t
// .click(Selector('.input-lens input'))
// .click(Selector('div').withText('Unknown').parent('div[role="listitem"]'))}
//else
//{await t
// .click(Selector('.input-lens input'))
// .click(Selector('div').withText(FirstPhotoLens).parent('div[role="listitem"]'))}
if (iso.empty || iso === "") {
await t.click(Selector(".input-iso input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-iso input"), iso, { replace: true });
}
if (exposure.empty || exposure === "") {
await t.click(Selector(".input-exposure input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-exposure input"), exposure, { replace: true });
}
if (fnumber.empty || fnumber === "") {
await t.click(Selector(".input-fnumber input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-fnumber input"), fnumber, { replace: true });
}
if (flength.empty || flength === "") {
await t.click(Selector(".input-focal-length input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-focal-length input"), flength, {
replace: true,
});
}
if (subject.empty || subject === "") {
await t.click(Selector(".input-subject textarea")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-subject textarea"), subject, { replace: true });
}
if (artist.empty || artist === "") {
await t.click(Selector(".input-artist input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-artist input"), artist, { replace: true });
}
if (copyright.empty || copyright === "") {
await t.click(Selector(".input-copyright input")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-copyright input"), copyright, { replace: true });
}
if (license.empty || license === "") {
await t.click(Selector(".input-license textarea")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-license textarea"), license, { replace: true });
}
if (description.empty || description === "") {
await t.click(Selector(".input-description textarea")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-description textarea"), description, {
replace: true,
});
}
if (keywords.empty || keywords === "") {
await t.click(Selector(".input-keywords textarea")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-keywords textarea"), keywords, { replace: true });
}
if (notes.empty || notes === "") {
await t.click(Selector(".input-notes textarea")).pressKey("ctrl+a delete");
} else {
await t.typeText(Selector(".input-notes textarea"), notes, { replace: true });
}
if (t.browser.platform === "mobile") {
await t.click(Selector("button.action-apply")).click(Selector("button.action-close"));
} else {
await t.click(Selector("button.action-done", { timeout: 5000 }));
}
}
}

View file

@ -1,278 +1,280 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import Menu from "../page-model/menu";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Subject from "../page-model/subject";
import PhotoEdit from "../page-model/photo-edit";
fixture`Test people`.page`${testcafeconfig.url}`;
const page = new Page();
const menu = new Menu();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const subject = new Subject();
const photoedit = new PhotoEdit();
test.meta("testID", "authentication-000")(
"Time to start instance (will be marked as unstable)",
test.meta("testID", "people-001").meta({ type: "smoke" })(
"Add name to new face and rename subject",
async (t) => {
await t.wait(5000);
await menu.openPage("people");
await t.click(subject.newTab);
await subject.triggerToolbarAction("reload", "");
const FaceCount = await subject.getFaceCount();
await t.click(subject.recognizedTab);
const SubjectCount = await subject.getSubjectCount();
await t.click(subject.newTab);
const FirstFaceID = await subject.getNthFaceUid(0);
await subject.openFaceWithUid(FirstFaceID);
const PhotosInFaceCount = await photo.getPhotoCount("all");
await menu.openPage("people");
await t.click(subject.newTab);
await subject.addNameToFace(FirstFaceID, "Jane Doe");
await subject.triggerToolbarAction("reload");
const FaceCountAfterAdd = await subject.getFaceCount();
await t.expect(FaceCountAfterAdd).eql(FaceCount - 1);
await t.click(subject.recognizedTab);
await subject.checkFaceVisibility(FirstFaceID, false);
await t.eval(() => location.reload());
await t.wait(6000);
const SubjectCountAfterAdd = await subject.getSubjectCount();
await t.expect(SubjectCountAfterAdd).eql(SubjectCount + 1);
await toolbar.search("Jane");
const JaneUID = await subject.getNthSubjectUid(0);
await t
.expect(Selector("a[data-uid=" + JaneUID + "] div.caption").innerText)
.contains(PhotosInFaceCount.toString());
await subject.openSubjectWithUid(JaneUID);
const PhotosInSubjectCount = await photo.getPhotoCount("all");
await t.expect(PhotosInFaceCount).eql(PhotosInSubjectCount);
await photo.triggerHoverAction("nth", 0, "select");
await photo.triggerHoverAction("nth", 1, "select");
await photo.triggerHoverAction("nth", 2, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
await t.expect(photoedit.inputName.nth(0).value).contains("Jane Doe");
await t.click(photoedit.dialogClose);
await menu.openPage("people");
await subject.renameSubject(JaneUID, "Max Mu");
await t
.expect(Selector("a[data-uid=" + JaneUID + "] div.v-card__title").innerText)
.contains("Max Mu");
await subject.openSubjectWithUid(JaneUID);
await t.eval(() => location.reload());
await contextmenu.checkContextMenuCount("3");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
await t.expect(photoedit.inputName.nth(0).value).contains("Max Mu");
await t.click(photoedit.dialogNext);
await t.expect(photoedit.inputName.nth(0).value).contains("Max Mu").click(photoedit.dialogNext);
await t
.expect(photoedit.inputName.nth(0).value)
.contains("Max Mu")
.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await toolbar.search("person:max-mu");
const PhotosInSubjectAfterRenameCount = await photo.getPhotoCount("all");
await t.expect(PhotosInSubjectAfterRenameCount).eql(PhotosInSubjectCount);
}
);
test.meta("testID", "people-001")("Add + Rename", async (t) => {
await page.openNav();
await t
.click(Selector(".nav-people"))
.click(Selector("#tab-people_faces > a"))
.click(Selector("form.p-faces-search button.action-reload"));
const countFaces = await Selector("div.is-face", { timeout: 55000 }).count;
await t.click(Selector("#tab-people > a"));
const countSubjects = await Selector("a.is-subject").count;
await t.click(Selector("#tab-people_faces > a"));
const FirstFaceID = await Selector("div.is-face").nth(0).getAttribute("data-id");
await t.click(Selector("div[data-id=" + FirstFaceID + "] div.clickable"));
const countPhotosFace = await Selector("div.is-photo").count;
await page.openNav();
await t
.click(Selector(".nav-people"))
.click(Selector("#tab-people_faces > a"))
.typeText(Selector("div[data-id=" + FirstFaceID + "] div.input-name input"), "Jane Doe")
.pressKey("enter")
.click(Selector("form.p-faces-search button"));
const countFacesAfterAdd = await Selector("div.is-face", { timeout: 55000 }).count;
await t
.expect(countFacesAfterAdd)
.eql(countFaces - 1)
.expect(Selector("div").withAttribute("data-id", FirstFaceID).exists)
.notOk()
.click(Selector("#tab-people > a"));
await t.eval(() => location.reload());
await t.wait(6000);
const countSubjectsAfterAdd = await Selector("a.is-subject").count;
await t
.expect(countSubjectsAfterAdd)
.eql(countSubjects + 1)
.typeText(Selector("div.input-search input"), "Jane")
.pressKey("enter");
const JaneUID = await Selector("a.is-subject", { timeout: 55000 })
.nth(0)
.getAttribute("data-uid");
await t
.expect(Selector("a[data-uid=" + JaneUID + "] div.caption").innerText)
.contains(countPhotosFace.toString())
.click(Selector("a.is-subject").withAttribute("data-uid", JaneUID));
const countPhotosSubject = await Selector("div.is-photo").count;
await t.expect(countPhotosFace).eql(countPhotosSubject);
await page.toggleSelectNthPhoto(0);
await page.toggleSelectNthPhoto(1);
await page.toggleSelectNthPhoto(2);
await page.editSelected();
await t
.click(Selector("#tab-people"))
.expect(Selector("div.input-name input").nth(0).value)
.contains("Jane Doe")
.click("button.action-close");
await page.openNav();
await t
.click(Selector(".nav-people"))
.click(Selector("a[data-uid=" + JaneUID + "] div.v-card__title"))
.typeText(Selector("div.input-rename input"), "Max Mu", { replace: true })
.pressKey("enter")
.expect(Selector("a[data-uid=" + JaneUID + "] div.v-card__title").innerText)
.contains("Max Mu")
.click(Selector("a.is-subject").withAttribute("data-uid", JaneUID));
await t.eval(() => location.reload());
await page.editSelected();
await t
.click(Selector("#tab-people"))
.expect(Selector("div.input-name input").nth(0).value)
.contains("Max Mu")
.click("button.action-next")
.expect(Selector("div.input-name input").nth(0).value)
.contains("Max Mu")
.click("button.action-next")
.expect(Selector("div.input-name input").nth(0).value)
.contains("Max Mu")
.click("button.action-close");
await page.clearSelection();
await t
.typeText(Selector("div.input-search input").nth(0), "person:max-mu", {
replace: true,
})
.pressKey("enter");
const countPhotosSubjectAfterRename = await Selector("div.is-photo").count;
await t.expect(countPhotosSubjectAfterRename).eql(countPhotosSubject);
test.meta("testID", "people-002").meta({ type: "smoke" })(
"Add + Reject name on people tab",
async (t) => {
await menu.openPage("people");
await t.click(subject.newTab);
await subject.triggerToolbarAction("reload");
const FirstFaceID = await subject.getNthFaceUid(0);
await subject.addNameToFace(FirstFaceID, "Andrea Doe");
await t.click(subject.recognizedTab);
await toolbar.search("Andrea");
const AndreaUID = await subject.getNthSubjectUid(0);
await subject.openSubjectWithUid(AndreaUID);
await t.eval(() => location.reload());
await t.wait(5000);
const PhotosInAndreaCount = await photo.getPhotoCount("all");
await photo.triggerHoverAction("nth", 1, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t
.click(photoedit.peopleTab)
.expect(photoedit.inputName.nth(0).value)
.eql("Andrea Doe")
.click(photoedit.rejectName.nth(0));
await t.expect(photoedit.inputName.nth(0).value).eql("");
await t
.typeText(photoedit.inputName.nth(0), "Nicole", { replace: true })
.pressKey("enter")
.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await t.eval(() => location.reload());
await t.wait(5000);
const PhotosInAndreaAfterRejectCount = await photo.getPhotoCount("all");
const Diff = PhotosInAndreaCount - PhotosInAndreaAfterRejectCount;
await toolbar.search("person:nicole");
await t.eval(() => location.reload());
await t.wait(5000);
const PhotosInNicoleCount = await photo.getPhotoCount("all");
await t.expect(Diff).gte(PhotosInNicoleCount);
}
);
test.meta("testID", "people-003")("Test mark subject as favorite", async (t) => {
await menu.openPage("people");
const FirstSubjectUid = await subject.getNthSubjectUid(0);
const SecondSubjectUid = await subject.getNthSubjectUid(1);
await subject.triggerHoverAction("uid", SecondSubjectUid, "favorite");
await subject.triggerToolbarAction("reload");
const FirstSubjectUidAfterFavorite = await subject.getNthSubjectUid(0);
await t.expect(FirstSubjectUid).notEql(FirstSubjectUidAfterFavorite);
await t.expect(SecondSubjectUid).eql(FirstSubjectUidAfterFavorite);
await subject.checkHoverActionState("uid", SecondSubjectUid, "favorite", true);
await subject.triggerHoverAction("uid", SecondSubjectUid, "favorite");
await subject.checkHoverActionState("uid", SecondSubjectUid, "favorite", false);
});
test.meta("testID", "people-002")("Add + Reject + Star", async (t) => {
await page.openNav();
await t
.click(Selector(".nav-people"))
.click(Selector("#tab-people_faces > a"))
.click(Selector("form.p-faces-search button.action-reload"));
const FirstFaceID = await Selector("div.is-face").nth(0).getAttribute("data-id");
test.meta("testID", "people-004")("Test new face autocomplete", async (t) => {
await menu.openPage("people");
await t.click(subject.newTab);
await subject.triggerToolbarAction("reload");
const FirstFaceID = await subject.getNthFaceUid(0);
await t
.expect(Selector("div.menuable__content__active").nth(0).visible)
.notOk()
.click(Selector("div[data-id=" + FirstFaceID + "] div.input-name input"))
.expect(Selector("div.menuable__content__active").nth(0).visible)
.ok()
.typeText(Selector("div[data-id=" + FirstFaceID + "] div.input-name input"), "Andrea Doe")
.pressKey("enter")
.click(Selector("#tab-people > a"));
await t.typeText(Selector("div.input-search input"), "Andrea").pressKey("enter");
const AndreaUID = await Selector("a.is-subject").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-subject").withAttribute("data-uid", AndreaUID));
await t.eval(() => location.reload());
await t.wait(6000);
const countPhotosAndreaAfterAdd = await Selector("div.is-photo").count;
await page.toggleSelectNthPhoto(1);
await page.editSelected();
.typeText(Selector("div[data-id=" + FirstFaceID + "] div.input-name input"), "Otto");
await t
.click(Selector("#tab-people"))
.expect(Selector("div.input-name input").nth(0).value)
.eql("Andrea Doe")
.click(Selector("div.input-name div.v-input__icon--clear"))
.expect(Selector("div.input-name input").nth(0).value)
.eql("")
.typeText(Selector("div.input-name input").nth(0), "Nicole", { replace: true })
.pressKey("enter")
.click("button.action-close");
await page.clearSelection();
await t.eval(() => location.reload());
await t.wait(6000);
const countPhotosAndreaAfterReject = await Selector("div.is-photo").count;
const Diff = countPhotosAndreaAfterAdd - countPhotosAndreaAfterReject;
await t
.typeText(Selector("div.input-search input"), "person:nicole", { replace: true })
.pressKey("enter");
await t.eval(() => location.reload());
await t.wait(6000);
const countPhotosNicole = await Selector("div.is-photo").count;
await t.expect(Diff).gte(countPhotosNicole);
await page.openNav();
await t
.click(Selector(".nav-people"))
.typeText(Selector("div.input-search input"), "Nicole", { replace: true })
.pressKey("enter");
const NicoleUID = await Selector("a.is-subject").nth(0).getAttribute("data-uid");
await t
.click(Selector("a[data-uid=" + NicoleUID + "] button.input-favorite"))
.typeText(Selector("div.input-search input"), " ", { replace: true })
.pressKey("enter")
.expect(Selector("a.is-subject").nth(0).getAttribute("data-uid"))
.eql(NicoleUID);
.expect(Selector("div.menuable__content__active").nth(0).withText("Otto Visible").visible)
.ok();
});
test.meta("testID", "people-003")("Remove face", async (t) => {
await page.search("face:new");
const FirstPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.toggleSelectNthPhoto(0);
await page.editSelected();
await t.click(Selector("#tab-people"));
const MarkerCount = await Selector("div.is-marker").count;
if ((await Selector("div.input-name input").nth(0).value) == "") {
test.meta("testID", "people-005")("Remove face", async (t) => {
await toolbar.search("face:new");
const FirstPhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
const MarkerCount = await subject.getMarkerCount();
if ((await photoedit.inputName.nth(0).value) == "") {
await t
.expect(Selector("button.action-undo").nth(0).visible)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.notOk()
.expect(Selector("div.input-name input").nth(0).value)
.expect(photoedit.inputName.nth(0).value)
.eql("")
.click(Selector("button.input-reject"))
.expect(Selector("button.action-undo").nth(0).visible)
.click(photoedit.removeMarker)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.ok()
.click(Selector("button.action-undo"));
} else if ((await Selector("div.input-name input").nth(0).value) != "") {
.click(photoedit.undoRemoveMarker);
} else if ((await photoedit.inputName.nth(0).value) != "") {
await t
.expect(Selector("div.input-name input").nth(1).value)
.expect(photoedit.inputName.nth(1).value)
.eql("")
.click(Selector("button.input-reject"))
.expect(Selector("button.action-undo").nth(0).visible)
.click(photoedit.removeMarker)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.ok()
.click(Selector("button.action-undo"));
.click(photoedit.undoRemoveMarker);
}
await t.click("button.action-close");
await page.clearSelection();
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await t.eval(() => location.reload());
await t.wait(6000);
await page.selectPhotoFromUID(FirstPhoto);
await page.editSelected();
await t.click(Selector("#tab-people"));
if ((await Selector("div.input-name input").nth(0).value) == "") {
await t.wait(5000);
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
if ((await photoedit.inputName.nth(0).value) == "") {
await t
.expect(Selector("button.action-undo").nth(0).visible)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.notOk()
.expect(Selector("div.input-name input").nth(0).value)
.expect(photoedit.inputName.nth(0).value)
.eql("")
.click(Selector("button.input-reject"))
.expect(Selector("button.action-undo").nth(0).visible)
.click(photoedit.removeMarker)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.ok();
} else if ((await Selector("div.input-name input").nth(0).value) != "") {
} else if ((await photoedit.inputName.nth(0).value) != "") {
await t
.expect(Selector("button.action-undo").nth(0).visible)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.notOk()
.expect(Selector("div.input-name input").nth(1).value)
.expect(photoedit.inputName.nth(1).value)
.eql("")
.click(Selector("button.input-reject"))
.expect(Selector("button.action-undo").nth(0).visible)
.click(photoedit.removeMarker)
.expect(photoedit.undoRemoveMarker.nth(0).visible)
.ok();
}
await t.click("button.action-close");
await t.click(photoedit.dialogClose);
await t.eval(() => location.reload());
await page.editSelected();
await t.click(Selector("#tab-people"));
const MarkerCountAfterRemove = await Selector("div.is-marker").count;
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.peopleTab);
const MarkerCountAfterRemove = await subject.getMarkerCount();
await t.expect(MarkerCountAfterRemove).eql(MarkerCount - 1);
});
test.meta("testID", "people-004")("Hide face", async (t) => {
await page.openNav();
await t
.click(Selector(".nav-people"))
.click(Selector("#tab-people_faces > a"))
.click(Selector("form.p-faces-search button.action-reload"));
const FirstFaceID = await Selector("div.is-face").nth(0).getAttribute("data-id");
await t
.hover(Selector("div[data-id=" + FirstFaceID + "]"))
.click(Selector("div[data-id=" + FirstFaceID + "] button.input-hidden"));
test.meta("testID", "people-006")("Hide face", async (t) => {
await menu.openPage("people");
await t.click(subject.newTab);
await subject.triggerToolbarAction("reload");
const FirstFaceID = await subject.getNthFaceUid(0);
await subject.checkFaceVisibility(FirstFaceID, true);
await subject.triggerHoverAction("id", FirstFaceID, "hidden");
await t.eval(() => location.reload());
await t
.wait(6000)
.expect(Selector("div[data-id=" + FirstFaceID + "]").visible)
.notOk()
.click(Selector("button.action-show-hidden"));
await t.wait(5000);
await subject.checkFaceVisibility(FirstFaceID, false);
await subject.triggerToolbarAction("show-hidden");
await t.eval(() => location.reload());
await t
.wait(6000)
.expect(Selector("div[data-id=" + FirstFaceID + "]").visible)
.ok()
.hover(Selector("div[data-id=" + FirstFaceID + "]"))
.click(Selector("div[data-id=" + FirstFaceID + "] button.input-hidden"))
.click(Selector("button.action-exclude-hidden"));
await t.wait(6000);
await subject.checkFaceVisibility(FirstFaceID, true);
await subject.triggerHoverAction("id", FirstFaceID, "hidden");
await subject.triggerToolbarAction("exclude-hidden");
await t.eval(() => location.reload());
await t
.wait(6000)
.expect(Selector("div[data-id=" + FirstFaceID + "]").visible)
.ok();
await t.wait(6000);
await subject.checkFaceVisibility(FirstFaceID, true);
});
test.meta("testID", "people-005")("Hide person", async (t) => {
await page.openNav();
await t.click(Selector(".nav-people")).click(Selector("#tab-people > a"));
const FirstPerson = await Selector("a.is-subject").nth(0).getAttribute("data-uid");
await t
.hover(Selector("a[data-uid=" + FirstPerson + "]"))
.click(Selector("a[data-uid=" + FirstPerson + "] button.input-hidden"));
test.meta("testID", "people-007")("Hide person", async (t) => {
await menu.openPage("people");
await t.click(subject.recognizedTab);
const FirstPersonUid = await subject.getNthSubjectUid(0);
await subject.checkSubjectVisibility("uid", FirstPersonUid, true);
await subject.triggerHoverAction("uid", FirstPersonUid, "hidden");
await t.eval(() => location.reload());
await t
.wait(6000)
.expect(Selector("a[data-uid=" + FirstPerson + "]").visible)
.notOk()
.click(Selector("button.action-show-hidden"));
await t.wait(6000);
await subject.checkSubjectVisibility("uid", FirstPersonUid, false);
await subject.triggerToolbarAction("show-hidden");
await t.eval(() => location.reload());
await t
.wait(6000)
.expect(Selector("a[data-uid=" + FirstPerson + "]").visible)
.ok()
.hover(Selector("a[data-uid=" + FirstPerson + "]"))
.click(Selector("a[data-uid=" + FirstPerson + "] button.input-hidden"))
.click(Selector("button.action-exclude-hidden"));
await t.wait(6000);
await subject.checkSubjectVisibility("uid", FirstPersonUid, true);
await subject.triggerHoverAction("uid", FirstPersonUid, "hidden");
await subject.triggerToolbarAction("exclude-hidden");
await t.eval(() => location.reload());
await t
.wait(6000)
.expect(Selector("a[data-uid=" + FirstPerson + "]").visible)
.ok();
await t.wait(5000);
await subject.checkSubjectVisibility("uid", FirstPersonUid, true);
});

File diff suppressed because it is too large Load diff

View file

@ -1,83 +1,93 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import { RequestLogger } from "testcafe";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import PhotoViewer from "../page-model/photoviewer";
import Page from "../page-model/page";
const logger = RequestLogger(/http:\/\/localhost:2343\/api\/v1\/*/, {
logResponseHeaders: true,
logResponseBody: true,
});
fixture`Test photos download`.page`${testcafeconfig.url}`.requestHooks(logger).skip;
fixture`Test photos download`.page`${testcafeconfig.url}`
.requestHooks(logger)
.skip("Does not work in container and we have no content-disposition header anymore");
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const photoviewer = new PhotoViewer();
const page = new Page();
//TODO Make those run from within the container
test.meta("testID", "photos-download-001")(
test.meta("testID", "photos-download-001").meta({ type: "smoke" })(
"Test download jpg file from context menu and fullscreen",
async (t) => {
await page.search("name:monochrome-2.jpg");
const Photo = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.selectPhotoFromUID(Photo);
await t.click(Selector("button.action-menu"));
await toolbar.search("name:monochrome-2.jpg");
const PhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PhotoUid, "select");
await logger.clear();
await t.click(Selector("button.action-download"));
await contextmenu.triggerContextMenuAction("download", "");
const requestInfo = await logger.requests[1].response;
console.log(requestInfo);
const requestInfo0 = await logger.requests[0].response;
console.log(requestInfo0);
await page.validateDownloadRequest(requestInfo, "monochrome-2", ".jpg");
await logger.clear();
await page.clearSelection();
await page.search("name:IMG_20200711_174006.jpg");
const SecondPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await t.click(Selector("div").withAttribute("data-uid", SecondPhoto));
await t.expect(Selector("#photo-viewer").visible).ok().hover(Selector(".action-download"));
await contextmenu.clearSelection();
await toolbar.search("name:IMG_20200711_174006.jpg");
const SecondPhotoUid = await photo.getNthPhotoUid("all", 0);
await t.click(Selector("div").withAttribute("data-uid", SecondPhotoUid));
await photoviewer.openPhotoViewer("uid", SecondPhotoUid);
await logger.clear();
await t.click(Selector(".action-download"));
const requestInfo2 = await logger.requests[1].response;
await page.validateDownloadRequest(requestInfo2, "IMG_20200711_174006", ".jpg");
await photoviewer.triggerPhotoViewerAction("download");
await logger.clear();
await t.click(Selector(".action-close"));
await photoviewer.triggerPhotoViewerAction("close");
}
);
test.meta("testID", "photos-download-002")(
test.meta("testID", "photos-download-002").meta({ type: "smoke" })(
"Test download video from context menu",
async (t) => {
await page.openNav();
await t.click(Selector("div.nav-browse"));
await page.search("name:Mohn.mp4");
const Photo = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.selectPhotoFromUID(Photo);
await t.click(Selector("button.action-menu"));
await toolbar.search("name:Mohn.mp4");
const PhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PhotoUid, "select");
await logger.clear();
await t.click(Selector("button.action-download"));
const requestInfo = await logger.requests[1].response;
const requestInfo2 = await logger.requests[2].response;
await contextmenu.triggerContextMenuAction("download", "");
const requestInfo = await logger.requests[0].response;
console.log(requestInfo);
const requestInfo2 = await logger.requests[1].response;
await page.validateDownloadRequest(requestInfo, "Mohn", ".mp4.jpg");
await page.validateDownloadRequest(requestInfo2, "Mohn", ".mp4");
await logger.clear();
await page.clearSelection();
await contextmenu.clearSelection();
}
);
test.meta("testID", "photos-download-003")(
"Test download multiple jpg files from context menu",
async (t) => {
await page.search("name:panorama_2.jpg");
const Photo = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.selectPhotoFromUID(Photo);
await page.search("name:IMG_6478.JPG");
const SecondPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.selectPhotoFromUID(SecondPhoto);
await t.click(Selector("button.action-menu"));
await toolbar.search("name:panorama_2.jpg");
const PhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PhotoUid, "select");
await toolbar.search("name:IMG_6478.JPG");
const SecondPhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await logger.clear();
await t.click(Selector("button.action-download"));
await contextmenu.triggerContextMenuAction("download", "");
const requestInfo = await logger.requests[1].response;
console.log(requestInfo);
await page.validateDownloadRequest(requestInfo, "photoprism-download", ".zip");
await logger.clear();
await page.clearSelection();
await contextmenu.clearSelection();
}
);
@ -85,20 +95,17 @@ test.meta("testID", "photos-download-003")(
test.meta("testID", "photos-download-004")(
"Test raw file from context menu and fullscreen mode",
async (t) => {
await page.openNav();
await t.click(Selector("div.nav-browse"));
await page.search("name:elephantRAW");
const Photo = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.selectPhotoFromUID(Photo);
await t.click(Selector("button.action-menu"));
await toolbar.search("name:elephantRAW");
const PhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", PhotoUid, "select");
await logger.clear();
await t.click(Selector("button.action-download"));
await contextmenu.triggerContextMenuAction("download", "");
const requestInfo = await logger.requests[1].response;
//const requestInfo2 = await logger.requests[2].response;
await page.validateDownloadRequest(requestInfo, "elephantRAW", ".JPG");
//await page.validateDownloadRequest(requestInfo2, "elephantRAW", ".mp4");
await logger.clear();
await page.clearSelection();
await contextmenu.clearSelection();
await t.click(Selector("div").withAttribute("data-uid", Photo));
await t.expect(Selector("#photo-viewer").visible).ok().hover(Selector(".action-download"));
await logger.clear();

View file

@ -1,162 +1,198 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import { ClientFunction } from "testcafe";
import fs from "fs";
import Menu from "../page-model/menu";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import PhotoEdit from "../page-model/photo-edit";
import Originals from "../page-model/originals";
import Album from "../page-model/album";
import Library from "../page-model/library";
fixture`Test photos upload and delete`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const photoedit = new PhotoEdit();
const originals = new Originals();
const library = new Library();
test.meta("testID", "photos-upload-delete-001")("Upload + Delete jpg/json", async (t) => {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/10")).notOk();
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("digikam");
const PhotoCount = await Selector("div.is-photo").count;
await t
.expect(PhotoCount)
.eql(0)
.click(Selector(".action-upload"))
.setFilesToUpload(Selector(".input-upload"), [
"./upload-files/digikam.jpg",
"./upload-files/digikam.json",
])
.wait(15000);
const PhotoCountAfterUpload = await Selector("div.is-photo").count;
await t.expect(PhotoCountAfterUpload).eql(1);
const UploadedPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await t.navigateTo("/library/files/2020/10");
const FileCount = await Selector("div.is-file").count;
await t.expect(FileCount).eql(2);
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("digikam");
await page.selectPhotoFromUID(UploadedPhoto);
await page.editSelected();
await t
.click("#tab-files")
.expect(Selector("div.caption").withText(".json").visible)
.ok()
.expect(Selector("div.caption").withText(".jpg").visible)
.ok()
.click(Selector(".action-close"));
await page.clearSelection();
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/10")).ok();
const originalsLength = fs.readdirSync("../storage/acceptance/originals/2020/10").length;
await t.expect(originalsLength).eql(2);
await page.deletePhotoFromUID(UploadedPhoto);
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("digikam");
await t
.expect(Selector("div").withAttribute("data-uid", UploadedPhoto).exists, { timeout: 5000 })
.notOk()
.navigateTo("/library/files/2020/10");
const FileCountAfterDelete = await Selector("div.is-file").count;
await t.expect(FileCountAfterDelete).eql(0);
const originalsLengthAfterDelete = fs.readdirSync("../storage/acceptance/originals/2020/10")
.length;
await t.expect(originalsLengthAfterDelete).eql(0);
});
test.meta("testID", "photos-upload-delete-001").meta({ type: "smoke" })(
"Upload + Delete jpg/json",
async (t) => {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/10")).notOk();
await toolbar.search("digikam");
const PhotoCount = await photo.getPhotoCount("all");
await t.expect(PhotoCount).eql(0);
await toolbar.triggerToolbarAction("upload");
await t
.setFilesToUpload(Selector(".input-upload"), [
"./upload-files/digikam.jpg",
"./upload-files/digikam.json",
])
.wait(15000);
const PhotoCountAfterUpload = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterUpload).eql(1);
const UploadedPhoto = await photo.getNthPhotoUid("all", 0);
await t.navigateTo("/library/files/2020/10");
const FileCount = await originals.getFileCount();
await t.expect(FileCount).eql(2);
await menu.openPage("browse");
await toolbar.search("digikam");
await photo.triggerHoverAction("uid", UploadedPhoto, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.filesTab);
await t
.expect(Selector("div.caption").withText(".json").visible)
.ok()
.expect(Selector("div.caption").withText(".jpg").visible)
.ok();
await t.click(photoedit.dialogClose);
if (t.browser.platform !== "mobile") {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/10")).ok();
const originalsLength = fs.readdirSync("../storage/acceptance/originals/2020/10").length;
await t.expect(originalsLength).eql(2);
}
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await photo.triggerHoverAction("uid", UploadedPhoto, "select");
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("browse");
await toolbar.search("digikam");
await photo.checkPhotoVisibility(UploadedPhoto, false);
await t.navigateTo("/library/files/2020/10");
const FileCountAfterDelete = await originals.getFileCount();
await t.expect(FileCountAfterDelete).eql(0);
if (t.browser.platform !== "mobile") {
const originalsLengthAfterDelete = fs.readdirSync(
"../storage/acceptance/originals/2020/10"
).length;
await t.expect(originalsLengthAfterDelete).eql(0);
}
}
);
test.meta("testID", "photos-upload-delete-002")("Upload + Delete video", async (t) => {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/06")).notOk();
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("korn");
const PhotoCount = await Selector("div.is-photo").count;
await t
.expect(PhotoCount)
.eql(0)
.click(Selector(".action-upload"))
.setFilesToUpload(Selector(".input-upload"), [
"./upload-files/korn.mp4",
])
.wait(15000);
const PhotoCountAfterUpload = await Selector("div.is-photo").count;
await toolbar.search("korn");
const PhotoCount = await photo.getPhotoCount("all");
await t.expect(PhotoCount).eql(0);
await toolbar.triggerToolbarAction("upload");
await t.setFilesToUpload(Selector(".input-upload"), ["./upload-files/korn.mp4"]).wait(15000);
const PhotoCountAfterUpload = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterUpload).eql(1);
const UploadedPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
const UploadedPhoto = await photo.getNthPhotoUid("all", 0);
await t.navigateTo("/library/files/2020/06");
const FileCount = await Selector("div.is-file").count;
const FileCount = await originals.getFileCount();
await t.expect(FileCount).eql(1);
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("korn");
await page.selectPhotoFromUID(UploadedPhoto);
await page.editSelected();
await menu.openPage("browse");
await toolbar.search("korn");
await photo.triggerHoverAction("uid", UploadedPhoto, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.filesTab);
await t
.click("#tab-files")
.expect(Selector("div.caption").withText(".mp4").visible)
.ok()
.expect(Selector("div.caption").withText(".jpg").visible)
.ok()
.click(Selector(".action-close"));
await page.clearSelection();
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/06")).ok();
const originalsLength = fs.readdirSync("../storage/acceptance/originals/2020/06").length;
await t.expect(originalsLength).eql(1);
const sidecarLength = fs.readdirSync("../storage/acceptance/originals/2020/06").length;
await t.expect(sidecarLength).eql(1);
await page.deletePhotoFromUID(UploadedPhoto);
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("korn");
await t
.expect(Selector("div").withAttribute("data-uid", UploadedPhoto).exists, { timeout: 5000 })
.notOk()
.navigateTo("/library/files/2020/06");
const FileCountAfterDelete = await Selector("div.is-file").count;
.ok();
await t.click(photoedit.dialogClose);
if (t.browser.platform !== "mobile") {
await t.expect(fs.existsSync("../storage/acceptance/originals/2020/06")).ok();
const originalsLength = fs.readdirSync("../storage/acceptance/originals/2020/06").length;
await t.expect(originalsLength).eql(1);
const sidecarLength = fs.readdirSync("../storage/acceptance/originals/2020/06").length;
await t.expect(sidecarLength).eql(1);
}
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await photo.triggerHoverAction("uid", UploadedPhoto, "select");
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("browse");
await toolbar.search("korn");
await photo.checkPhotoVisibility(UploadedPhoto, false);
await t.navigateTo("/library/files/2020/06");
const FileCountAfterDelete = await originals.getFileCount();
await t.expect(FileCountAfterDelete).eql(0);
const originalsLengthAfterDelete = fs.readdirSync("../storage/acceptance/originals/2020/06")
.length;
await t.expect(originalsLengthAfterDelete).eql(0);
const sidecarLengthAfterDelete = fs.readdirSync("../storage/acceptance/originals/2020/06").length;
await t.expect(sidecarLengthAfterDelete).eql(0);
if (t.browser.platform !== "mobile") {
const originalsLengthAfterDelete = fs.readdirSync(
"../storage/acceptance/originals/2020/06"
).length;
await t.expect(originalsLengthAfterDelete).eql(0);
const sidecarLengthAfterDelete = fs.readdirSync(
"../storage/acceptance/originals/2020/06"
).length;
await t.expect(sidecarLengthAfterDelete).eql(0);
}
});
test.meta("testID", "photos-upload-delete-003")("Upload to existing Album + Delete", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.search("Christmas");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
const PhotoCount = await Selector("div.is-photo").count;
await menu.openPage("albums");
await toolbar.search("Christmas");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCount = await photo.getPhotoCount("all");
await toolbar.triggerToolbarAction("upload");
await t
.click(Selector(".action-upload"))
.click(Selector(".input-albums"))
.click(Selector("div.v-list__tile__title").withText("Christmas"))
.click(page.selectOption.withText("Christmas"))
.setFilesToUpload(Selector(".input-upload"), ["./upload-files/ladybug.jpg"])
.wait(15000);
const PhotoCountAfterUpload = await Selector("div.is-photo").count;
const PhotoCountAfterUpload = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterUpload).eql(PhotoCount + 1);
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("ladybug");
const UploadedPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.deletePhotoFromUID(UploadedPhoto);
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("ladybug");
await t
.expect(Selector("div").withAttribute("data-uid", UploadedPhoto).exists, { timeout: 5000 })
.notOk();
await page.openNav();
await t.click(Selector(".nav-albums"));
await t
.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid))
.expect(Selector("div").withAttribute("data-uid", UploadedPhoto).exists, { timeout: 5000 })
.notOk();
const PhotoCountAfterDelete = await Selector("div.is-photo").count;
await menu.openPage("browse");
await toolbar.search("ladybug");
const UploadedPhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", UploadedPhotoUid, "select");
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await photo.triggerHoverAction("uid", UploadedPhotoUid, "select");
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("browse");
await toolbar.search("ladybug");
await photo.checkPhotoVisibility(UploadedPhotoUid, false);
await menu.openPage("albums");
await album.openAlbumWithUid(AlbumUid);
await photo.checkPhotoVisibility(UploadedPhotoUid, false);
const PhotoCountAfterDelete = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterDelete).eql(PhotoCount);
});
test.meta("testID", "photos-upload-delete-004")("Upload jpg to new Album + Delete", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
const AlbumCount = await Selector("a.is-album").count;
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await toolbar.triggerToolbarAction("upload");
await t
.click(Selector(".action-upload", { timeout: 5000 }))
.click(Selector(".input-albums"))
.typeText(Selector(".input-albums input"), "NewCreatedAlbum")
.pressKey("enter")
@ -165,67 +201,66 @@ test.meta("testID", "photos-upload-delete-004")("Upload jpg to new Album + Delet
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await t.click(Selector("button.action-reload"));
await toolbar.triggerToolbarAction("reload");
}
const AlbumCountAfterUpload = await Selector("a.is-album").count;
const AlbumCountAfterUpload = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterUpload).eql(AlbumCount + 1);
await page.search("NewCreatedAlbum");
await t.click(Selector("a.is-album").nth(0));
const PhotoCount = await Selector("div.is-photo").count;
await toolbar.search("NewCreatedAlbum");
await album.openNthAlbum(0);
const PhotoCount = await photo.getPhotoCount("all");
await t.expect(PhotoCount).eql(1);
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("digikam");
const UploadedPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.deletePhotoFromUID(UploadedPhoto);
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("digikam");
await t
.expect(Selector("div").withAttribute("data-uid", UploadedPhoto).exists, { timeout: 5000 })
.notOk();
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.search("NewCreatedAlbum");
await t
.click(Selector("a.is-album").nth(0))
.expect(Selector("div").withAttribute("data-uid", UploadedPhoto).exists, { timeout: 5000 })
.notOk();
const PhotoCountAfterDelete = await Selector("div.is-photo").count;
await menu.openPage("browse");
await toolbar.search("digikam");
const UploadedPhotoUid = await photo.getNthPhotoUid("all", 0);
await photo.triggerHoverAction("uid", UploadedPhotoUid, "select");
await contextmenu.triggerContextMenuAction("archive", "");
await menu.openPage("archive");
await photo.triggerHoverAction("uid", UploadedPhotoUid, "select");
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("browse");
await toolbar.search("digikam");
await photo.checkPhotoVisibility(UploadedPhotoUid, false);
await menu.openPage("albums");
await toolbar.search("NewCreatedAlbum");
await album.openNthAlbum(0);
await photo.checkPhotoVisibility(UploadedPhotoUid, false);
const PhotoCountAfterDelete = await photo.getPhotoCount("all");
await t.expect(PhotoCountAfterDelete).eql(0);
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.search("NewCreatedAlbum");
await t.hover(Selector("a.is-album").nth(0)).click(Selector("a.is-album .input-select").nth(0));
await page.deleteSelected();
await menu.openPage("albums");
await toolbar.search("NewCreatedAlbum");
await album.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuCount("1");
await contextmenu.triggerContextMenuAction("delete", "");
});
test.meta("testID", "photos-upload-delete-005")("Try uploading nsfw file", async (t) => {
await page.openNav();
await t.click(Selector(".nav-browse"));
await t
.click(Selector(".action-upload"))
.setFilesToUpload(Selector(".input-upload"), ["./upload-files/hentai_2.jpg"])
.wait(15000);
await page.openNav();
await t
.click(Selector(".nav-library"))
.click(Selector("#tab-library-logs"))
.expect(Selector("p").withText("hentai_2.jpg might be offensive").visible)
.ok();
});
test.meta("testID", "photos-upload-delete-005").meta({ type: "smoke" })(
"Try uploading nsfw file",
async (t) => {
await toolbar.triggerToolbarAction("upload");
await t
.setFilesToUpload(Selector(".input-upload"), ["./upload-files/hentai_2.jpg"])
.wait(15000);
await menu.openPage("library");
await t.click(library.logsTab);
test.meta("testID", "photos-upload-delete-006")("Try uploading txt file", async (t) => {
await page.openNav();
await t.click(Selector(".nav-browse"));
await t
.click(Selector(".action-upload"))
.setFilesToUpload(Selector(".input-upload"), ["./upload-files/foo.txt"])
.wait(15000);
await page.openNav();
await t
.click(Selector(".nav-library"))
.click(Selector("#tab-library-logs"))
.expect(Selector("p").withText(" foo.txt is not a jpeg file").visible)
.ok();
});
await t.expect(Selector("p").withText("hentai_2.jpg might be offensive").visible).ok();
}
);
test.meta("testID", "photos-upload-delete-006").meta({ type: "smoke" })(
"Try uploading txt file",
async (t) => {
await toolbar.triggerToolbarAction("upload");
await t.setFilesToUpload(Selector(".input-upload"), ["./upload-files/foo.txt"]).wait(15000);
await menu.openPage("library");
await t.click(library.logsTab);
await t.expect(Selector("p").withText(" foo.txt is not a jpeg file").visible).ok();
}
);

View file

@ -1,19 +1,30 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import { ClientFunction } from "testcafe";
import Menu from "../page-model/menu";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import PhotoViewer from "../page-model/photoviewer";
import Page from "../page-model/page";
import PhotoEdit from "../page-model/photo-edit";
const scroll = ClientFunction((x, y) => window.scrollTo(x, y));
const getcurrentPosition = ClientFunction(() => window.pageYOffset);
fixture`Test photos`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const photoviewer = new PhotoViewer();
const page = new Page();
const photoedit = new PhotoEdit();
test.meta("testID", "photos-001")("Scroll to top", async (t) => {
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.setFilter("view", "Cards");
await toolbar.setFilter("view", "Cards");
await t
.expect(Selector("button.is-photo-scroll-top").exists)
.notOk()
@ -21,244 +32,189 @@ test.meta("testID", "photos-001")("Scroll to top", async (t) => {
.eql(0)
.expect(Selector('div[class="v-image__image v-image__image--cover"]').nth(0).visible)
.ok();
await scroll(0, 1400);
await scroll(0, 900);
await t.click(Selector("button.p-scroll-top")).expect(getcurrentPosition()).eql(0);
});
//TODO Covered by admin role test
test.meta("testID", "photos-002")(
"Download single photo/video using clipboard and fullscreen mode",
async (t) => {
await page.search("photo:true");
const FirstPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
const SecondPhoto = await Selector("div.is-photo").nth(1).getAttribute("data-uid");
await t.click(Selector("div").withAttribute("data-uid", SecondPhoto));
await t
.expect(Selector("#photo-viewer").visible)
.ok()
.hover(Selector(".action-download"))
.expect(Selector(".action-download").visible)
.ok()
.click(Selector(".action-close"));
await page.selectPhotoFromUID(FirstPhoto);
await page.openNav();
await t.click(Selector(".nav-video"));
const FirstVideo = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.selectPhotoFromUID(FirstVideo);
const clipboardCount = await Selector("span.count-clipboard", { timeout: 5000 });
await t
.expect(clipboardCount.textContent)
.eql("2")
.click(Selector("button.action-menu"))
.expect(Selector("button.action-download").visible)
.ok();
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
const FirstVideoUid = await photo.getNthPhotoUid("video", 0);
await photoviewer.openPhotoViewer("uid", SecondPhotoUid);
await photoviewer.checkPhotoViewerActionAvailability("download", true);
await photoviewer.triggerPhotoViewerAction("close");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.checkContextMenuCount("2");
await contextmenu.checkContextMenuActionAvailability("download", true);
}
);
test.meta("testID", "photos-003")(
test.meta("testID", "photos-003").meta({ type: "smoke" })(
"Approve photo using approve and by adding location",
async (t) => {
await page.openNav();
await t.click(Selector("div.nav-browse + div")).click(Selector(".nav-review"));
await page.search("type:image");
const FirstPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
const SecondPhoto = await Selector("div.is-photo").nth(1).getAttribute("data-uid");
const ThirdPhoto = await Selector("div.is-photo").nth(2).getAttribute("data-uid");
await page.openNav();
await menu.openPage("review");
const FirstPhotoUid = await photo.getNthPhotoUid("all", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("all", 1);
const ThirdPhotoUid = await photo.getNthPhotoUid("all", 2);
await menu.openPage("browse");
await t.click(Selector(".nav-browse"));
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.notOk();
await page.openNav();
await t.click(Selector(".nav-review"));
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await page.selectPhotoFromUID(FirstPhoto);
await page.editSelected();
await t.click(Selector("button.action-close"));
await menu.openPage("review");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.detailsClose);
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await t.click(Selector("button.action-reload"));
await toolbar.triggerToolbarAction("reload");
}
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).visible, { timeout: 5000 })
.ok();
await page.editSelected();
await t.click(Selector("button.action-approve"));
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.detailsApprove);
if (t.browser.platform === "mobile") {
await t.click(Selector("button.action-apply")).click(Selector("button.action-close"));
await t.click(photoedit.detailsApply).click(photoedit.detailsClose);
} else {
await t.click(Selector("button.action-done", { timeout: 5000 }));
await t.click(photoedit.detailsDone);
}
await page.selectPhotoFromUID(SecondPhoto);
await page.editSelected();
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t
.typeText(Selector('input[aria-label="Latitude"]'), "9.999", { replace: true })
.typeText(Selector('input[aria-label="Longitude"]'), "9.999", { replace: true });
.typeText(photoedit.latitude, "9.999", { replace: true })
.typeText(photoedit.longitude, "9.999", { replace: true });
if (t.browser.platform === "mobile") {
await t.click(Selector("button.action-apply")).click(Selector("button.action-close"));
await t.click(photoedit.detailsApply).click(photoedit.detailsClose);
} else {
await t.click(Selector("button.action-done", { timeout: 5000 }));
await t.click(photoedit.detailsDone);
}
await page.setFilter("view", "Cards");
const ButtonThirdPhoto = 'div.is-photo[data-uid="' + ThirdPhoto + '"] button.action-approve';
await t.click(Selector(ButtonThirdPhoto));
await toolbar.setFilter("view", "Cards");
const ApproveButtonThirdPhoto =
'div.is-photo[data-uid="' + ThirdPhotoUid + '"] button.action-approve';
await t.click(Selector(ApproveButtonThirdPhoto));
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await t.click(Selector("button.action-reload"));
await toolbar.triggerToolbarAction("reload");
}
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", ThirdPhoto).exists, { timeout: 5000 })
.notOk();
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.search("type:image");
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).visible)
.ok()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).visible)
.ok()
.expect(Selector("div").withAttribute("data-uid", ThirdPhoto).visible)
.ok();
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(ThirdPhotoUid, false);
await menu.openPage("browse");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await photo.checkPhotoVisibility(ThirdPhotoUid, true);
}
);
test.meta("testID", "photos-004")("Like/dislike photo/video", async (t) => {
const FirstPhoto = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
const SecondPhoto = await Selector("div.is-photo.type-image").nth(1).getAttribute("data-uid");
test.meta("testID", "photos-004").meta({ type: "smoke" })("Like/dislike photo/video", async (t) => {
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
const FirstVideoUid = await photo.getNthPhotoUid("video", 0);
await menu.openPage("favorites");
await page.openNav();
await t.click(Selector(".nav-video"));
const FirstVideo = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await page.openNav();
await t.click(Selector(".nav-favorites"));
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", FirstVideo).exists, { timeout: 5000 })
.notOk();
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.toggleLike(FirstPhoto);
await page.selectPhotoFromUID(SecondPhoto);
await page.editSelected();
await page.turnSwitchOn("favorite");
await t.click(Selector(".action-close"));
await t
.expect(Selector("div.is-photo").withAttribute("data-uid", FirstPhoto).exists, {
timeout: 5000,
})
.ok()
.expect(Selector("div.is-photo").withAttribute("data-uid", SecondPhoto).exists, {
timeout: 5000,
})
.ok();
await page.openNav();
await t.click(Selector(".nav-video"));
await page.toggleLike(FirstVideo);
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await menu.openPage("browse");
await photo.triggerHoverAction("uid", FirstPhotoUid, "favorite");
await photo.triggerHoverAction("uid", FirstVideoUid, "favorite");
await photo.triggerHoverAction("uid", SecondPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOn("favorite");
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await menu.openPage("favorites");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await photo.triggerHoverAction("uid", SecondPhotoUid, "favorite");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOff("favorite");
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await photoviewer.openPhotoViewer("uid", FirstPhotoUid);
await photoviewer.triggerPhotoViewerAction("like");
await photoviewer.triggerPhotoViewerAction("close");
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await t.click(Selector("button.action-reload"));
await toolbar.triggerToolbarAction("reload");
}
await t
.expect(Selector("div.is-photo").withAttribute("data-uid", FirstVideo).exists, {
timeout: 5000,
})
.ok();
await page.openNav();
await t.click(Selector(".nav-favorites"));
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", FirstVideo).exists, { timeout: 5000 })
.ok();
await page.toggleLike(FirstVideo);
await page.toggleLike(FirstPhoto);
await page.editSelected();
await page.turnSwitchOff("private");
await t.click(Selector(".action-close"));
await page.clearSelection();
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await t.click(Selector("button.action-reload"));
}
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", FirstVideo).exists, { timeout: 5000 })
.notOk();
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await photo.checkPhotoVisibility(SecondPhotoUid, false);
});
test.meta("testID", "photos-007")("Edit photo/video", async (t) => {
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.setFilter("view", "Cards");
const FirstPhoto = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
await t
.click(Selector("button.action-title-edit").withAttribute("data-uid", FirstPhoto))
.expect(Selector('input[aria-label="Latitude"]').visible)
.ok();
await t.click(Selector("button.action-next"));
await t
.expect(Selector("button.action-previous").getAttribute("disabled"))
.notEql("disabled")
.click(Selector("button.action-previous"))
.click(Selector("button.action-close"))
.click(Selector("div.is-photo").withAttribute("data-uid", FirstPhoto))
.expect(Selector("#photo-viewer").visible)
.ok()
.hover(Selector(".action-edit"))
.click(Selector(".action-edit"))
.expect(Selector('input[aria-label="Latitude"]').visible)
.ok();
test.meta("testID", "photos-005").meta({ type: "smoke" })("Edit photo/video", async (t) => {
await toolbar.setFilter("view", "Cards");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
await t.click(page.cardTitle.withAttribute("data-uid", FirstPhotoUid));
const FirstPhotoTitle = await Selector(".input-title input").value;
const FirstPhotoLocalTime = await Selector(".input-local-time input").value;
const FirstPhotoDay = await Selector(".input-day input").value;
const FirstPhotoMonth = await Selector(".input-month input").value;
const FirstPhotoYear = await Selector(".input-year input").value;
const FirstPhotoTimezone = await Selector(".input-timezone input").value;
const FirstPhotoLatitude = await Selector(".input-latitude input").value;
const FirstPhotoLongitude = await Selector(".input-longitude input").value;
const FirstPhotoAltitude = await Selector(".input-altitude input").value;
const FirstPhotoCountry = await Selector(".input-country input").value;
const FirstPhotoCamera = await Selector("div.p-camera-select div.v-select__selection").innerText;
const FirstPhotoIso = await Selector(".input-iso input").value;
const FirstPhotoExposure = await Selector(".input-exposure input").value;
const FirstPhotoLens = await Selector("div.p-lens-select div.v-select__selection").innerText;
const FirstPhotoFnumber = await Selector(".input-fnumber input").value;
const FirstPhotoFocalLength = await Selector(".input-focal-length input").value;
const FirstPhotoSubject = await Selector(".input-subject textarea").value;
const FirstPhotoArtist = await Selector(".input-artist input").value;
const FirstPhotoCopyright = await Selector(".input-copyright input").value;
const FirstPhotoLicense = await Selector(".input-license textarea").value;
const FirstPhotoDescription = await Selector(".input-description textarea").value;
const FirstPhotoKeywords = await Selector(".input-keywords textarea").value;
const FirstPhotoNotes = await Selector(".input-notes textarea").value;
await t.expect(photoedit.latitude.visible).ok();
await t.click(photoedit.dialogNext);
await t.expect(photoedit.dialogPrevious.getAttribute("disabled")).notEql("disabled");
await t.click(photoedit.dialogPrevious).click(photoedit.dialogClose);
await photoviewer.openPhotoViewer("uid", FirstPhotoUid);
await photoviewer.triggerPhotoViewerAction("edit");
const FirstPhotoTitle = await photoedit.title.value;
const FirstPhotoLocalTime = await photoedit.localTime.value;
const FirstPhotoDay = await photoedit.day.value;
const FirstPhotoMonth = await photoedit.month.value;
const FirstPhotoYear = await photoedit.year.value;
const FirstPhotoTimezone = await photoedit.timezone.value;
const FirstPhotoLatitude = await photoedit.latitude.value;
const FirstPhotoLongitude = await photoedit.longitude.value;
const FirstPhotoAltitude = await photoedit.altitude.value;
const FirstPhotoCountry = await photoedit.country.value;
const FirstPhotoCamera = await photoedit.camera.innerText;
const FirstPhotoIso = await photoedit.iso.value;
const FirstPhotoExposure = await photoedit.exposure.value;
const FirstPhotoLens = await photoedit.lens.innerText;
const FirstPhotoFnumber = await photoedit.fnumber.value;
const FirstPhotoFocalLength = await photoedit.focallength.value;
const FirstPhotoSubject = await photoedit.subject.value;
const FirstPhotoArtist = await photoedit.artist.value;
const FirstPhotoCopyright = await photoedit.copyright.value;
const FirstPhotoLicense = await photoedit.license.value;
const FirstPhotoDescription = await photoedit.description.value;
const FirstPhotoKeywords = await photoedit.keywords.value;
const FirstPhotoNotes = await photoedit.notes.value;
await t
.typeText(Selector(".input-title input"), "Not saved photo title", { replace: true })
.click(Selector("button.action-close"))
.click(Selector("button.action-date-edit").withAttribute("data-uid", FirstPhoto))
.expect(Selector(".input-title input").value)
.eql(FirstPhotoTitle);
await page.editPhoto(
.typeText(photoedit.title, "Not saved photo title", { replace: true })
.click(photoedit.detailsClose)
.click(Selector("button.action-date-edit").withAttribute("data-uid", FirstPhotoUid));
await t.expect(photoedit.title.value).eql(FirstPhotoTitle);
await photoedit.editPhoto(
"New Photo Title",
"Europe/Moscow",
"15",
@ -283,20 +239,29 @@ test.meta("testID", "photos-007")("Edit photo/video", async (t) => {
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await t.click(Selector("button.action-reload"));
await toolbar.triggerToolbarAction("reload");
}
await t
.expect(Selector("button.action-title-edit").withAttribute("data-uid", FirstPhoto).innerText)
.expect(page.cardTitle.withAttribute("data-uid", FirstPhotoUid).innerText)
.eql("New Photo Title");
await page.selectPhotoFromUID(FirstPhoto);
await page.editSelected();
await page.checkEditFormValues(
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
//const expectedValues = [{ FirstPhotoTitle: photoedit.title }, { "bluh bla": photoedit.day }];
/*const expectedValues = [
[FirstPhotoTitle, photoedit.title],
["blah", photoedit.day],
];
await photoedit.checkEditFormValuesNewNew(expectedValues);*/
await photoedit.checkEditFormValues(
"New Photo Title",
"15",
"07",
"2019",
"04:30:30",
"",
"Europe/Moscow",
"Albania",
"-1",
@ -314,9 +279,10 @@ test.meta("testID", "photos-007")("Edit photo/video", async (t) => {
"Super nice cat license",
"Description of a nice image :)",
"cat",
""
"Some notes"
);
await page.undoPhotoEdit(
await photoedit.undoPhotoEdit(
FirstPhotoTitle,
FirstPhotoTimezone,
FirstPhotoDay,
@ -339,54 +305,15 @@ test.meta("testID", "photos-007")("Edit photo/video", async (t) => {
FirstPhotoKeywords,
FirstPhotoNotes
);
const clipboardCount = await Selector("span.count-clipboard", { timeout: 5000 });
await t
.expect(clipboardCount.textContent)
.eql("1")
.click(Selector(".action-clear"))
.expect(Selector("button.action-menu").exists, { timeout: 5000 })
.notOk();
await contextmenu.checkContextMenuCount("1");
await contextmenu.clearSelection();
});
test.meta("testID", "photos-008")("Change primary file", async (t) => {
await page.openNav();
await t.click(Selector(".nav-browse")).click(Selector(".p-expand-search"));
await page.search("ski");
const SequentialPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
test.skip.meta("testID", "photos-006")("Navigate from card view to place", async (t) => {
await toolbar.setFilter("view", "Cards");
await t.click(page.cardLocation.nth(0));
await t.expect(Selector(".input-open").visible).ok();
if (t.browser.platform === "desktop") {
console.log(t.browser.platform);
await t
.click(Selector(".input-open"))
.click(Selector(".action-next", { timeout: 5000 }))
.click(Selector(".action-previous"))
.click(Selector(".action-close"));
}
await page.setFilter("view", "Cards");
await t
.click(Selector("button.action-title-edit").withAttribute("data-uid", SequentialPhoto))
.click(Selector("#tab-files"));
const FirstFile = await Selector("div.caption").nth(0).innerText;
await t
.expect(FirstFile)
.contains("photos8_1_ski.jpg")
.click(Selector("li.v-expansion-panel__container").nth(1))
.click(Selector(".action-primary"))
.click(Selector("button.action-close"))
.click(Selector("button.action-title-edit").withAttribute("data-uid", SequentialPhoto));
const FirstFileAfterChange = await Selector("div.caption").nth(0).innerText;
await t
.expect(FirstFileAfterChange)
.notContains("photos8_1_ski.jpg")
.expect(FirstFileAfterChange)
.contains("photos8_2_ski.jpg");
});
test.meta("testID", "photos-009")("Navigate from card view to place", async (t) => {
await page.setFilter("view", "Cards");
await t
.click(Selector("button.action-location").nth(0))
.expect(Selector("#map").exists, { timeout: 15000 })
.ok()
.expect(Selector("div.p-map-control").visible)
@ -395,156 +322,56 @@ test.meta("testID", "photos-009")("Navigate from card view to place", async (t)
.notEql("");
});
test.meta("testID", "photos-010")("Ungroup files", async (t) => {
await page.openNav();
await t.click(Selector(".nav-browse")).click(Selector(".p-expand-search"));
await page.search("group");
await page.setFilter("view", "Cards");
const PhotoCount = await Selector("button.action-title-edit", { timeout: 5000 }).count;
const SequentialPhoto = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await t.expect(PhotoCount).eql(1);
await page.openNav();
await t
.click(Selector("div.nav-browse + div"))
.click(Selector(".nav-stacks"))
.expect(Selector(".input-open").visible)
.ok()
.click(Selector("button.action-title-edit").withAttribute("data-uid", SequentialPhoto))
.click(Selector("#tab-files"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0))
.click(Selector("div.v-expansion-panel__header__icon").nth(1))
.click(Selector(".action-unstack"))
.wait(12000)
.click(Selector("button.action-close"));
await page.openNav();
await t.click(Selector(".nav-browse")).click(Selector(".p-expand-search"));
await page.search("group");
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await t.click(Selector("button.action-reload"));
}
const PhotoCountAfterUngroup = await Selector("button.action-title-edit", { timeout: 5000 })
.count;
await t.expect(PhotoCountAfterUngroup).eql(2);
});
test.meta("testID", "photos-007")("Mark photos/videos as panorama/scan", async (t) => {
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const FirstVideoUid = await photo.getNthPhotoUid("video", 1);
await menu.openPage("scans");
test.skip.meta("testID", "photos-011")("Delete non primary file", async (t) => {
await page.openNav();
await t
.click(Selector(".nav-library"))
.click(Selector("#tab-library-import"))
.click(Selector(".input-import-folder input"), { timeout: 5000 })
.click(Selector("div.v-list__tile__title").withText("/pizza"))
.click(Selector(".action-import"))
.wait(10000);
await page.openNav();
await t.click(Selector(".nav-browse")).click(Selector(".p-expand-search"));
await page.search("mogale");
await page.setFilter("view", "Cards");
const PhotoCount = await Selector("button.action-title-edit", { timeout: 5000 }).count;
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
const Photo = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
await t
.expect(PhotoCount)
.eql(1)
.click(Selector("button.action-title-edit").withAttribute("data-uid", Photo))
.click(Selector("#tab-files"));
const FileCount = await Selector("li.v-expansion-panel__container", { timeout: 5000 }).count;
await t
.expect(FileCount)
.eql(2)
.click(Selector("li.v-expansion-panel__container").nth(1))
.click(Selector(".action-delete"))
.click(Selector(".action-confirm"))
.wait(10000);
const FileCountAfterDeletion = await Selector("li.v-expansion-panel__container", {
timeout: 5000,
}).count;
await t.expect(FileCountAfterDeletion).eql(1);
});
await menu.openPage("panoramas");
test.meta("testID", "photos-012")("Mark photos/videos as panorama/scan", async (t) => {
await page.openNav();
await page.search("photo:true");
const FirstPhoto = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
await page.search("video:true");
const FirstVideo = await Selector("div.is-photo").nth(1).getAttribute("data-uid");
await page.openNav();
await t
.click(Selector(".nav-browse + div"))
.click(Selector(".nav-scans"))
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", FirstVideo).exists, { timeout: 5000 })
.notOk();
if (t.browser.platform === "mobile") {
await page.openNav();
}
await t
.click(Selector(".nav-panoramas"))
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", FirstVideo).exists, { timeout: 5000 })
.notOk();
await page.openNav();
await t.click(Selector(".nav-browse"));
await page.selectPhotoFromUID(FirstPhoto);
await page.editSelected();
await page.turnSwitchOn("scan");
await page.turnSwitchOn("panorama");
await t.click(Selector(".action-close"));
await page.clearSelection();
await page.selectPhotoFromUID(FirstVideo);
await page.editSelected();
await page.turnSwitchOn("panorama");
await t.click(Selector(".action-close"));
await page.clearSelection();
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", FirstVideo).exists, { timeout: 5000 })
.ok();
if (t.browser.platform === "mobile") {
await page.openNav();
}
await t
.click(Selector(".nav-scans"))
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok();
if (t.browser.platform === "mobile") {
await page.openNav();
}
await t.click(Selector(".nav-panoramas"));
await page.selectPhotoFromUID(FirstPhoto);
await page.editSelected();
await page.turnSwitchOff("panorama");
await page.turnSwitchOff("scan");
await t.click(Selector(".action-close"));
await page.clearSelection();
await page.selectPhotoFromUID(FirstVideo);
await page.editSelected();
await page.turnSwitchOff("panorama");
await t.click(Selector(".action-close"));
await page.clearSelection();
if (t.browser.platform === "mobile") {
await t.eval(() => location.reload());
} else {
await t.click(Selector("button.action-reload"));
}
await t
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", FirstVideo).exists, { timeout: 5000 })
.notOk();
if (t.browser.platform === "mobile") {
await page.openNav();
await t.click(Selector(".nav-browse + div"));
}
await t
.click(Selector(".nav-scans"))
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.notOk()
.expect(Selector("div").withAttribute("data-uid", FirstVideo).exists, { timeout: 5000 })
.notOk();
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await menu.openPage("browse");
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOn("scan");
await photoedit.turnSwitchOn("panorama");
await t.click(photoedit.dialogNext);
await photoedit.turnSwitchOn("scan");
await photoedit.turnSwitchOn("panorama");
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await menu.openPage("scans");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, false);
await menu.openPage("panoramas");
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(FirstVideoUid, true);
await photo.triggerHoverAction("uid", FirstPhotoUid, "select");
await photo.triggerHoverAction("uid", FirstVideoUid, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.turnSwitchOff("scan");
await photoedit.turnSwitchOff("panorama");
await t.click(photoedit.dialogNext);
await photoedit.turnSwitchOff("scan");
await photoedit.turnSwitchOff("panorama");
await t.click(photoedit.dialogClose);
await toolbar.triggerToolbarAction("reload");
await contextmenu.clearSelection();
await photo.checkPhotoVisibility(FirstPhotoUid, false);
await photo.checkPhotoVisibility(FirstVideoUid, false);
});

View file

@ -1,54 +1,53 @@
import { Selector } from "testcafe";
import { ClientFunction } from "testcafe";
import testcafeconfig from "./testcafeconfig.json";
import Page from "./page-model";
import Menu from "../page-model/menu";
const getLocation = ClientFunction(() => document.location.href);
fixture`Test places page`.page`${testcafeconfig.url}`;
const page = new Page();
fixture`Search and open photo from places`.page`${testcafeconfig.url}`.skip(
"Places don't loadin chrome from within the container"
);
const menu = new Menu();
test.meta("testID", "places-001")("Test places", async (t) => {
await page.openNav();
await menu.openPage("places");
await t
.click(Selector(".nav-places"))
.expect(Selector("#map").exists, { timeout: 15000 })
.ok()
.expect(Selector("div.p-map-control").visible)
.ok();
await t.typeText(Selector('input[aria-label="Search"]'), "Berlin").pressKey("enter");
await t
.expect(Selector("div.p-map-control").visible)
.ok()
.expect(getLocation())
.contains("Berlin")
.click(Selector(".nav-browse"))
.expect(Selector("div.is-photo").exists)
.ok()
.click(Selector(".nav-places"))
.contains("Berlin");
await menu.openPage("browse");
await t.expect(Selector("div.is-photo").exists).ok();
await menu.openPage("places");
await t
.expect(Selector("#map").exists, { timeout: 15000 })
.ok()
.expect(Selector("div.p-map-control").visible)
.ok();
});
test.meta("testID", "places-002")("Open photo from places", async (t) => {
//TODO replace wait
if (t.browser.name === "Firefox") {
console.log("Test skipped in firefox");
} else {
await page.openNav();
await t
.click(Selector(".nav-places"))
.expect(Selector("#is-photo-viewer").visible)
.notOk()
.expect(Selector("#map").exists, { timeout: 15000 })
.ok()
.typeText(Selector('input[aria-label="Search"]'), "Berlin")
.pressKey("enter")
.wait(30000)
.click(Selector("div.marker").nth(0), { timeout: 9000 })
.expect(Selector("#photo-viewer").visible)
.ok();
}
await t
.typeText(Selector('input[aria-label="Search"]'), "canada", { replace: true })
.pressKey("enter")
.wait(8000);
await t.expect(Selector('div[title="Cape / Bowen Island / 2019"]').visible).ok();
await t.click(Selector('div[title="Cape / Bowen Island / 2019"]'));
await t.expect(Selector("#photo-viewer").visible).ok();
});

View file

@ -1,36 +1,23 @@
import { Selector } from "testcafe";
import testcafeconfig from "../testcafeconfig";
import Page from "../page-model";
import Menu from "../../page-model/menu";
fixture`Test about`.page`${testcafeconfig.url}`;
const page = new Page();
const menu = new Menu();
test.meta("testID", "about-001")("About page is displayed with all links", async (t) => {
await page.openNav();
await menu.openPage("about");
await t
.click(Selector(".nav-settings + div"))
.click(Selector(".nav-about"))
.expect(Selector('a[href="https://photoprism.app/"]').visible)
.ok()
.expect(Selector('a[href="https://link.photoprism.app/patreon"]').visible)
.ok()
.expect(Selector('a[href="https://link.photoprism.app/roadmap"]').visible)
.ok()
.expect(Selector('a[href="https://docs.photoprism.app/"]').visible)
.ok()
.expect(Selector('a[href="/about/license"]').visible)
.ok()
.expect(Selector('a[href="https://link.photoprism.app/chat"]').visible)
.ok()
.expect(Selector('a[href="https://link.photoprism.app/twitter"]').visible)
.ok();
});
test.meta("testID", "about-002")("License page is displayed with all links", async (t) => {
await page.openNav();
await menu.openPage("license");
await t
.click(Selector(".nav-settings + div"))
.click(Selector(".nav-license"))
.expect(Selector("h3").withText("GNU AFFERO GENERAL PUBLIC LICENSE").visible)
.ok()
.expect(Selector('a[href="https://www.gnu.org/licenses/agpl-3.0.en.html"]').visible)

View file

@ -1 +0,0 @@
//TODO test accounts!

View file

@ -1,274 +1,416 @@
import { Selector } from "testcafe";
import testcafeconfig from "../testcafeconfig";
import Page from "../page-model";
import Menu from "../../page-model/menu";
import Toolbar from "../../page-model/toolbar";
import ContextMenu from "../../page-model/context-menu";
import PhotoViewer from "../../page-model/photoviewer";
import Page from "../../page-model/page";
import Photo from "../../page-model/photo";
import PhotoEdit from "../../page-model/photo-edit";
import Album from "../../page-model/album";
import Settings from "../../page-model/settings";
import Library from "../../page-model/library";
fixture`Test settings`.page`${testcafeconfig.url}`;
const menu = new Menu();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photoviewer = new PhotoViewer();
const page = new Page();
const photo = new Photo();
const photoedit = new PhotoEdit();
const album = new Album();
const settings = new Settings();
const library = new Library();
test.meta("testID", "settings-general-001")("General Settings", async (t) => {
await t.expect(Selector(".action-upload").exists, { timeout: 5000 }).ok();
await page.openNav();
await t
.expect(Selector(".nav-browse").innerText)
.contains("Search")
.click(Selector(".nav-browse"));
await page.setFilter("view", "Cards");
await page.search("photo:true stack:true");
await page.toggleSelectNthPhoto(0);
await t
.click(Selector("button.action-menu"))
.expect(Selector("button.action-download").visible)
.ok()
.expect(Selector("button.action-share").visible)
.ok()
.expect(Selector("button.action-edit").visible)
.ok()
.expect(Selector("button.action-private").visible)
.ok();
await page.editSelected();
await t
.click(Selector("#tab-files"))
.expect(Selector("button.action-download").nth(0).visible)
.ok()
.click(Selector("li.v-expansion-panel__container").nth(1))
.expect(Selector("button.action-download").nth(1).visible)
.ok()
.expect(Selector("button.action-delete").visible)
.ok()
.click(Selector("button.action-close"));
await page.clearSelection();
await t.click(Selector("div.is-photo").nth(0));
await t
.expect(Selector("#photo-viewer").visible)
.ok()
.expect(Selector(".action-download").exists)
.ok()
.hover(Selector('button[title="Close"]'))
.click(Selector('button[title="Close"]'));
if (t.browser.os.name !== "macOS") {
if (await Selector('button[title="Close"]').exists) {
await t.click(Selector('button[title="Close"]'));
}
}
await t
.expect(Selector("button.action-location").visible)
.ok()
.click(Selector("button.action-title-edit").nth(0))
.expect(Selector(".input-title input", { timeout: 8000 }).hasAttribute("disabled"))
.notOk()
.click(Selector("#tab-labels"))
.expect(Selector("button.p-photo-label-add").visible)
.ok()
.click(Selector("#tab-details"))
.click(Selector("button.action-close"));
await page.openNav();
await t
.click(Selector(".nav-library"))
.expect(Selector("#tab-library-import a").visible)
.ok()
.expect(Selector("#tab-library-logs a").visible)
.ok();
await page.openNav();
await t.click(Selector("div.nav-browse + div")).click(Selector(".nav-archive"));
await page.toggleSelectNthPhoto(0);
await t
.click(Selector("button.action-menu"))
.expect(Selector("button.action-delete").exists)
.ok();
await page.clearSelection();
await page.openNav();
await t
.expect(Selector(".nav-archive").visible)
.ok()
.expect(Selector(".nav-review").visible)
.ok()
.click(Selector("div.nav-library + div"))
.expect(Selector(".nav-originals").visible)
.ok()
.click(Selector("div.nav-albums + div"))
.expect(Selector(".nav-folders").visible)
.ok()
.expect(Selector(".nav-moments").visible)
.ok()
.expect(Selector(".nav-people").visible)
.ok()
.expect(Selector(".nav-labels").visible)
.ok()
.expect(Selector(".nav-places").visible)
.ok()
.expect(Selector(".nav-private").visible)
.ok()
.click(Selector(".nav-settings"))
.click(Selector(".input-language input"))
.hover(Selector("div").withText("Deutsch").parent('div[role="listitem"]'))
.click(Selector("div").withText("Deutsch").parent('div[role="listitem"]'))
.click(Selector(".input-upload input"))
.click(Selector(".input-download input"))
.click(Selector(".input-import input"))
.click(Selector(".input-archive input"))
.click(Selector(".input-edit input"))
.click(Selector(".input-files input"))
.click(Selector(".input-people input"))
.click(Selector(".input-moments input"))
.click(Selector(".input-labels input"))
.click(Selector(".input-logs input"))
.click(Selector(".input-share input"))
.click(Selector(".input-places input"))
.click(Selector(".input-delete input"))
.click(Selector(".input-private input"))
.click(Selector("#tab-settings-library"))
.click(Selector(".input-review input"));
await page.openNav();
await t.eval(() => location.reload());
await page.openNav();
await t.click(Selector(".nav-calendar"));
await page.checkButtonVisibility("download", false, false);
await page.openNav();
await t.click(Selector(".nav-calendar"));
await page.checkButtonVisibility("share", false, false);
await page.openNav();
await t.click(Selector(".nav-calendar"));
await page.checkButtonVisibility("upload", false, false);
await page.openNav();
await t.click(Selector(".nav-folders"));
await page.checkButtonVisibility("download", false, false);
await page.openNav();
await t.click(Selector(".nav-folders"));
await page.checkButtonVisibility("share", false, false);
await page.openNav();
await t.click(Selector(".nav-folders"));
await page.checkButtonVisibility("upload", false, false);
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.checkButtonVisibility("download", false, false);
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.checkButtonVisibility("share", false, false);
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.checkButtonVisibility("upload", false, false);
await page.openNav();
await t
.click(Selector(".nav-browse"))
.expect(Selector("button.action-upload").exists)
.notOk()
.expect(Selector(".nav-browse").innerText)
.contains("Suche")
.click(Selector(".nav-browse"));
await page.search("photo:true stack:true");
await page.toggleSelectNthPhoto(0);
await t
.click(Selector("button.action-menu"))
.expect(Selector("button.action-download").exists)
.notOk()
.expect(Selector("button.action-share").exists)
.notOk()
.expect(Selector("button.action-edit").visible)
.notOk()
.expect(Selector("button.action-private").exists)
.notOk()
.click(Selector("button.action-title-edit").nth(0))
.click(Selector("#tab-files"))
.expect(Selector("button.action-download").nth(0).visible)
.notOk()
.click(Selector("li.v-expansion-panel__container").nth(1))
.expect(Selector("button.action-download").nth(1).visible)
.notOk()
.expect(Selector("button.action-delete").visible)
.notOk()
.click(Selector("button.action-close"));
await page.search("photo:true");
await t
.hover(Selector(".is-photo.type-image").nth(0))
.click(Selector(".is-photo.type-image .action-fullscreen").nth(0));
await t
.expect(Selector("#photo-viewer", { timeout: 5000 }).visible)
.ok()
.expect(Selector(".action-download").exists)
.notOk()
.hover(Selector('button[title="Schließen"]'))
.click(Selector('button[title="Schließen"]'));
if (await Selector('button[title="Schließen"]').visible) {
await t.click(Selector('button[title="Schließen"]'));
}
await page.toggleSelectNthPhoto(0);
await t
.expect(Selector("button.action-location").exists)
.notOk()
.click(Selector("button.action-title-edit").nth(0))
.expect(Selector(".input-title input").hasAttribute("disabled"))
.ok()
.expect(Selector(".input-latitude input").hasAttribute("disabled"))
.ok()
.expect(Selector(".input-timezone input").hasAttribute("disabled"))
.ok()
.expect(Selector(".input-country input").hasAttribute("disabled"))
.ok()
.expect(Selector(".input-description textarea").hasAttribute("disabled"))
.ok()
.expect(Selector(".input-keywords textarea").hasAttribute("disabled"))
.ok()
.click(Selector("#tab-labels"))
.expect(Selector("button.p-photo-label-add").exists)
.notOk()
.click(Selector("#tab-details"))
.click(Selector("button.action-close"));
await page.openNav();
await t
.click(Selector(".nav-library"))
.expect(Selector("#tab-library-import a").exists)
.notOk()
.expect(Selector("#tab-library-logs a").exists)
.notOk();
await page.openNav();
await t
.click(Selector("div.nav-browse + div"))
.expect(Selector(".nav-archive").visible)
.notOk()
.expect(Selector(".nav-review").exists)
.notOk()
.click(Selector("div.nav-library + div"))
.expect(Selector(".nav-originals").visible)
.notOk()
.click(Selector("div.nav-albums + div"))
.expect(Selector(".nav-moments").visible)
.notOk()
.expect(Selector(".nav-people").visible)
.notOk()
.expect(Selector(".nav-labels").visible)
.notOk()
.expect(Selector(".nav-places").visible)
.notOk()
.expect(Selector(".nav-private").visible)
.notOk()
test.meta("testID", "settings-general-001").meta({ type: "smoke" })("Disable delete", async (t) => {
await menu.openPage("archive");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("delete", true);
await contextmenu.clearSelection();
await menu.openPage("settings");
await t.click(settings.deleteCheckbox);
await menu.openPage("archive");
await photo.triggerHoverAction("nth", 0, "select");
.click(Selector(".nav-settings"))
.click(Selector(".input-language input"))
.hover(Selector("div").withText("English").parent('div[role="listitem"]'))
.click(Selector("div").withText("English").parent('div[role="listitem"]'))
.click(Selector(".input-upload input"))
.click(Selector(".input-download input"))
.click(Selector(".input-import input"))
.click(Selector(".input-archive input"))
.click(Selector(".input-edit input"))
.click(Selector(".input-files input"))
.click(Selector(".input-moments input"))
.click(Selector(".input-labels input"))
.click(Selector(".input-logs input"))
.click(Selector(".input-share input"))
.click(Selector(".input-places input"))
.click(Selector(".input-private input"))
.click(Selector("#tab-settings-library"))
.click(Selector(".input-review input"));
await page.openNav();
await t.click(Selector("div.nav-browse + div")).click(Selector(".nav-archive"));
await page.toggleSelectNthPhoto(0);
await t
.click(Selector("button.action-menu"))
.expect(Selector("button.action-delete").exists)
.notOk();
await page.clearSelection();
await page.openNav();
await t.click(Selector(".nav-settings")).click(Selector(".input-delete input"));
await contextmenu.checkContextMenuActionAvailability("restore", true);
await contextmenu.checkContextMenuActionAvailability("delete", false);
await contextmenu.clearSelection();
await menu.openPage("browse");
await toolbar.search("stack:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.filesTab);
await t.click(photoedit.toggleExpandFile.nth(1));
await t.expect(photoedit.deleteFile.visible).notOk();
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await menu.openPage("settings");
await t.click(settings.deleteCheckbox);
});
test.meta("testID", "settings-general-002").meta({ type: "smoke" })(
"Change language",
async (t) => {
await t.expect(Selector(".nav-browse").innerText).contains("Search");
await menu.openPage("settings");
await t
.click(settings.languageInput)
.hover(Selector("div").withText("Deutsch").parent('div[role="listitem"]'))
.click(Selector("div").withText("Deutsch").parent('div[role="listitem"]'));
await t.eval(() => location.reload());
await t.expect(Selector(".nav-browse").innerText).contains("Suche");
await t
.click(settings.languageInput)
.hover(Selector("div").withText("English").parent('div[role="listitem"]'))
.click(Selector("div").withText("English").parent('div[role="listitem"]'));
await t.expect(Selector(".nav-browse").innerText).contains("Search");
}
);
test.meta("testID", "settings-general-003").meta({ type: "smoke" })(
"Disable pages: import, originals, logs, moments, places, library",
async (t) => {
await t.expect(page.cardLocation.exists).ok();
await menu.openPage("library");
await t
.expect(library.importTab.visible)
.ok()
.expect(library.logsTab.visible)
.ok()
.expect(library.indexTab.visible)
.ok();
await menu.checkMenuItemAvailability("originals", true);
await menu.checkMenuItemAvailability("folders", true);
await menu.checkMenuItemAvailability("moments", true);
await menu.checkMenuItemAvailability("places", true);
await menu.checkMenuItemAvailability("library", true);
await menu.openPage("settings");
await t
.click(settings.importCheckbox)
.click(settings.filesCheckbox)
.click(settings.momentsCheckbox)
.click(settings.logsCheckbox)
.click(settings.placesCheckbox);
await t.eval(() => location.reload());
await menu.openPage("browse");
await t.expect(page.cardLocation.exists).notOk();
await menu.openPage("library");
await t
.expect(library.importTab.visible)
.notOk()
.expect(library.logsTab.visible)
.notOk()
.expect(library.indexTab.visible)
.ok();
await menu.checkMenuItemAvailability("originals", false);
await menu.checkMenuItemAvailability("folders", true);
await menu.checkMenuItemAvailability("moments", false);
await menu.checkMenuItemAvailability("places", false);
await menu.checkMenuItemAvailability("library", true);
await menu.openPage("settings");
await t
.click(settings.importCheckbox)
.click(settings.filesCheckbox)
.click(settings.momentsCheckbox)
.click(settings.logsCheckbox)
.click(settings.placesCheckbox)
.click(settings.libraryCheckbox);
await menu.checkMenuItemAvailability("originals", false);
await menu.checkMenuItemAvailability("folders", true);
await menu.checkMenuItemAvailability("moments", true);
await menu.checkMenuItemAvailability("places", true);
await menu.checkMenuItemAvailability("library", false);
await t.click(settings.libraryCheckbox);
await menu.checkMenuItemAvailability("originals", true);
await menu.checkMenuItemAvailability("library", true);
}
);
test.meta("testID", "settings-general-004").meta({ type: "smoke" })(
"Disable people and labels",
async (t) => {
await t.click(page.cardTitle.nth(0));
await t.click(photoedit.labelsTab);
await t.expect(photoedit.addLabel.visible).ok();
await t.click(photoedit.peopleTab);
await t.expect(Selector("div.p-faces").visible).ok();
await t.click(photoedit.dialogClose);
await menu.checkMenuItemAvailability("people", true);
await menu.checkMenuItemAvailability("labels", true);
await menu.openPage("settings");
await t.click(settings.peopleCheckbox).click(settings.labelsCheckbox);
await t.eval(() => location.reload());
await menu.openPage("browse");
await t.click(page.cardTitle.nth(0));
await t.click(photoedit.labelsTab);
await t.expect(photoedit.addLabel.exists).notOk();
await t.click(photoedit.peopleTab);
await t.expect(Selector("div.p-faces ").exists).notOk();
await t.click(photoedit.dialogClose);
await menu.checkMenuItemAvailability("people", false);
await menu.checkMenuItemAvailability("labels", false);
await menu.openPage("settings");
await t.click(settings.peopleCheckbox).click(settings.labelsCheckbox);
await menu.checkMenuItemAvailability("people", true);
await menu.checkMenuItemAvailability("labels", true);
}
);
test.meta("testID", "settings-general-005").meta({ type: "smoke" })(
"Disable private, archive and quality filter",
async (t) => {
await menu.checkMenuItemAvailability("private", true);
await menu.checkMenuItemAvailability("archive", true);
await menu.checkMenuItemAvailability("review", true);
await toolbar.search("photo:true stack:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("archive", true);
await contextmenu.checkContextMenuActionAvailability("private", true);
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.infoTab);
await photoedit.checkFieldDisabled(photoedit.privateInput, false);
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await toolbar.search("Viewpoint / Mexico / 2017");
await photo.checkPhotoVisibility("pqmxlr7188hz4bih", false);
await toolbar.search("Truck / Vancouver / 2019");
await photo.checkPhotoVisibility("pqmxlr0kg161o9ek", false);
await toolbar.search("Archive / 2020");
await photo.checkPhotoVisibility("pqnah1k2frui6p63", false);
await menu.openPage("settings");
await t
.click(settings.archiveCheckbox)
.click(settings.privateCheckbox)
.click(Selector(settings.libraryTab))
.click(settings.reviewCheckbox);
await t.eval(() => location.reload());
await menu.checkMenuItemAvailability("private", false);
await menu.checkMenuItemAvailability("archive", false);
await menu.checkMenuItemAvailability("review", false);
await menu.openPage("browse");
await toolbar.search("photo:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("archive", false);
await contextmenu.checkContextMenuActionAvailability("private", false);
await contextmenu.triggerContextMenuAction("edit", "");
await t.click(photoedit.infoTab);
//await photoedit.checkFieldDisabled(photoedit.privateInput, true);
await t.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await toolbar.search("Viewpoint / Mexico / 2017");
await photo.checkPhotoVisibility("pqmxlr7188hz4bih", true);
await toolbar.search("Truck / Vancouver / 2019");
await photo.checkPhotoVisibility("pqmxlr0kg161o9ek", false);
await toolbar.search("Archive / 2020");
await photo.checkPhotoVisibility("pqnah1k2frui6p63", true);
await menu.openPage("settings");
await t
.click(settings.privateCheckbox)
.click(settings.archiveCheckbox)
.click(Selector(settings.libraryTab))
.click(settings.reviewCheckbox);
await menu.checkMenuItemAvailability("archive", true);
await menu.checkMenuItemAvailability("private", true);
await menu.checkMenuItemAvailability("review", true);
}
);
test.meta("testID", "settings-general-006").meta({ type: "smoke" })(
"Disable upload, download, edit and share",
async (t) => {
await toolbar.checkToolbarActionAvailability("upload", true);
await toolbar.search("photo:true stack:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("download", true);
await contextmenu.checkContextMenuActionAvailability("share", true);
await contextmenu.checkContextMenuActionAvailability("edit", true);
await contextmenu.triggerContextMenuAction("edit", "");
await photoedit.checkAllDetailsFieldsDisabled(false);
await t.expect(photoedit.infoTab.visible).ok();
await t.click(photoedit.filesTab);
await t
.expect(photoedit.downloadFile.nth(0).visible)
.ok()
.click(photoedit.toggleExpandFile.nth(1))
.expect(photoedit.downloadFile.nth(1).visible)
.ok()
.expect(photoedit.deleteFile.visible)
.ok()
.click(photoedit.dialogClose);
await contextmenu.clearSelection();
await photoviewer.openPhotoViewer("nth", 0);
await photoviewer.checkPhotoViewerActionAvailability("download", true);
await photoviewer.triggerPhotoViewerAction("close");
await menu.openPage("settings");
await t
.click(settings.uploadCheckbox)
.click(settings.downloadCheckbox)
.click(settings.editCheckbox)
.click(settings.shareCheckbox);
await t.eval(() => location.reload());
await t.navigateTo("/calendar");
await toolbar.checkToolbarActionAvailability("upload", false);
await album.checkHoverActionAvailability("nth", 2, "share", false);
await album.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("edit", true);
await contextmenu.checkContextMenuActionAvailability("download", false);
await contextmenu.checkContextMenuActionAvailability("share", false);
await contextmenu.clearSelection();
await album.openNthAlbum(0);
await toolbar.checkToolbarActionAvailability("upload", false);
await toolbar.checkToolbarActionAvailability("download", false);
await toolbar.checkToolbarActionAvailability("share", false);
await toolbar.checkToolbarActionAvailability("edit", true);
await t.navigateTo("/folders");
await toolbar.checkToolbarActionAvailability("upload", false);
await album.checkHoverActionAvailability("nth", 0, "share", false);
await album.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("edit", true);
await contextmenu.checkContextMenuActionAvailability("download", false);
await contextmenu.checkContextMenuActionAvailability("share", false);
await contextmenu.clearSelection();
await album.openNthAlbum(0);
await toolbar.checkToolbarActionAvailability("upload", false);
await toolbar.checkToolbarActionAvailability("download", false);
await toolbar.checkToolbarActionAvailability("share", false);
await toolbar.checkToolbarActionAvailability("edit", true);
await t.navigateTo("/albums");
await toolbar.checkToolbarActionAvailability("upload", false);
await album.checkHoverActionAvailability("nth", 0, "share", false);
await album.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("edit", true);
await contextmenu.checkContextMenuActionAvailability("delete", true);
await contextmenu.checkContextMenuActionAvailability("download", false);
await contextmenu.checkContextMenuActionAvailability("share", false);
await contextmenu.clearSelection();
await album.openNthAlbum(0);
await toolbar.checkToolbarActionAvailability("upload", false);
await toolbar.checkToolbarActionAvailability("download", false);
await toolbar.checkToolbarActionAvailability("share", false);
await toolbar.checkToolbarActionAvailability("edit", true);
await t.navigateTo("/browse");
await toolbar.checkToolbarActionAvailability("upload", false);
await toolbar.search("photo:true stack:true");
await photo.triggerHoverAction("nth", 0, "select");
await contextmenu.checkContextMenuActionAvailability("download", false);
await contextmenu.checkContextMenuActionAvailability("share", false);
await contextmenu.checkContextMenuActionAvailability("edit", false);
await contextmenu.clearSelection();
await t.click(page.cardTitle.nth(0));
await photoedit.checkAllDetailsFieldsDisabled(true);
await t.expect(photoedit.infoTab.visible).notOk();
await t.click(photoedit.filesTab);
await t
.expect(photoedit.downloadFile.nth(0).visible)
.notOk()
.click(photoedit.toggleExpandFile.nth(1))
.expect(photoedit.downloadFile.nth(1).visible)
.notOk()
.expect(photoedit.deleteFile.visible)
.ok();
await t.click(photoedit.dialogClose);
await toolbar.search("photo:true");
await photoviewer.openPhotoViewer("nth", 0);
await photoviewer.checkPhotoViewerActionAvailability("download", false);
await photoviewer.checkPhotoViewerActionAvailability("edit", true);
await photoviewer.triggerPhotoViewerAction("close");
await menu.openPage("settings");
await t
.click(settings.uploadCheckbox)
.click(settings.downloadCheckbox)
.click(settings.editCheckbox)
.click(settings.shareCheckbox);
}
);

View file

@ -1,212 +1,148 @@
import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";
import Menu from "../page-model/menu";
import Album from "../page-model/album";
import Toolbar from "../page-model/toolbar";
import ContextMenu from "../page-model/context-menu";
import Photo from "../page-model/photo";
import Page from "../page-model/page";
import AlbumDialog from "../page-model/dialog-album";
fixture`Test states`.page`${testcafeconfig.url}`;
const menu = new Menu();
const album = new Album();
const toolbar = new Toolbar();
const contextmenu = new ContextMenu();
const photo = new Photo();
const page = new Page();
const albumdialog = new AlbumDialog();
test.meta("testID", "states-001")("Update state details", async (t) => {
await menu.openPage("states");
await toolbar.search("Canada");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await t.expect(page.cardTitle.nth(0).innerText).contains("British Columbia");
await t.click(page.cardTitle.nth(0));
test.meta("testID", "states-001")("Update state", async (t) => {
await page.openNav();
await t.click(Selector(".nav-places + div")).click(Selector(".nav-states"));
await page.search("Canada");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t
.expect(Selector("button.action-title-edit").nth(0).innerText)
.contains("British Columbia")
.click(Selector(".action-title-edit").nth(0))
.expect(Selector(".input-title input").value)
.expect(albumdialog.title.value)
.eql("British Columbia")
.expect(Selector(".input-location input").value)
.expect(albumdialog.location.value)
.eql("Canada")
.typeText(Selector(".input-title input"), "Wonderland", { replace: true })
.typeText(Selector(".input-location input"), "Earth", { replace: true })
.expect(Selector(".input-description textarea").value)
.expect(albumdialog.description.value)
.eql("")
.expect(Selector(".input-category input").value)
.eql("")
.typeText(Selector(".input-description textarea"), "We love earth")
.typeText(Selector(".input-category input"), "Mountains")
.expect(albumdialog.category.value)
.eql("");
await t
.typeText(albumdialog.title, "Wonderland", { replace: true })
.typeText(albumdialog.location, "Earth", { replace: true })
.typeText(albumdialog.description, "We love earth")
.typeText(albumdialog.category, "Mountains")
.pressKey("enter")
.click(".action-confirm")
.expect(Selector("button.action-title-edit").nth(0).innerText)
.click(albumdialog.dialogSave);
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("Wonderland")
.expect(Selector('div[title="Description"]').nth(0).innerText)
.expect(page.cardDescription.nth(0).innerText)
.contains("We love earth")
.expect(Selector("div.caption").nth(1).innerText)
.contains("Mountains")
.expect(Selector("div.caption").nth(2).innerText)
.contains("Earth")
.click(Selector("a.is-album").nth(0));
await t
.expect(Selector(".v-card__text").nth(0).innerText)
.contains("We love earth")
.expect(Selector("div").withText("Wonderland").exists)
.ok();
await page.openNav();
await t.click(Selector(".nav-states"));
.contains("Earth");
await album.openNthAlbum(0);
await t.expect(toolbar.toolbarTitle.innerText).contains("Wonderland");
await t.expect(toolbar.toolbarDescription.innerText).contains("We love earth");
await menu.openPage("states");
if (t.browser.platform === "mobile") {
await page.search("category:Mountains");
await toolbar.search("category:Mountains");
} else {
await t
.click(Selector(".input-category"))
.click(Selector('div[role="listitem"]').withText("Mountains"));
await toolbar.setFilter("category", "Mountains");
}
await t.expect(Selector("button.action-title-edit").nth(0).innerText).contains("Wonderland");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
await t.expect(page.cardTitle.nth(0).innerText).contains("Wonderland");
await album.openAlbumWithUid(AlbumUid);
await toolbar.triggerToolbarAction("edit");
await t
.click(Selector(".action-edit"))
.expect(Selector(".input-description textarea").value)
.expect(albumdialog.description.value)
.eql("We love earth")
.expect(Selector(".input-category input").value)
.expect(albumdialog.category.value)
.eql("Mountains")
.expect(Selector(".input-location input").value)
.eql("Earth")
.typeText(Selector(".input-title input"), "British Columbia / Canada", { replace: true })
.click(Selector(".input-category input"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(Selector(".input-description textarea"))
.pressKey("ctrl+a delete")
.pressKey("enter")
.typeText(Selector(".input-location input"), "Canada", { replace: true })
.click(".action-confirm");
await page.openNav();
await t.click(Selector(".nav-states"));
await page.search("Canada");
.expect(albumdialog.location.value)
.eql("Earth");
await t
.expect(Selector("button.action-title-edit").nth(0).innerText)
.typeText(albumdialog.title, "British Columbia / Canada", { replace: true })
.click(albumdialog.category)
.pressKey("ctrl+a delete")
.pressKey("enter")
.click(albumdialog.description)
.pressKey("ctrl+a delete")
.pressKey("enter")
.typeText(albumdialog.location, "Canada", { replace: true })
.click(albumdialog.dialogSave);
await menu.openPage("states");
await toolbar.search("Canada");
await t
.expect(page.cardTitle.nth(0).innerText)
.contains("British Columbia / Canada")
.expect(Selector('div[title="Description"]').innerText)
.expect(page.cardDescription.innerText)
.notContains("We love earth")
.expect(Selector("div.caption").nth(0).innerText)
.notContains("Earth");
});
test.meta("testID", "states-002")("Download states", async (t) => {
await page.openNav();
await t.click(Selector(".nav-places + div")).click(Selector(".nav-states"));
await page.checkButtonVisibility("download", true, true);
});
//TODO test that sharing link works as expected
test.meta("testID", "states-003")("Create, Edit, delete sharing link", async (t) => {
test.meta("testID", "states-002")("Create, Edit, delete sharing link for state", async (t) => {
await page.testCreateEditDeleteSharingLink("states");
/* await page.openNav();
await t
.click(Selector(".nav-places + div"))
.click(Selector(".nav-states"));
const FirstAlbum = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await page.selectFromUID(FirstAlbum);
const clipboardCount = await Selector("span.count-clipboard");
await t
.expect(clipboardCount.textContent)
.eql("1")
.click(Selector("button.action-menu"))
.click(Selector("button.action-share"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0));
const InitialUrl = await Selector(".action-url").innerText;
const InitialSecret = await Selector(".input-secret input").value;
const InitialExpire = await Selector("div.v-select__selections").innerText;
await t
.expect(InitialUrl)
.notContains("secretfortesting")
.expect(InitialExpire)
.contains("Never")
.typeText(Selector(".input-secret input"), "secretForTesting", { replace: true })
.click(Selector(".input-expires input"))
.click(Selector("div").withText("After 1 day").parent('div[role="listitem"]'))
.click(Selector("button.action-save"))
.click(Selector("button.action-close"));
await page.clearSelection();
await t
.click(Selector("a.is-album").withAttribute("data-uid", FirstAlbum))
.click(Selector("button.action-share"))
.click(Selector("div.v-expansion-panel__header__icon").nth(0));
const UrlAfterChange = await Selector(".action-url").innerText;
const ExpireAfterChange = await Selector("div.v-select__selections").innerText;
await t
.expect(UrlAfterChange)
.contains("secretfortesting")
.expect(ExpireAfterChange)
.contains("After 1 day")
.typeText(Selector(".input-secret input"), InitialSecret, { replace: true })
.click(Selector(".input-expires input"))
.click(Selector("div").withText("Never").parent('div[role="listitem"]'))
.click(Selector("button.action-save"))
.click(Selector("div.v-expansion-panel__header__icon"));
const LinkCount = await Selector(".action-url").count;
await t.click(".action-add-link");
const LinkCountAfterAdd = await Selector(".action-url").count;
await t
.expect(LinkCountAfterAdd)
.eql(LinkCount + 1)
.click(Selector("div.v-expansion-panel__header__icon"))
.click(Selector(".action-delete"));
const LinkCountAfterDelete = await Selector(".action-url").count;
await t
.expect(LinkCountAfterDelete)
.eql(LinkCountAfterAdd - 1)
.click(Selector("button.action-close"));
await page.openNav();
await t
.click(".nav-states")
.click("a.uid-" + FirstAlbum + " .action-share")
.click(Selector("div.v-expansion-panel__header__icon"))
.click(Selector(".action-delete"));*/
});
test.meta("testID", "states-004")("Create/delete album during add to album", async (t) => {
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbums = await Selector("a.is-album").count;
await page.openNav();
await t.click(Selector(".nav-places + div")).click(Selector(".nav-states"));
await page.search("Canada");
const FirstMoment = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", FirstMoment));
const PhotoCountInMoment = await Selector("div.is-photo").count;
const FirstPhoto = await Selector("div.is-photo.type-image").nth(0).getAttribute("data-uid");
const SecondPhoto = await Selector("div.is-photo.type-image").nth(1).getAttribute("data-uid");
await page.openNav();
await t.click(Selector(".nav-states"));
await page.selectFromUID(FirstMoment);
await page.addSelectedToAlbum("NotYetExistingAlbumForMoment", "clone");
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterCreation = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterCreation).eql(countAlbums + 1);
await page.search("NotYetExistingAlbumForMoment");
const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
const PhotoCountInAlbum = await Selector("div.is-photo").count;
await t
.expect(PhotoCountInAlbum)
.eql(PhotoCountInMoment)
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.ok();
await page.openNav();
await t.click(Selector(".nav-albums"));
await page.selectFromUID(AlbumUid);
await page.deleteSelected();
await page.openNav();
await t.click(Selector(".nav-albums"));
const countAlbumsAfterDelete = await Selector("a.is-album").count;
await t.expect(countAlbumsAfterDelete).eql(countAlbums);
await t
.click(Selector(".nav-states"))
.click(Selector("a.is-album").withAttribute("data-uid", FirstMoment))
.expect(Selector("div").withAttribute("data-uid", FirstPhoto).exists, { timeout: 5000 })
.ok()
.expect(Selector("div").withAttribute("data-uid", SecondPhoto).exists, { timeout: 5000 })
.ok();
});
test.meta("testID", "states-003")("Create/delete album-clone from state", async (t) => {
await menu.openPage("albums");
const AlbumCount = await album.getAlbumCount("all");
await menu.openPage("states");
await toolbar.search("Canada");
const FirstStateUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(FirstStateUid);
const PhotoCountInState = await photo.getPhotoCount("all");
const FirstPhotoUid = await photo.getNthPhotoUid("image", 0);
const SecondPhotoUid = await photo.getNthPhotoUid("image", 1);
await menu.openPage("states");
await album.selectAlbumFromUID(FirstStateUid);
await contextmenu.triggerContextMenuAction("clone", "NotYetExistingAlbumForState");
await menu.openPage("albums");
const AlbumCountAfterCreation = await album.getAlbumCount("all");
test.meta("testID", "states-005")("Delete states button visible", async (t) => {
await page.openNav();
await t.click(Selector(".nav-places + div")).click(Selector(".nav-states"));
await page.checkButtonVisibility("delete", true, false);
await t.expect(AlbumCountAfterCreation).eql(AlbumCount + 1);
await toolbar.search("NotYetExistingAlbumForState");
const AlbumUid = await album.getNthAlbumUid("all", 0);
await album.openAlbumWithUid(AlbumUid);
const PhotoCountInAlbum = await photo.getPhotoCount("all");
await t.expect(PhotoCountInAlbum).eql(PhotoCountInState);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
await menu.openPage("albums");
await album.selectAlbumFromUID(AlbumUid);
await contextmenu.triggerContextMenuAction("delete", "");
await menu.openPage("albums");
const AlbumCountAfterDelete = await album.getAlbumCount("all");
await t.expect(AlbumCountAfterDelete).eql(AlbumCount);
await menu.openPage("states");
await album.openAlbumWithUid(FirstStateUid);
await photo.checkPhotoVisibility(FirstPhotoUid, true);
await photo.checkPhotoVisibility(SecondPhotoUid, true);
});