Merge branch 'hotfix/show-solution-checkbox-ms-394' into develop
This commit is contained in:
commit
d9240ef1c6
|
|
@ -13280,6 +13280,12 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"mock-apollo-client": {
|
||||||
|
"version": "0.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mock-apollo-client/-/mock-apollo-client-0.7.0.tgz",
|
||||||
|
"integrity": "sha512-r0ICU01m007W0MwMej0lzlg1REtepDZ15Fyj8Hz9tiW/1TPb0PyHryGykrg9YhfbB8/+ZF2ovz+88yMF75TDoA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"moment": {
|
"moment": {
|
||||||
"version": "2.29.1",
|
"version": "2.29.1",
|
||||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
|
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,7 @@
|
||||||
"jest-transform-graphql": "^2.1.0",
|
"jest-transform-graphql": "^2.1.0",
|
||||||
"jest-transform-stub": "^2.0.0",
|
"jest-transform-stub": "^2.0.0",
|
||||||
"jest-watch-typeahead": "^0.3.1",
|
"jest-watch-typeahead": "^0.3.1",
|
||||||
|
"mock-apollo-client": "^0.7.0",
|
||||||
"ts-loader": "^8.3.0",
|
"ts-loader": "^8.3.0",
|
||||||
"typescript": "^4.4.3",
|
"typescript": "^4.4.3",
|
||||||
"vue-jest": "^3.0.4"
|
"vue-jest": "^3.0.4"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
mutation {
|
||||||
|
deleteModuleNodes @client
|
||||||
|
}
|
||||||
|
|
@ -34,5 +34,11 @@ export const resolvers = {
|
||||||
cache.writeQuery({query: SIDEBAR, data});
|
cache.writeQuery({query: SIDEBAR, data});
|
||||||
return data.sidebar;
|
return data.sidebar;
|
||||||
},
|
},
|
||||||
|
deleteModuleNodes: (_, _query, {cache}) => {
|
||||||
|
Object.keys(cache.data.data)
|
||||||
|
.filter(prop => prop.indexOf('ModuleNode:') === 0)
|
||||||
|
.map(moduleName => cache.data.delete(moduleName)); // v3 uses .evict{id, fieldname}
|
||||||
|
return {success: true};
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,13 @@
|
||||||
import ME_QUERY from '@/graphql/gql/queries/meQuery.gql';
|
import ME_QUERY from '@/graphql/gql/queries/meQuery.gql';
|
||||||
import UPDATE_USER_SETTING from '@/graphql/gql/mutations/updateUserSetting.gql';
|
import UPDATE_USER_SETTING from '@/graphql/gql/mutations/updateUserSetting.gql';
|
||||||
import MY_SCHOOL_CLASS_QUERY from '@/graphql/gql/queries/mySchoolClass.gql';
|
import MY_SCHOOL_CLASS_QUERY from '@/graphql/gql/queries/mySchoolClass.gql';
|
||||||
|
import DELETE_MODULE_NODES from '@/graphql/gql/local/mutations/deleteModuleNodes.gql';
|
||||||
|
import MODULE_DETAILS_QUERY from '@/graphql/gql/queries/modules/moduleDetailsQuery.gql';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
methods: {
|
methods: {
|
||||||
updateSelectedClass(selectedClass) {
|
updateSelectedClass(selectedClass) {
|
||||||
|
const innerApollo = this.$apollo;
|
||||||
return this.$apollo.mutate({
|
return this.$apollo.mutate({
|
||||||
mutation: UPDATE_USER_SETTING,
|
mutation: UPDATE_USER_SETTING,
|
||||||
variables: {
|
variables: {
|
||||||
|
|
@ -18,10 +21,19 @@ export default {
|
||||||
meData.me.selectedClass = selectedClass;
|
meData.me.selectedClass = selectedClass;
|
||||||
|
|
||||||
store.writeQuery({query: ME_QUERY, data: meData});
|
store.writeQuery({query: ME_QUERY, data: meData});
|
||||||
|
|
||||||
|
innerApollo.mutate({
|
||||||
|
mutation: DELETE_MODULE_NODES
|
||||||
|
});
|
||||||
},
|
},
|
||||||
refetchQueries: [{
|
refetchQueries: [{
|
||||||
query: MY_SCHOOL_CLASS_QUERY
|
query: MY_SCHOOL_CLASS_QUERY
|
||||||
}]
|
}, {
|
||||||
|
query: MODULE_DETAILS_QUERY,
|
||||||
|
variables: {
|
||||||
|
slug: this.$route.params.slug
|
||||||
|
}
|
||||||
|
}]
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
console.warn('failed to update selected class', error);
|
console.warn('failed to update selected class', error);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,195 @@
|
||||||
|
import {createLocalVue, mount} from '@vue/test-utils'
|
||||||
|
import { createMockClient } from 'mock-apollo-client'
|
||||||
|
|
||||||
|
import SIDEBAR from '@/graphql/gql/local/sidebar.gql';
|
||||||
|
import ME_QUERY from '@/graphql/gql/queries/meQuery.gql';
|
||||||
|
import UPDATE_USER_SETTING from '@/graphql/gql/mutations/updateUserSetting.gql';
|
||||||
|
import MY_SCHOOL_CLASS_QUERY from '@/graphql/gql/queries/mySchoolClass.gql';
|
||||||
|
import DELETE_MODULE_NODES from '@/graphql/gql/local/mutations/deleteModuleNodes.gql';
|
||||||
|
import MODULE_DETAILS_QUERY from '@/graphql/gql/queries/modules/moduleDetailsQuery.gql';
|
||||||
|
|
||||||
|
import VueApollo from 'vue-apollo'
|
||||||
|
import ClassSelectionWidget from '@/components/school-class/ClassSelectionWidget';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// https://dev.to/n_tepluhina/testing-vue-apollo-2020-edition-2l2p
|
||||||
|
|
||||||
|
const localVue = createLocalVue();
|
||||||
|
localVue.use(VueApollo);
|
||||||
|
|
||||||
|
const updateSettingsResponse = {
|
||||||
|
data: {
|
||||||
|
updateSetting: {
|
||||||
|
success: true,
|
||||||
|
errors:null,
|
||||||
|
__typename: 'UpdateSettingPayload'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const querySidebarResponse = {
|
||||||
|
data: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const deleteModulesResponse = {
|
||||||
|
data: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const meQueryResponse = {
|
||||||
|
data: {
|
||||||
|
me: {
|
||||||
|
__typename: "PrivateUserNode",
|
||||||
|
id: "UHJpdmF0ZVVzZXJOb2RlOjI=",
|
||||||
|
pk: 2,
|
||||||
|
username: "ross.geller",
|
||||||
|
email: "ross.geller@skillbox.example",
|
||||||
|
firstName: "Ross",
|
||||||
|
lastName: "Geller",
|
||||||
|
avatarUrl: "https://ucarecdn.com/fe10f9cc-a509-4170-9396-258abc418247/",
|
||||||
|
expiryDate: "2021-11-29",
|
||||||
|
readOnly: false,
|
||||||
|
lastModule: null,
|
||||||
|
lastTopic: {
|
||||||
|
id: "VG9waWNOb2RlOjQ5",
|
||||||
|
slug: "berufliche-grundbildung",
|
||||||
|
__typename: "TopicNode"
|
||||||
|
},
|
||||||
|
selectedClass: {
|
||||||
|
id: "U2Nob29sQ2xhc3NOb2RlOjM=",
|
||||||
|
readOnly: false,
|
||||||
|
__typename: "SchoolClassNode"
|
||||||
|
},
|
||||||
|
recentModules: {
|
||||||
|
edges: [],
|
||||||
|
__typename: "ModuleNodeConnection"
|
||||||
|
},
|
||||||
|
schoolClasses: {
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
node: {
|
||||||
|
id: "U2Nob29sQ2xhc3NOb2RlOjE=",
|
||||||
|
name: "Friends",
|
||||||
|
__typename: "SchoolClassNode"
|
||||||
|
},
|
||||||
|
__typename: "SchoolClassNodeEdge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
node: {
|
||||||
|
id: "U2Nob29sQ2xhc3NOb2RlOjM=",
|
||||||
|
name: "ghfgfh",
|
||||||
|
__typename: "SchoolClassNode"
|
||||||
|
},
|
||||||
|
__typename: "SchoolClassNodeEdge"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
__typename: "SchoolClassNodeConnection"
|
||||||
|
},
|
||||||
|
team: null,
|
||||||
|
isTeacher: true,
|
||||||
|
permissions: [
|
||||||
|
"users.can_manage_school_class_content"
|
||||||
|
],
|
||||||
|
onboardingVisited: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const mySchoolClassResponse = {
|
||||||
|
data: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const moduleDetailResponse = {
|
||||||
|
data: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const slug = '/some/123';
|
||||||
|
const schoolClasses = [
|
||||||
|
{
|
||||||
|
id: 'abcd123',
|
||||||
|
name: 'Hello'
|
||||||
|
},{
|
||||||
|
id: 'xyz098',
|
||||||
|
name: 'Kitty'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('ClassSelectionWidget.vue', () => {
|
||||||
|
|
||||||
|
let mockClient;
|
||||||
|
let apolloProvider;
|
||||||
|
let wrapper;
|
||||||
|
|
||||||
|
const requestHandlers = {
|
||||||
|
updateSettingsHandler: jest.fn().mockResolvedValueOnce(updateSettingsResponse),
|
||||||
|
querySidebarHandler: jest.fn().mockResolvedValueOnce(querySidebarResponse),
|
||||||
|
meQueryHandler: jest.fn().mockResolvedValueOnce(meQueryResponse),
|
||||||
|
deleteModulesHandler: jest.fn().mockResolvedValueOnce(deleteModulesResponse),
|
||||||
|
mySchoolClassHandler: jest.fn().mockResolvedValueOnce(mySchoolClassResponse),
|
||||||
|
moduleDetailHandler: jest.fn().mockResolvedValueOnce(moduleDetailResponse),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const createComponent = () => {
|
||||||
|
mockClient = createMockClient();
|
||||||
|
mockClient.cache.writeQuery = jest.fn();
|
||||||
|
|
||||||
|
mockClient.setRequestHandler(UPDATE_USER_SETTING, requestHandlers.updateSettingsHandler);
|
||||||
|
mockClient.setRequestHandler(SIDEBAR, requestHandlers.querySidebarHandler);
|
||||||
|
mockClient.setRequestHandler(ME_QUERY, requestHandlers.meQueryHandler);
|
||||||
|
mockClient.setRequestHandler(DELETE_MODULE_NODES, requestHandlers.deleteModulesHandler);
|
||||||
|
mockClient.setRequestHandler(MY_SCHOOL_CLASS_QUERY, requestHandlers.mySchoolClassHandler);
|
||||||
|
mockClient.setRequestHandler(MODULE_DETAILS_QUERY, requestHandlers.moduleDetailHandler);
|
||||||
|
|
||||||
|
apolloProvider = new VueApollo({
|
||||||
|
defaultClient: mockClient,
|
||||||
|
});
|
||||||
|
|
||||||
|
wrapper = mount(ClassSelectionWidget, {
|
||||||
|
localVue,
|
||||||
|
apolloProvider,
|
||||||
|
mocks: {
|
||||||
|
$route: {
|
||||||
|
params: {
|
||||||
|
slug
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
wrapper.vm.me.schoolClass = schoolClasses;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
it('should delete the modules cache and query the current module on a class change', async () => {
|
||||||
|
|
||||||
|
createComponent();
|
||||||
|
|
||||||
|
wrapper.vm.me.selectedClass = {id: 'abcd123'}
|
||||||
|
wrapper.vm.updateSelectedClassAndHidePopover(schoolClasses[1]);
|
||||||
|
|
||||||
|
expect(requestHandlers.updateSettingsHandler).toHaveBeenCalledWith({
|
||||||
|
input: {
|
||||||
|
id: schoolClasses[1].id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
|
||||||
|
// modules have been removed from cache
|
||||||
|
expect(requestHandlers.deleteModulesHandler).toHaveBeenCalled();
|
||||||
|
expect(requestHandlers.mySchoolClassHandler).toHaveBeenCalled();
|
||||||
|
// current module is being refetched
|
||||||
|
expect(requestHandlers.moduleDetailHandler).toHaveBeenCalledWith({slug});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
wrapper.destroy()
|
||||||
|
mockClient = null
|
||||||
|
apolloProvider = null
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
Loading…
Reference in New Issue