From f9969b964c8555bca18952b0ff2cb6abb824dc81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Sat, 13 Jul 2019 14:00:03 +0200 Subject: [PATCH] Implement conditional filtering --- backend/src/schema/types/type/User.gql | 3 +++ webapp/package.json | 3 ++- webapp/pages/admin/users.spec.js | 35 +++++++++++++++++++++++++- webapp/pages/admin/users.vue | 15 +++++++++-- webapp/yarn.lock | 17 +++++++++---- 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index b984f2d79..a735e90e5 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -79,6 +79,9 @@ type User { input _UserFilter { AND: [_UserFilter!] OR: [_UserFilter!] + name_contains: String + about_contains: String + slug_contains: String id: ID id_not: ID id_in: [ID!] diff --git a/webapp/package.json b/webapp/package.json index edad9509d..8385f37ec 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -63,6 +63,7 @@ "date-fns": "2.0.0-beta.2", "express": "~4.17.1", "graphql": "~14.4.2", + "isemail": "^3.2.0", "jsonwebtoken": "~8.5.1", "linkify-it": "~2.1.0", "nuxt": "~2.8.1", @@ -111,4 +112,4 @@ "vue-jest": "~3.0.4", "vue-svg-loader": "~0.12.0" } -} \ No newline at end of file +} diff --git a/webapp/pages/admin/users.spec.js b/webapp/pages/admin/users.spec.js index 3e63c380e..e6b84cad9 100644 --- a/webapp/pages/admin/users.spec.js +++ b/webapp/pages/admin/users.spec.js @@ -16,7 +16,6 @@ describe('Users', () => { $t: jest.fn(), $apollo: { loading: false, - mutate: jest.fn().mockResolvedValue(), }, } }) @@ -33,5 +32,39 @@ describe('Users', () => { wrapper = Wrapper() expect(wrapper.is('div')).toBe(true) }) + + describe('search', () => { + let searchAction + beforeEach(() => { + searchAction = (wrapper, { query }) => { + wrapper.find('input').setValue(query) + wrapper.find('form').trigger('submit') + return wrapper + } + }) + + describe('query looks like an email address', () => { + it('searches users for exact email address', async () => { + const wrapper = await searchAction(Wrapper(), { query: 'email@example.org' }) + expect(wrapper.vm.email).toEqual('email@example.org') + expect(wrapper.vm.filter).toBe(null) + }) + }) + + describe('query is just text', () => { + it('tries to find matching users by `name`, `slug` or `about`', async () => { + const wrapper = await searchAction(await Wrapper(), { query: 'Find me' }) + const expected = { + OR: [ + { name_contains: 'Find me' }, + { slug_contains: 'Find me' }, + { about_contains: 'Find me' }, + ], + } + expect(wrapper.vm.email).toBe(null) + expect(wrapper.vm.filter).toEqual(expected) + }) + }) + }) }) }) diff --git a/webapp/pages/admin/users.vue b/webapp/pages/admin/users.vue index c94abd529..4f9a0849b 100644 --- a/webapp/pages/admin/users.vue +++ b/webapp/pages/admin/users.vue @@ -63,6 +63,7 @@