Add cypress test for validation case
This commit is contained in:
parent
197af2644c
commit
f6cc6f6a83
|
|
@ -1,3 +1,5 @@
|
||||||
|
import {hasOperationName} from '../../support/graphql';
|
||||||
|
|
||||||
const me = require('../../fixtures/me.join-class.json');
|
const me = require('../../fixtures/me.join-class.json');
|
||||||
const {getMinimalMe} = require('../../support/helpers');
|
const {getMinimalMe} = require('../../support/helpers');
|
||||||
|
|
||||||
|
|
@ -28,7 +30,7 @@ describe('School Class Management', () => {
|
||||||
|
|
||||||
const getSelectedClassWithName = () => ({
|
const getSelectedClassWithName = () => ({
|
||||||
id: 'selectedClassId',
|
id: 'selectedClassId',
|
||||||
name: selectedClassName
|
name: selectedClassName,
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.mockGraphqlOps({
|
cy.mockGraphqlOps({
|
||||||
|
|
@ -36,8 +38,8 @@ describe('School Class Management', () => {
|
||||||
MeQuery: () => ({
|
MeQuery: () => ({
|
||||||
me: {
|
me: {
|
||||||
...teacher,
|
...teacher,
|
||||||
selectedClass: getSelectedClassWithName()
|
selectedClass: getSelectedClassWithName(),
|
||||||
}
|
},
|
||||||
}),
|
}),
|
||||||
// JoinClass() {
|
// JoinClass() {
|
||||||
// // fixme: is this necessary? the cache somehow does not seem to do anything for the MeQuery
|
// // fixme: is this necessary? the cache somehow does not seem to do anything for the MeQuery
|
||||||
|
|
@ -62,17 +64,17 @@ describe('School Class Management', () => {
|
||||||
return {
|
return {
|
||||||
joinClass: {
|
joinClass: {
|
||||||
success: true,
|
success: true,
|
||||||
schoolClass: getSelectedClassWithName()
|
schoolClass: getSelectedClassWithName(),
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
MySchoolClassQuery: () => ({
|
MySchoolClassQuery: () => ({
|
||||||
me: {
|
me: {
|
||||||
...teacher,
|
...teacher,
|
||||||
selectedClass: getSelectedClassWithName()
|
selectedClass: getSelectedClassWithName(),
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.visit('/me/profile');
|
cy.visit('/me/profile');
|
||||||
|
|
@ -112,8 +114,8 @@ describe('School Class Management', () => {
|
||||||
},
|
},
|
||||||
MySchoolClassQuery: {
|
MySchoolClassQuery: {
|
||||||
me: {
|
me: {
|
||||||
...teacher
|
...teacher,
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
@ -169,7 +171,7 @@ describe('Teacher Class Management', () => {
|
||||||
const {me: teacher} = getMinimalMe({});
|
const {me: teacher} = getMinimalMe({});
|
||||||
|
|
||||||
let localMe = {
|
let localMe = {
|
||||||
me: teacher
|
me: teacher,
|
||||||
};
|
};
|
||||||
|
|
||||||
cy.mockGraphqlOps({
|
cy.mockGraphqlOps({
|
||||||
|
|
@ -184,7 +186,7 @@ describe('Teacher Class Management', () => {
|
||||||
updateSchoolClass: {
|
updateSchoolClass: {
|
||||||
success: true,
|
success: true,
|
||||||
schoolClass: {
|
schoolClass: {
|
||||||
name: className
|
name: className,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -204,7 +206,7 @@ describe('Teacher Class Management', () => {
|
||||||
const memberId = btoa('GroupMemberNode:1');
|
const memberId = btoa('GroupMemberNode:1');
|
||||||
let classMembers = [
|
let classMembers = [
|
||||||
{...teacher, id: myId, isMe: true, isTeacher: true},
|
{...teacher, id: myId, isMe: true, isTeacher: true},
|
||||||
...members
|
...members,
|
||||||
];
|
];
|
||||||
let me = () => ({
|
let me = () => ({
|
||||||
...teacher,
|
...teacher,
|
||||||
|
|
@ -213,14 +215,14 @@ describe('Teacher Class Management', () => {
|
||||||
name: 'Just some class',
|
name: 'Just some class',
|
||||||
id: 'selectedClassId',
|
id: 'selectedClassId',
|
||||||
readOnly: false,
|
readOnly: false,
|
||||||
members: classMembers
|
members: classMembers,
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.mockGraphqlOps({
|
cy.mockGraphqlOps({
|
||||||
operations: {
|
operations: {
|
||||||
MeQuery: {
|
MeQuery: {
|
||||||
me: me()
|
me: me(),
|
||||||
},
|
},
|
||||||
AddRemoveMember: {
|
AddRemoveMember: {
|
||||||
addRemoveMember: {
|
addRemoveMember: {
|
||||||
|
|
@ -228,7 +230,7 @@ describe('Teacher Class Management', () => {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
MySchoolClassQuery: {
|
MySchoolClassQuery: {
|
||||||
me: me()
|
me: me(),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
@ -249,46 +251,53 @@ describe('Teacher Class Management', () => {
|
||||||
cy.getByDataCy('active-member').should('have.length', 2);
|
cy.getByDataCy('active-member').should('have.length', 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('creates a new class', () => {
|
it.only('creates a new class', () => {
|
||||||
const name = 'Hill Valley';
|
const name = 'Hill Valley';
|
||||||
let selectedClass = teacher.selectedClass;
|
let selectedClass = teacher.selectedClass;
|
||||||
|
|
||||||
const schoolClasses = [
|
const schoolClasses = [
|
||||||
teacher.selectedClass
|
teacher.selectedClass,
|
||||||
];
|
];
|
||||||
|
|
||||||
const me = () => ({
|
const me = () => ({
|
||||||
...teacher,
|
...teacher,
|
||||||
selectedClass,
|
selectedClass,
|
||||||
schoolClasses
|
schoolClasses,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
cy.mockGraphqlOps({
|
cy.mockGraphqlOps({
|
||||||
operations: {
|
operations: {
|
||||||
MeQuery: () => ({
|
MeQuery: () => ({
|
||||||
me: me()
|
me: me(),
|
||||||
}),
|
}),
|
||||||
CreateSchoolClass() {
|
|
||||||
const schoolClass = {
|
|
||||||
id: 'newSchoolClassId',
|
|
||||||
name,
|
|
||||||
readOnly: false
|
|
||||||
};
|
|
||||||
schoolClasses.push(schoolClass);
|
|
||||||
selectedClass = schoolClass;
|
|
||||||
return {
|
|
||||||
createSchoolClass: {
|
|
||||||
success: true,
|
|
||||||
schoolClass
|
|
||||||
}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
MySchoolClassQuery: () => ({
|
MySchoolClassQuery: () => ({
|
||||||
me: me()
|
me: me(),
|
||||||
})
|
}),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/graphql', (req) => {
|
||||||
|
if (hasOperationName(req, 'CreateSchoolClass')) {
|
||||||
|
const schoolClass = {
|
||||||
|
__typename: 'SchoolClassNode',
|
||||||
|
id: 'newSchoolClassId',
|
||||||
|
name,
|
||||||
|
readOnly: false,
|
||||||
|
};
|
||||||
|
schoolClasses.push(schoolClass);
|
||||||
|
selectedClass = schoolClass;
|
||||||
|
req.reply({
|
||||||
|
data: {
|
||||||
|
createSchoolClass: {
|
||||||
|
result: schoolClass
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
cy.visit('/me/my-class');
|
cy.visit('/me/my-class');
|
||||||
|
|
||||||
cy.get('h1').should('exist');
|
cy.get('h1').should('exist');
|
||||||
|
|
@ -317,4 +326,71 @@ describe('Teacher Class Management', () => {
|
||||||
cy.get('[data-cy=class-selection]').click();
|
cy.get('[data-cy=class-selection]').click();
|
||||||
cy.get('[data-cy=class-selection-entry]').should('have.length', 2);
|
cy.get('[data-cy=class-selection-entry]').should('have.length', 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('tries to create a new class with duplicate name', () => {
|
||||||
|
const name = 'Hill Billy Valley';
|
||||||
|
let selectedClass = teacher.selectedClass;
|
||||||
|
selectedClass.name = 'Some stupid class';
|
||||||
|
|
||||||
|
const schoolClasses = [
|
||||||
|
teacher.selectedClass,
|
||||||
|
];
|
||||||
|
|
||||||
|
const me = () => ({
|
||||||
|
...teacher,
|
||||||
|
selectedClass,
|
||||||
|
schoolClasses,
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.mockGraphqlOps({
|
||||||
|
operations: {
|
||||||
|
MeQuery: () => ({
|
||||||
|
me: me(),
|
||||||
|
}),
|
||||||
|
WhateverNode() {
|
||||||
|
console.log('Through here');
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
MySchoolClassQuery: () => ({
|
||||||
|
me: me(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// since recently, graphql requests can be intercepted by cypress
|
||||||
|
cy.intercept('POST', '/api/graphql', (req) => {
|
||||||
|
if (hasOperationName(req, 'CreateSchoolClass')) {
|
||||||
|
req.reply({
|
||||||
|
data: {
|
||||||
|
createSchoolClass: {
|
||||||
|
result: {
|
||||||
|
__typename: 'DuplicateName',
|
||||||
|
reason: 'Dieser Name wird bereits verwendet.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.visit('/me/my-class');
|
||||||
|
|
||||||
|
cy.get('h1').should('exist');
|
||||||
|
|
||||||
|
cy.get('[data-cy=header-user-widget]').within(() => {
|
||||||
|
cy.get('[data-cy=user-widget-avatar]').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.get('[data-cy=class-selection]').click();
|
||||||
|
cy.get('[data-cy=class-selection-entry]').should('have.length', 1);
|
||||||
|
|
||||||
|
cy.get('[data-cy=create-class-link]').click();
|
||||||
|
|
||||||
|
cy.get('[data-cy=join-form-input]').type(name);
|
||||||
|
|
||||||
|
cy.get('[data-cy=join-form-confirm]').click();
|
||||||
|
|
||||||
|
cy.getByDataCy('join-form-input-error').should('contain', 'Dieser Name wird bereits verwendet.');
|
||||||
|
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
>
|
>
|
||||||
<small
|
<small
|
||||||
class="skillboxform-input__error"
|
class="skillboxform-input__error"
|
||||||
|
data-cy="join-form-input-error"
|
||||||
v-if="error"
|
v-if="error"
|
||||||
>{{ error }}
|
>{{ error }}
|
||||||
</small>
|
</small>
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@ class CreateSchoolClass(TeacherOnlyMutation):
|
||||||
user.set_selected_class(school_class)
|
user.set_selected_class(school_class)
|
||||||
return cls(result=school_class)
|
return cls(result=school_class)
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
return cls(result={"reason": "Name wird bereits verwendet"})
|
return cls(result={"reason": "Dieser Name wird bereits verwendet."})
|
||||||
|
|
||||||
|
|
||||||
class CreateTeam(TeacherOnlyMutation):
|
class CreateTeam(TeacherOnlyMutation):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue