diff --git a/backend/package.json b/backend/package.json index be5fb086d..d746d1ed6 100644 --- a/backend/package.json +++ b/backend/package.json @@ -44,15 +44,15 @@ "dependencies": { "activitystrea.ms": "~2.1.3", "apollo-cache-inmemory": "~1.6.1", - "apollo-client": "~2.6.1", + "apollo-client": "~2.6.2", "apollo-link-context": "~1.0.14", "apollo-link-http": "~1.5.14", - "apollo-server": "~2.6.1", + "apollo-server": "~2.6.2", "bcryptjs": "~2.4.3", "cheerio": "~1.0.0-rc.3", "cors": "~2.8.5", "cross-env": "~5.2.0", - "date-fns": "2.0.0-alpha.29", + "date-fns": "2.0.0-alpha.31", "debug": "~4.1.1", "dotenv": "~8.0.0", "express": "~4.17.1", @@ -88,7 +88,7 @@ "@babel/plugin-proposal-throw-expressions": "^7.2.0", "@babel/preset-env": "~7.4.5", "@babel/register": "~7.4.4", - "apollo-server-testing": "~2.6.1", + "apollo-server-testing": "~2.6.2", "babel-core": "~7.0.0-0", "babel-eslint": "~10.0.1", "babel-jest": "~24.8.0", diff --git a/backend/src/middleware/filterBubble/filterBubble.js b/backend/src/middleware/filterBubble/filterBubble.js deleted file mode 100644 index bfdad5e2c..000000000 --- a/backend/src/middleware/filterBubble/filterBubble.js +++ /dev/null @@ -1,12 +0,0 @@ -import replaceParams from './replaceParams' - -const replaceFilterBubbleParams = async (resolve, root, args, context, resolveInfo) => { - args = await replaceParams(args, context) - return resolve(root, args, context, resolveInfo) -} - -export default { - Query: { - Post: replaceFilterBubbleParams, - }, -} diff --git a/backend/src/middleware/filterBubble/filterBubble.spec.js b/backend/src/middleware/filterBubble/filterBubble.spec.js index afe1df1c9..62addeece 100644 --- a/backend/src/middleware/filterBubble/filterBubble.spec.js +++ b/backend/src/middleware/filterBubble/filterBubble.spec.js @@ -5,6 +5,7 @@ import Factory from '../../seed/factories' const factory = Factory() const currentUserParams = { + id: 'u1', email: 'you@example.org', name: 'This is you', password: '1234', @@ -41,7 +42,7 @@ afterEach(async () => { await factory.cleanDatabase() }) -describe('FilterBubble middleware', () => { +describe('Filter posts by author is followed by sb.', () => { describe('given an authenticated user', () => { let authenticatedClient @@ -52,7 +53,7 @@ describe('FilterBubble middleware', () => { describe('no filter bubble', () => { it('returns all posts', async () => { - const query = '{ Post( filterBubble: {}) { title } }' + const query = '{ Post(filter: { }) { title } }' const expected = { Post: [ { title: 'This is some random post' }, @@ -65,7 +66,7 @@ describe('FilterBubble middleware', () => { describe('filtering for posts of followed users only', () => { it('returns only posts authored by followed users', async () => { - const query = '{ Post( filterBubble: { author: following }) { title } }' + const query = '{ Post( filter: { author: { followedBy_some: { id: "u1" } } }) { title } }' const expected = { Post: [{ title: 'This is the post of a followed user' }], } diff --git a/backend/src/middleware/filterBubble/replaceParams.js b/backend/src/middleware/filterBubble/replaceParams.js deleted file mode 100644 index a10b6c29d..000000000 --- a/backend/src/middleware/filterBubble/replaceParams.js +++ /dev/null @@ -1,31 +0,0 @@ -import { UserInputError } from 'apollo-server' - -export default async function replaceParams(args, context) { - const { author = 'all' } = args.filterBubble || {} - const { user } = context - - if (author === 'following') { - if (!user) - throw new UserInputError( - "You are unauthenticated - I don't know any users you are following.", - ) - - const session = context.driver.session() - let { records } = await session.run( - 'MATCH(followed:User)<-[:FOLLOWS]-(u {id: $userId}) RETURN followed.id', - { userId: context.user.id }, - ) - const followedIds = records.map(record => record.get('followed.id')) - - // carefully override `id_in` - args.filter = args.filter || {} - args.filter.author = args.filter.author || {} - args.filter.author.id_in = followedIds - - session.close() - } - - delete args.filterBubble - - return args -} diff --git a/backend/src/middleware/filterBubble/replaceParams.spec.js b/backend/src/middleware/filterBubble/replaceParams.spec.js deleted file mode 100644 index e14fda416..000000000 --- a/backend/src/middleware/filterBubble/replaceParams.spec.js +++ /dev/null @@ -1,129 +0,0 @@ -import replaceParams from './replaceParams.js' - -describe('replaceParams', () => { - let args - let context - let run - - let action = () => { - return replaceParams(args, context) - } - - beforeEach(() => { - args = {} - run = jest.fn().mockResolvedValue({ - records: [{ get: () => 1 }, { get: () => 2 }, { get: () => 3 }], - }) - context = { - driver: { - session: () => { - return { - run, - close: () => {}, - } - }, - }, - } - }) - - describe('args == ', () => { - describe('{}', () => { - it('does not crash', async () => { - await expect(action()).resolves.toEqual({}) - }) - }) - - describe('unauthenticated user', () => { - beforeEach(() => { - context.user = null - }) - - describe('{ filterBubble: { author: following } }', () => { - it('throws error', async () => { - args = { filterBubble: { author: 'following' } } - await expect(action()).rejects.toThrow('You are unauthenticated') - }) - }) - - describe('{ filterBubble: { author: all } }', () => { - it('removes filterBubble param', async () => { - const expected = {} - await expect(action()).resolves.toEqual(expected) - }) - - it('does not make database calls', async () => { - await action() - expect(run).not.toHaveBeenCalled() - }) - }) - }) - - describe('authenticated user', () => { - beforeEach(() => { - context.user = { id: 'u4711' } - }) - - describe('{ filterBubble: { author: following } }', () => { - beforeEach(() => { - args = { filterBubble: { author: 'following' } } - }) - - it('returns args object with resolved ids of followed users', async () => { - const expected = { filter: { author: { id_in: [1, 2, 3] } } } - await expect(action()).resolves.toEqual(expected) - }) - - it('makes database calls', async () => { - await action() - expect(run).toHaveBeenCalledTimes(1) - }) - - describe('given any additional filter args', () => { - describe('merges', () => { - it('empty filter object', async () => { - args.filter = {} - const expected = { filter: { author: { id_in: [1, 2, 3] } } } - await expect(action()).resolves.toEqual(expected) - }) - - it('filter.title', async () => { - args.filter = { title: 'bla' } - const expected = { filter: { title: 'bla', author: { id_in: [1, 2, 3] } } } - await expect(action()).resolves.toEqual(expected) - }) - - it('filter.author', async () => { - args.filter = { author: { name: 'bla' } } - const expected = { filter: { author: { name: 'bla', id_in: [1, 2, 3] } } } - await expect(action()).resolves.toEqual(expected) - }) - }) - }) - }) - - describe('{ filterBubble: { } }', () => { - it('removes filterBubble param', async () => { - const expected = {} - await expect(action()).resolves.toEqual(expected) - }) - - it('does not make database calls', async () => { - await action() - expect(run).not.toHaveBeenCalled() - }) - }) - - describe('{ filterBubble: { author: all } }', () => { - it('removes filterBubble param', async () => { - const expected = {} - await expect(action()).resolves.toEqual(expected) - }) - - it('does not make database calls', async () => { - await action() - expect(run).not.toHaveBeenCalled() - }) - }) - }) - }) -}) diff --git a/backend/src/middleware/index.js b/backend/src/middleware/index.js index 6bc7be000..75314abc0 100644 --- a/backend/src/middleware/index.js +++ b/backend/src/middleware/index.js @@ -13,7 +13,6 @@ import includedFields from './includedFieldsMiddleware' import orderBy from './orderByMiddleware' import validation from './validation' import notifications from './notifications' -import filterBubble from './filterBubble/filterBubble' export default schema => { const middlewares = { @@ -31,13 +30,11 @@ export default schema => { user: user, includedFields: includedFields, orderBy: orderBy, - filterBubble: filterBubble, } let order = [ 'permissions', 'activityPub', - 'filterBubble', 'password', 'dateTime', 'validation', diff --git a/backend/src/schema/types/type/Post.gql b/backend/src/schema/types/type/Post.gql index 1179c3e20..c402a1233 100644 --- a/backend/src/schema/types/type/Post.gql +++ b/backend/src/schema/types/type/Post.gql @@ -1,40 +1,3 @@ -enum FilterBubbleAuthorEnum { - following - all -} - -input FilterBubble { - author: FilterBubbleAuthorEnum -} - -type Query { - Post( - id: ID - activityId: String - objectId: String - title: String - slug: String - content: String - contentExcerpt: String - image: String - imageUpload: Upload - visibility: Visibility - deleted: Boolean - disabled: Boolean - createdAt: String - updatedAt: String - commentsCount: Int - shoutedCount: Int - shoutedByCurrentUser: Boolean - _id: String - first: Int - offset: Int - orderBy: [_PostOrdering] - filter: _PostFilter - filterBubble: FilterBubble - ): [Post] -} - type Post { id: ID! activityId: String diff --git a/backend/yarn.lock b/backend/yarn.lock index 9c8fdc3c5..28c2b8b55 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1141,6 +1141,13 @@ dependencies: tslib "^1.9.3" +"@wry/equality@^0.1.2": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.7.tgz#512234d078341c32cabda66b89b5dddb5741d9b9" + integrity sha512-p1rhJ6PQzpsBr9cMJMHvvx3LQEA28HFX7fAQx6khAX+1lufFeBuk+iRCAyHwj3v6JbpGKvHNa66f+9cpU8c7ew== + dependencies: + tslib "^1.9.3" + abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -1281,13 +1288,13 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -apollo-cache-control@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.7.1.tgz#3d4fba232f561f096f61051e103bf58ee4bf8b54" - integrity sha512-3h1TEoMnzex6IIiFb5Ja3owTyLwT5YzK69cRgrSpSscdpYc3ID4KVs0Ht9cbOUmb/L/UKtYVkRC8KeVAYmHEjQ== +apollo-cache-control@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.7.2.tgz#b8852422d973c582493e85c776abc9c660090162" + integrity sha512-7prjFN8H9lRE0npqGG8kM3XICvNCcgQt6eCy8kkcPOIZwM+F8m8ShjEfNF9UWW32i+poOk3G67HegPRyjCc6/Q== dependencies: apollo-server-env "2.4.0" - graphql-extensions "0.7.1" + graphql-extensions "0.7.2" apollo-cache-control@^0.1.0: version "0.1.1" @@ -1307,23 +1314,23 @@ apollo-cache-inmemory@~1.6.1: ts-invariant "^0.4.0" tslib "^1.9.3" -apollo-cache@1.3.1, apollo-cache@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.1.tgz#c015f93a9a7f32b3eeea0c471addd6e854da754c" - integrity sha512-BJ/Mehr3u6XCaHYSmgZ6DM71Fh30OkW6aEr828WjHvs+7i0RUuP51/PM7K6T0jPXtuw7UbArFFPZZsNgXnyyJA== +apollo-cache@1.3.2, apollo-cache@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.2.tgz#df4dce56240d6c95c613510d7e409f7214e6d26a" + integrity sha512-+KA685AV5ETEJfjZuviRTEImGA11uNBp/MJGnaCvkgr+BYRrGLruVKBv6WvyFod27WEB2sp7SsG8cNBKANhGLg== dependencies: - apollo-utilities "^1.3.1" + apollo-utilities "^1.3.2" tslib "^1.9.3" -apollo-client@~2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.1.tgz#fcf328618d6ad82b750a988bec113fe6edc8ba94" - integrity sha512-Tb6ZthPZUHlGqeoH1WC8Qg/tLnkk9H5+xj4e5nzOAC6dCOW3pVU9tYXscrWdmZ65UDUg1khvTNjrQgPhdf4aTQ== +apollo-client@~2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.2.tgz#03b6af651e09b6e413e486ddc87464c85bd6e514" + integrity sha512-oks1MaT5x7gHcPeC8vPC1UzzsKaEIC0tye+jg72eMDt5OKc7BobStTeS/o2Ib3e0ii40nKxGBnMdl/Xa/p56Yg== dependencies: "@types/zen-observable" "^0.8.0" - apollo-cache "1.3.1" + apollo-cache "1.3.2" apollo-link "^1.0.0" - apollo-utilities "1.3.1" + apollo-utilities "1.3.2" symbol-observable "^1.0.2" ts-invariant "^0.4.0" tslib "^1.9.3" @@ -1337,24 +1344,24 @@ apollo-datasource@0.5.0: apollo-server-caching "0.4.0" apollo-server-env "2.4.0" -apollo-engine-reporting-protobuf@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.3.0.tgz#2c764c054ff9968387cf16115546e0d5b04ee9f1" - integrity sha512-PYowpx/E+TJT/8nKpp3JmJuKh3x1SZcxDF6Cquj0soV205TUpFFCZQMi91i5ACiEp2AkYvM/GDBIrw+rfIwzTg== +apollo-engine-reporting-protobuf@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.3.1.tgz#a581257fa8e3bb115ce38bf1b22e052d1475ad69" + integrity sha512-Ui3nPG6BSZF8BEqxFs6EkX6mj2OnFLMejxEHSOdM82bakyeouCGd7J0fiy8AD6liJoIyc4X7XfH4ZGGMvMh11A== dependencies: protobufjs "^6.8.6" -apollo-engine-reporting@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.2.1.tgz#0b77fad2e9221d62f4a29b8b4fab8f7f47dcc1d6" - integrity sha512-DVXZhz/nSZR4lphakjb1guAD0qJ7Wm1PVtZEBjN097cnOor4XSOzQlPfTaYtVuhlxUKUuCx1syiBbOuV8sKqXg== +apollo-engine-reporting@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.3.0.tgz#50151811a0f5e70f4a73e7092a61fec422d8e722" + integrity sha512-xP+Z+wdQH4ee7xfuP3WsJcIe30AH68gpp2lQm2+rnW5JfjIqD5YehSoO2Svi2jK3CSv8Y561i3QMW9i34P7hEQ== dependencies: - apollo-engine-reporting-protobuf "0.3.0" + apollo-engine-reporting-protobuf "0.3.1" apollo-graphql "^0.3.0" - apollo-server-core "2.6.1" + apollo-server-core "2.6.2" apollo-server-env "2.4.0" async-retry "^1.2.1" - graphql-extensions "0.7.1" + graphql-extensions "0.7.2" apollo-env@0.5.1: version "0.5.1" @@ -1424,24 +1431,24 @@ apollo-server-caching@0.4.0: dependencies: lru-cache "^5.0.0" -apollo-server-core@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.6.1.tgz#d0d878b0a4959b6c661fc43300ce45b29996176a" - integrity sha512-jO2BtcP7ozSSK5qtw1gGDwO66WSNtzhvpDJD7erkA9byv8Z0jB2QIPNWN6iaj311LaPahM05k+8hMIhFy9oHWg== +apollo-server-core@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.6.2.tgz#a792b50d4df9e26ec03759a31fbcbce38361b218" + integrity sha512-AbAnfoQ26NPsNIyBa/BVKBtA/wRsNL/E6eEem1VIhzitfgO25bVXFbEZDLxbgz6wvJ+veyRFpse7Qi1bvRpxOw== dependencies: "@apollographql/apollo-tools" "^0.3.6" "@apollographql/graphql-playground-html" "1.6.20" "@types/ws" "^6.0.0" - apollo-cache-control "0.7.1" + apollo-cache-control "0.7.2" apollo-datasource "0.5.0" - apollo-engine-reporting "1.2.1" + apollo-engine-reporting "1.3.0" apollo-server-caching "0.4.0" apollo-server-env "2.4.0" apollo-server-errors "2.3.0" - apollo-server-plugin-base "0.5.1" - apollo-tracing "0.7.1" + apollo-server-plugin-base "0.5.2" + apollo-tracing "0.7.2" fast-json-stable-stringify "^2.0.0" - graphql-extensions "0.7.1" + graphql-extensions "0.7.2" graphql-subscriptions "^1.0.0" graphql-tag "^2.9.2" graphql-tools "^4.0.0" @@ -1472,10 +1479,10 @@ apollo-server-errors@2.3.0: resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.0.tgz#700622b66a16dffcad3b017e4796749814edc061" integrity sha512-rUvzwMo2ZQgzzPh2kcJyfbRSfVKRMhfIlhY7BzUfM4x6ZT0aijlgsf714Ll3Mbf5Fxii32kD0A/DmKsTecpccw== -apollo-server-express@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.6.1.tgz#1e2649d3fd38c0c0a2c830090fd41e086b259c9f" - integrity sha512-TVu68LVp+COMGOXuxc0OFeCUQiPApxy7Isv2Vk85nikZV4t4FXlODB6PrRKf5rfvP31dvGsfE6GHPJTLLbKfyg== +apollo-server-express@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.6.2.tgz#526297c01a7a32fe9215566f9fd7ff92e82f1fa0" + integrity sha512-nbL3noJ5KxKGg+hT8UsAA7++oHWq/KNSevfdCluWTfUNqH1vYRTvAnARx/6JM06S9zcPTfOLcqwHnDnY9zYFxA== dependencies: "@apollographql/graphql-playground-html" "1.6.20" "@types/accepts" "^1.3.5" @@ -1483,7 +1490,7 @@ apollo-server-express@2.6.1: "@types/cors" "^2.8.4" "@types/express" "4.16.1" accepts "^1.3.5" - apollo-server-core "2.6.1" + apollo-server-core "2.6.2" body-parser "^1.18.3" cors "^2.8.4" graphql-subscriptions "^1.0.0" @@ -1511,36 +1518,36 @@ apollo-server-module-graphiql@^1.3.4, apollo-server-module-graphiql@^1.4.0: resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.4.0.tgz#c559efa285578820709f1769bb85d3b3eed3d8ec" integrity sha512-GmkOcb5he2x5gat+TuiTvabnBf1m4jzdecal3XbXBh/Jg+kx4hcvO3TTDFQ9CuTprtzdcVyA11iqG7iOMOt7vA== -apollo-server-plugin-base@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.1.tgz#b81056666763879bdc98d8d58f3c4c43cbb30da6" - integrity sha512-UejnBk6XDqYQ+Ydkbm+gvlOzP+doQA8glVUULs8rCi0/MshsFSsBVl6rtzruELDBVgZhJgGsd4pUexcvNc3aZA== +apollo-server-plugin-base@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.2.tgz#f97ba983f1e825fec49cba8ff6a23d00e1901819" + integrity sha512-j81CpadRLhxikBYHMh91X4aTxfzFnmmebEiIR9rruS6dywWCxV2aLW87l9ocD1MiueNam0ysdwZkX4F3D4csNw== -apollo-server-testing@~2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.6.1.tgz#447f34980819fa52b120f26c632fab4efc55435b" - integrity sha512-Qq0u79uKw3g14bq0nGxtUUiueFOv2ETkAax2mum+3f9Lm85VXELkY6c9bCWDVGjkUtt9Aog5qwSzWELb1KiUug== +apollo-server-testing@~2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.6.2.tgz#e0ecddd565fce1c38a346f9fbe6118f543ccf6a6" + integrity sha512-I9QLFk4I/z9oOIXfnLc8RPBYAKih6Olrg3RDeRvWhDjLQ8gfALXVhCO+7WuvM35wNZcZVn7aXBeZ8Y3mlgkj8w== dependencies: - apollo-server-core "2.6.1" + apollo-server-core "2.6.2" -apollo-server@~2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.6.1.tgz#1b1fc6020b75c0913550da5fa0f2005c62f1bc53" - integrity sha512-Ed0zZjluRYPMC3Yr6oXQjcR11izu86nkjiS2MhjJA1mF8IXJfxbPp2hnX4Jf4vXPSkOP2e5ZHw0cdaIcu9GnRw== +apollo-server@~2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.6.2.tgz#33fe894b740588f059a7679346516ffce50377d5" + integrity sha512-fMXaAKIb0dX0lzcZ4zlu7ay1L596d9HTNkdn8cKuM7zmTpugZSAL966COguJUDSjUS9CaB1Kh5hl1yRuRqHXSA== dependencies: - apollo-server-core "2.6.1" - apollo-server-express "2.6.1" + apollo-server-core "2.6.2" + apollo-server-express "2.6.2" express "^4.0.0" graphql-subscriptions "^1.0.0" graphql-tools "^4.0.0" -apollo-tracing@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.7.1.tgz#6a7356b619f3aa0ca22c623b5d8bb1af5ca1c74c" - integrity sha512-1BYQua+jCWFkZZJP0/rSpzY4XbLLbCrRHCYu8sJn0RCH/hs34BMdFXscS9uSglgIpXwUAIafgsU0hAVCrJjbTw== +apollo-tracing@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.7.2.tgz#7730159a4670bca465ac1bfa01f9902610a7aba4" + integrity sha512-bT4/n8Vy9DweC3+XWJelJD41FBlKMXR0OVxjLMiCe9clb4yTgKhYxRGTyh9KjmhWsng9gG/DphO0ixWsOgdXmA== dependencies: apollo-server-env "2.4.0" - graphql-extensions "0.7.1" + graphql-extensions "0.7.2" apollo-tracing@^0.1.0: version "0.1.4" @@ -1559,13 +1566,13 @@ apollo-upload-server@^7.0.0: http-errors "^1.7.0" object-path "^0.11.4" -apollo-utilities@1.3.1, apollo-utilities@^1.0.1, apollo-utilities@^1.2.1, apollo-utilities@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.1.tgz#4c45f9b52783c324e2beef822700bdea374f82d1" - integrity sha512-P5cJ75rvhm9hcx9V/xCW0vlHhRd0S2icEcYPoRYNTc5djbynpuO+mQuJ4zMHgjNDpvvDxDfZxXTJ6ZUuJZodiQ== +apollo-utilities@1.3.2, apollo-utilities@^1.0.1, apollo-utilities@^1.2.1, apollo-utilities@^1.3.1, apollo-utilities@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.2.tgz#8cbdcf8b012f664cd6cb5767f6130f5aed9115c9" + integrity sha512-JWNHj8XChz7S4OZghV6yc9FNnzEXj285QYp/nLNh943iObycI5GTDO3NGR9Dth12LRrSFMeDOConPfPln+WGfg== dependencies: + "@wry/equality" "^0.1.2" fast-json-stable-stringify "^2.0.0" - lodash.isequal "^4.5.0" ts-invariant "^0.4.0" tslib "^1.9.3" @@ -2579,10 +2586,10 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-fns@2.0.0-alpha.29: - version "2.0.0-alpha.29" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.0.0-alpha.29.tgz#9d4a36e3ebba63d009e957fea8fdfef7921bc6cb" - integrity sha512-AIFZ0hG/1fdb7HZHTDyiEJdNiaFyZxXcx/kF8z3I9wxbhkN678KrrLSneKcsb0Xy5KqCA4wCIxmGpdVWSNZnpA== +date-fns@2.0.0-alpha.31: + version "2.0.0-alpha.31" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.0.0-alpha.31.tgz#51bcfdca25dfc9bea334a556ab33dfc0bb00421c" + integrity sha512-S19PwMqnbYsqcbCg02Yj9gv4veVNZ0OX7v2+zcd+Mq0RI7LoDKJipJjnMrTZ3Cc6blDuTce5G/pHXcVIGRwJWQ== debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" @@ -3704,10 +3711,10 @@ graphql-deduplicator@^2.0.1: resolved "https://registry.yarnpkg.com/graphql-deduplicator/-/graphql-deduplicator-2.0.2.tgz#d8608161cf6be97725e178df0c41f6a1f9f778f3" integrity sha512-0CGmTmQh4UvJfsaTPppJAcHwHln8Ayat7yXXxdnuWT+Mb1dBzkbErabCWzjXyKh/RefqlGTTA7EQOZHofMaKJA== -graphql-extensions@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.7.1.tgz#f55b01ac8ddf09a215e21f34caeee3ae66a88f21" - integrity sha512-4NkAz/f0j5a1DSPl3V77OcesBmwhHz56Soj0yTImlcDdRv9knyO2e+ehi1TIeKBOyIKS7d3A7zqOW/4ieGxlVA== +graphql-extensions@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.7.2.tgz#8711543f835661eaf24b48d6ac2aad44dbbd5506" + integrity sha512-TuVINuAOrEtzQAkAlCZMi9aP5rcZ+pVaqoBI5fD2k5O9fmb8OuXUQOW028MUhC66tg4E7h4YSF1uYUIimbu4SQ== dependencies: "@apollographql/apollo-tools" "^0.3.6" @@ -5230,11 +5237,6 @@ lodash.isboolean@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" diff --git a/webapp/components/FilterMenu/FilterMenu.spec.js b/webapp/components/FilterMenu/FilterMenu.spec.js index c312a401b..030ad20da 100644 --- a/webapp/components/FilterMenu/FilterMenu.spec.js +++ b/webapp/components/FilterMenu/FilterMenu.spec.js @@ -9,9 +9,11 @@ localVue.use(Styleguide) describe('FilterMenu.vue', () => { let wrapper let mocks + let propsData const createWrapper = mountMethod => { return mountMethod(FilterMenu, { + propsData, mocks, localVue, }) @@ -19,35 +21,48 @@ describe('FilterMenu.vue', () => { beforeEach(() => { mocks = { $t: () => {} } + propsData = {} }) - describe('mount', () => { + describe('given a user', () => { beforeEach(() => { - wrapper = createWrapper(mount) + propsData = { + user: { + id: '4711', + }, + } }) - it('renders a card', () => { - expect(wrapper.is('.ds-card')).toBe(true) - }) - - describe('click "filter-by-followed-authors-only" button', () => { - it('emits filterBubble object', () => { - wrapper.find({ name: 'filter-by-followed-authors-only' }).trigger('click') - expect(wrapper.emitted('changeFilterBubble')).toBeTruthy() + describe('mount', () => { + beforeEach(() => { + wrapper = createWrapper(mount) }) - it('toggles filterBubble.author property', () => { - wrapper.find({ name: 'filter-by-followed-authors-only' }).trigger('click') - expect(wrapper.emitted('changeFilterBubble')[0]).toEqual([{ author: 'following' }]) - wrapper.find({ name: 'filter-by-followed-authors-only' }).trigger('click') - expect(wrapper.emitted('changeFilterBubble')[1]).toEqual([{ author: 'all' }]) + it('renders a card', () => { + expect(wrapper.is('.ds-card')).toBe(true) }) - it('makes button primary', () => { - wrapper.find({ name: 'filter-by-followed-authors-only' }).trigger('click') - expect( - wrapper.find({ name: 'filter-by-followed-authors-only' }).classes('ds-button-primary'), - ).toBe(true) + describe('click "filter-by-followed-authors-only" button', () => { + it('emits filterBubble object', () => { + wrapper.find({ name: 'filter-by-followed-authors-only' }).trigger('click') + expect(wrapper.emitted('changeFilterBubble')).toBeTruthy() + }) + + it('toggles filterBubble.author property', () => { + wrapper.find({ name: 'filter-by-followed-authors-only' }).trigger('click') + expect(wrapper.emitted('changeFilterBubble')[0]).toEqual([ + { author: { followedBy_some: { id: '4711' } } }, + ]) + wrapper.find({ name: 'filter-by-followed-authors-only' }).trigger('click') + expect(wrapper.emitted('changeFilterBubble')[1]).toEqual([{}]) + }) + + it('makes button primary', () => { + wrapper.find({ name: 'filter-by-followed-authors-only' }).trigger('click') + expect( + wrapper.find({ name: 'filter-by-followed-authors-only' }).classes('ds-button-primary'), + ).toBe(true) + }) }) }) }) diff --git a/webapp/components/FilterMenu/FilterMenu.vue b/webapp/components/FilterMenu/FilterMenu.vue index a2195a5fd..70dd3c236 100644 --- a/webapp/components/FilterMenu/FilterMenu.vue +++ b/webapp/components/FilterMenu/FilterMenu.vue @@ -11,7 +11,7 @@ @@ -22,24 +22,30 @@