Skip to content

Commit 56fd40f

Browse files
committed
fix for #468 and partial solution to #413
I've added some e2e tests to make sure things are above board but there is a bit of potential uncertainty. Frustratingly, this is a part of the GQL architechture that leads to a growing number of utility types that developers need to keep track of. Because I do not have a good insight into how many services still depend on the old user profile resolutions I have left them untouched - though it could be argued they need to be deprecated. As far as resolving user nodes on Media, this is simply a danger we are going to accept. We'd like to PREVENT resolving greedily in places where it's not necessary but really there's nothing we can do to prevent fronent devs from doing silly things
1 parent 542edff commit 56fd40f

8 files changed

Lines changed: 504 additions & 5 deletions

File tree

src/__tests__/media.e2e.ts

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
import { ApolloServer } from '@apollo/server'
2+
import muuid from 'uuid-mongodb'
3+
import { jest } from '@jest/globals'
4+
import MutableMediaDataSource from '../model/MutableMediaDataSource.js'
5+
import { MediaObject, MediaObjectGQLInput } from '../db/MediaObjectTypes.js'
6+
import { queryAPI, setUpServer } from '../utils/testUtils.js'
7+
import { muuidToString } from '../utils/helpers.js'
8+
import { InMemoryDB } from '../utils/inMemoryDB.js'
9+
import express from 'express'
10+
import UserDataSource from '../model/UserDataSource.js'
11+
12+
jest.setTimeout(60000)
13+
14+
describe('E2E tests to validate behavior of media queries', () => {
15+
let server: ApolloServer
16+
let user: muuid.MUUID
17+
let userUuid: string
18+
let app: express.Application
19+
let inMemoryDB: InMemoryDB
20+
let userDs: UserDataSource
21+
22+
beforeAll(async () => {
23+
({ server, inMemoryDB, app } = await setUpServer())
24+
// Auth0 serializes uuids in "relaxed" mode, resulting in this hex string format
25+
// "59f1d95a-627d-4b8c-91b9-389c7424cb54" instead of base64 "WfHZWmJ9S4yRuTicdCTLVA==".
26+
user = muuid.mode('relaxed').v4()
27+
userUuid = muuidToString(user)
28+
})
29+
30+
beforeEach(async () => {
31+
await inMemoryDB.clear()
32+
userDs = UserDataSource.getInstance()
33+
const res = await userDs.createOrUpdateUserProfile(user, {
34+
userUuid,
35+
username: 'iwannaclimbv17oneday',
36+
email: 'gumby@openbeta.io',
37+
displayName: 'jared'
38+
})
39+
expect(res).toBe(true)
40+
})
41+
42+
afterAll(async () => {
43+
await server.stop()
44+
await inMemoryDB.close()
45+
})
46+
47+
async function insertMediaObjects (mediaCount: number): Promise<MediaObject[]> {
48+
const newMediaListInput: MediaObjectGQLInput[] = []
49+
for (let i = 0; i < mediaCount; i++) {
50+
newMediaListInput.push({
51+
userUuid,
52+
width: 800,
53+
height: 600,
54+
format: 'jpeg',
55+
size: 45000,
56+
mediaUrl: `/areaPhoto${i}.jpg`
57+
})
58+
}
59+
60+
const media = MutableMediaDataSource.getInstance()
61+
return await media.addMediaObjects(newMediaListInput)
62+
}
63+
64+
describe('media queries', () => {
65+
it('can resolve known media', async () => {
66+
const [object] = await insertMediaObjects(1)
67+
const response = await queryAPI({
68+
query: `
69+
query Media($input: MediaInput) {
70+
media(input: $input) {
71+
id
72+
mediaUrl
73+
}
74+
}
75+
`,
76+
operationName: 'Media',
77+
variables: {
78+
input: {
79+
id: object._id.toString()
80+
}
81+
},
82+
userUuid,
83+
app
84+
})
85+
86+
expect(response.statusCode).toBe(200)
87+
expect(response.error).toBe(false)
88+
const mediaResult = response.body.data.media
89+
expect(mediaResult.id).toBe(object._id.toHexString())
90+
})
91+
92+
it('Media resolver can yield a simple username', async () => {
93+
const [object] = await insertMediaObjects(1)
94+
const response = await queryAPI({
95+
query: `
96+
query Media($input: MediaInput) {
97+
media(input: $input) {
98+
id
99+
mediaUrl
100+
username
101+
}
102+
}
103+
`,
104+
operationName: 'Media',
105+
variables: {
106+
input: {
107+
id: object._id.toString()
108+
}
109+
},
110+
userUuid,
111+
app
112+
})
113+
114+
expect(response.statusCode).toBe(200)
115+
expect(response.error).toBe(false)
116+
console.log(response)
117+
const mediaResult = response.body.data.media
118+
expect(mediaResult.id).toBe(object._id.toHexString())
119+
expect(mediaResult.mediaUrl).toBeTruthy()
120+
expect(mediaResult.username).not.toBeNull()
121+
expect(mediaResult.username).not.toBeUndefined()
122+
})
123+
124+
it('Media resolver can yield a user node', async () => {
125+
const [object] = await insertMediaObjects(1)
126+
const response = await queryAPI({
127+
query: `
128+
query Media($input: MediaInput) {
129+
media(input: $input) {
130+
id
131+
mediaUrl
132+
user {
133+
username
134+
}
135+
}
136+
}
137+
`,
138+
operationName: 'Media',
139+
variables: {
140+
input: {
141+
id: object._id.toString()
142+
}
143+
},
144+
userUuid,
145+
app
146+
})
147+
148+
expect(response.statusCode).toBe(200)
149+
expect(response.error).toBe(false)
150+
console.log(response)
151+
const mediaResult = response.body.data.media
152+
expect(mediaResult.id).toBe(object._id.toHexString())
153+
expect(mediaResult.mediaUrl).toBeTruthy()
154+
console.log(mediaResult)
155+
expect(mediaResult.user).not.toBeNull()
156+
expect(mediaResult.user.username).toBe('iwannaclimbv17oneday')
157+
})
158+
})
159+
})

0 commit comments

Comments
 (0)