196 lines
5.1 KiB
JavaScript
196 lines
5.1 KiB
JavaScript
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
|
|
})
|
|
|
|
|
|
})
|