Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reenable Cypress test and fix bugs it turned up #2405

Merged
merged 3 commits into from
Sep 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions cypress/config/cypress.dev.json

This file was deleted.

3 changes: 2 additions & 1 deletion cypress/config/cypress.local.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"baseUrl": "http://localhost:8080/",
"hideXHRInCommandLog": true
"hideXHRInCommandLog": true,
"defaultCommandTimeout": 5000
}
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,7 @@ describe('SortWorkView Tests', () => {

});

// TODO: Reinstate the tests below when all metadata documents have the new fields and are being updated in real time.
it.skip("should open Sort Work tab and test sorting by group", () => {
it("should open Sort Work tab and test sorting by group", () => {

const students = ["student:1", "student:2", "student:3", "student:4"];
const studentProblemDocs = [
Expand Down Expand Up @@ -300,15 +299,20 @@ describe('SortWorkView Tests', () => {
sortWork.getSortWorkItem().contains(exemplarDocs[0]).click();
chatPanel.getChatPanelToggle().click();
chatPanel.addCommentTagAndVerify("Diverging Designs");
// FIXME: at the moment it is necessary to comment the document twice.
// Search for "exemplar" in document-comment-hooks.ts for an explanation.
cy.wait(100);
chatPanel.addCommentTagAndVerify("Diverging Designs");

cy.log("check that exemplar document is displayed in new tag");
chatPanel.getChatCloseButton().click();
cy.openTopTab('sort-work');
// at the moment this is required to refresh the sort
sortWork.getPrimarySortByMenu().click();
sortWork.getPrimarySortByNameOption().click();
sortWork.getPrimarySortByMenu().click();
sortWork.getPrimarySortByTagOption().click();
sortWork.getShowForMenu().click();
sortWork.getShowForInvestigationOption().click();
sortWork.getShowForMenu().click();
sortWork.getShowForProblemOption().click();

cy.get('.section-header-arrow').click({multiple: true}); // Open the sections
sortWork.checkDocumentInGroup("Diverging Designs", exemplarDocs[0]);

Expand All @@ -326,7 +330,12 @@ describe('SortWorkView Tests', () => {
sortWork.getPrimarySortByTagOption().click();
cy.get('.section-header-arrow').click({multiple: true}); // Open the sections
sortWork.checkDocumentInGroup("Unit Rate", exemplarDocs[0]);
sortWork.checkGroupIsEmpty("Diverging Designs");

// FIXME: We haven't implemented support for deleting comments
// what should be true:
// sortWork.checkGroupIsEmpty("Diverging Designs");
// what currently happens
sortWork.checkDocumentInGroup("Diverging Designs", exemplarDocs[0]);

cy.log("run CLUE as a student:1 and join group 6");
runClueAsStudent(students[0], 6);
Expand Down
19 changes: 0 additions & 19 deletions cypress/run_cypress_test.sh

This file was deleted.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@
"test:coverage:watch": "jest --coverage --watchAll",
"test:coverage:cypress:open": "cypress open --env coverage=true",
"test:cypress": "cypress run --env testEnv=local",
"test:cypress:ci": "cypress run --env testEnv=local --record",
"test:cypress:open": "cypress open --env testEnv=local",
"test:cypress:open:disable-gpu": "cross-env ELECTRON_EXTRA_LAUNCH_ARGS=--disable-gpu cypress open --env testEnv=local",
"test:cypress:smoke": "cypress run --spec 'cypress/e2e/smoke/single_student_canvas_test.js' --env testEnv=local",
Expand Down
4 changes: 2 additions & 2 deletions src/components/document/sorted-section.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ interface IProps {
secondarySort: SecondarySortType;
}

export const SortedSection: React.FC<IProps> = observer(function SortedDocuments(props: IProps) {
export const SortedSection: React.FC<IProps> = observer(function SortedSection(props: IProps) {
const { docFilter, documentGroup, idx, secondarySort } = props;
const { persistentUI, sortedDocuments } = useStores();
const [showDocuments, setShowDocuments] = useState(false);
Expand Down Expand Up @@ -51,7 +51,7 @@ export const SortedSection: React.FC<IProps> = observer(function SortedDocuments

const renderUngroupedDocument = (doc: IDocumentMetadata) => {
const fullDocument = getDocument(doc.key);
if (!fullDocument) return <div className="loading-spinner"/>;
if (!fullDocument) return <div key={doc.key} className="loading-spinner"/>;

return <DecoratedDocumentThumbnailItem
key={doc.key}
Expand Down
5 changes: 2 additions & 3 deletions src/components/thumbnail/simple-document-item.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,11 @@ export const SimpleDocumentItem = ({ document, investigationOrdinal, onSelectDoc
const { documents, class: classStore, unit, user } = useStores();
const { uid } = document;
const userName = classStore.getUserById(uid)?.displayName;
const investigations = unit.investigations;
// TODO: Make it so we don't have to convert investigationOrdinal and problemOrdinal to numbers here? We do so
// because the values originate as strings. Changing their types to numbers in the model would make this unnecessary,
// but doing that causes errors elsewhere when trying to load documents that aren't associated with a problem.
const investigation = investigations[Number(investigationOrdinal)];
const problem = investigation?.problems[Number(problemOrdinal) - 1];
const investigation = unit.getInvestigation(Number(investigationOrdinal));
const problem = investigation?.getProblem(Number(problemOrdinal));
const title = document.title ? `${userName}: ${document.title}` : `${userName}: ${problem?.title ?? "unknown title"}`;
const isPrivate = !isDocumentAccessibleToUser(document, user, documents);

Expand Down
5 changes: 5 additions & 0 deletions src/hooks/document-comment-hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@ export const usePostDocumentComment = (options?: PostDocumentCommentUseMutationO
// FIXME: provide access to remoteContext here so we can update strategies on remote
// documents. Alternatively move this into a firebase function instead of doing this
// in the client.
// FIXME: in the case of exemplar documents, the metadata document won't exist
// until this mutation happens. That probably means metadataQuery.get() below
// will run before the document has been created so it will return an empty array of
// docs. This is another reason the firebase function approach to keep the strategies
// updated is a better way to go
const metadataQuery = firestore.collection("documents")
.where("key", "==", documentKey)
.where("context_id", "==", context.classHash);
Expand Down
3 changes: 1 addition & 2 deletions src/models/stores/document-group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ export class DocumentGroup {
stores: ISortedDocumentsStores;
label: string;
documents: IDocumentMetadata[];
firestoreTagDocumentMap = new Map<string, Set<string>>();
icon?: FC<SVGProps<SVGSVGElement>>;

constructor(props: IDocumentGroup) {
Expand Down Expand Up @@ -98,7 +97,7 @@ export class DocumentGroup {

get byStrategy(): DocumentGroup[] {
const commentTags = this.stores.appConfig.commentTags;
const tagsWithDocs = getTagsWithDocs(this.documents, commentTags, this.firestoreTagDocumentMap);
const tagsWithDocs = getTagsWithDocs(this.documents, commentTags);

const sortedDocsArr: DocumentGroup[] = [];
Object.entries(tagsWithDocs).forEach((tagKeyAndValObj) => {
Expand Down
45 changes: 29 additions & 16 deletions src/models/stores/sorted-documents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@

export class SortedDocuments {
stores: ISortedDocumentsStores;
firestoreTagDocumentMap = new Map<string, Set<string>>();
firestoreMetadataDocs: IObservableArray<IDocumentMetadata> = observable.array([]);

constructor(stores: ISortedDocumentsStores) {
Expand Down Expand Up @@ -113,7 +112,7 @@

get byStrategy(): DocumentGroup[] {
const commentTags = this.commentTags;
const tagsWithDocs = getTagsWithDocs(this.firestoreMetadataDocs, commentTags, this.firestoreTagDocumentMap);
const tagsWithDocs = getTagsWithDocs(this.firestoreMetadataDocs, commentTags);

const sortedDocsArr: DocumentGroup[] = [];
Object.entries(tagsWithDocs).forEach((tagKeyAndValObj) => {
Expand Down Expand Up @@ -208,20 +207,34 @@
tools.push("Sparrow");
}

const metadata: IDocumentMetadata = {
uid: doc.uid,
type: doc.type,
key: doc.key,
createdAt: doc.createdAt,
title: doc.title,
properties: undefined,
tools,
strategies: exemplarStrategy ? [exemplarStrategy] : [],
investigation: doc.investigation,
problem: doc.problem,
unit: doc.unit
};
docsArray.push(metadata);
const authoredStrategies = exemplarStrategy ? [exemplarStrategy] : [];

const existingMetadataDoc = docsArray.find(metadataDoc => doc.key === metadataDoc.key);
if (existingMetadataDoc) {
// This will happen if a user comments on a exemplar
// That will create a metadata document in Firestore.
// So in this case we want to update this existing metadata document so we don't
// create a duplicate one
const userStrategies = existingMetadataDoc.strategies || [];
existingMetadataDoc.tools = tools;
existingMetadataDoc.strategies = [...new Set([...authoredStrategies, ...userStrategies])];
} else {

Check warning on line 221 in src/models/stores/sorted-documents.ts

View check run for this annotation

Codecov / codecov/patch

src/models/stores/sorted-documents.ts#L221

Added line #L221 was not covered by tests
const metadata: IDocumentMetadata = {
uid: doc.uid,
type: doc.type,
key: doc.key,
createdAt: doc.createdAt,
title: doc.title,
properties: undefined,
tools,
strategies: exemplarStrategy ? [exemplarStrategy] : [],
investigation: doc.investigation,
problem: doc.problem,
unit: doc.unit
};
docsArray.push(metadata);
}

});

runInAction(() => {
Expand Down
19 changes: 5 additions & 14 deletions src/utilities/sort-document-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,10 @@ export const sortNameSectionLabels = (docMapKeys: string[]) => {
});
};

export const getTagsWithDocs = (documents: IDocumentMetadata[], commentTags: Record<string, string>|undefined,
firestoreTagDocumentMap: Map<string, Set<string>>) => {
export const getTagsWithDocs = (
documents: IDocumentMetadata[],
commentTags: Record<string, string>|undefined,
) => {
const tagsWithDocs: Record<string, TagWithDocs> = {};
if (commentTags) {
for (const key of Object.keys(commentTags)) {
Expand All @@ -93,18 +95,7 @@ export const getTagsWithDocs = (documents: IDocumentMetadata[], commentTags: Rec
// in store to find "Documents with no comments" then place those doc keys to "Not Tagged"
const uniqueDocKeysWithTags = new Set<string>();

// grouping documents based on firestore comment tags
firestoreTagDocumentMap.forEach((docKeysSet, tag) => {
const docKeysArray = Array.from(docKeysSet); // Convert the Set to an array
if (tagsWithDocs[tag]) {
docKeysSet.forEach((docKey: string) =>{
uniqueDocKeysWithTags.add(docKey);
});
tagsWithDocs[tag].docKeysFoundWithTag = docKeysArray;
}
});

// adding in (exemplar) documents with authored tags
// Sort documents into their groups
documents.forEach(doc => {
doc.strategies?.forEach(strategy => {
if (tagsWithDocs[strategy]) {
Expand Down
Loading