Skip to content

Commit 88da71e

Browse files
committed
- add encoding for objectId parameter in Data API
1 parent 01e244a commit 88da71e

File tree

5 files changed

+91
-5
lines changed

5 files changed

+91
-5
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
},
9292
"dependencies": {
9393
"@babel/runtime": "^7.14.6",
94-
"backendless-request": "^0.3.2",
94+
"backendless-request": "^0.3.3",
9595
"backendless-rt-client": "0.1.0"
9696
}
9797
}

src/urls.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ export default class Urls {
126126
}
127127

128128
dataTableObject(tableName, objectId) {
129-
return `${this.dataTable(tableName)}/${objectId}`
129+
return `${this.dataTable(tableName)}/${encodeURIComponent(objectId)}`
130130
}
131131

132132
dataTableObjectRelation(tableName, objectId, columnName) {

test/unit/specs/data/find.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,49 @@ describe('<Data> Find', function() {
174174
expect(result1).to.be.eql(fakeResult)
175175
})
176176

177+
it('with specific symbols in id', async () => {
178+
const req1 = prepareMockRequest(fakeResult)
179+
const req2 = prepareMockRequest(fakeResult)
180+
const req3 = prepareMockRequest(fakeResult)
181+
const req4 = prepareMockRequest(fakeResult)
182+
const req5 = prepareMockRequest(fakeResult)
183+
const req6 = prepareMockRequest(fakeResult)
184+
const req7 = prepareMockRequest(fakeResult)
185+
186+
const result1 = await dataStore.findById('foo bar')
187+
const result2 = await dataStore.findById('foo:bar')
188+
const result3 = await dataStore.findById('foo@bar')
189+
const result4 = await dataStore.findById('foo/bar')
190+
const result5 = await dataStore.findById('foo%bar')
191+
const result6 = await dataStore.findById('foo"bar')
192+
const result7 = await dataStore.findById('foo_абв_bar')
193+
194+
function buildPayload(objectIdInPath){
195+
return {
196+
method : 'GET',
197+
path : `${APP_PATH}/data/${tableName}/${objectIdInPath}`,
198+
headers: {},
199+
body : undefined
200+
}
201+
}
202+
203+
expect(req1).to.deep.include(buildPayload('foo%20bar'))
204+
expect(req2).to.deep.include(buildPayload('foo%3Abar'))
205+
expect(req3).to.deep.include(buildPayload('foo%40bar'))
206+
expect(req4).to.deep.include(buildPayload('foo%2Fbar'))
207+
expect(req5).to.deep.include(buildPayload('foo%25bar'))
208+
expect(req6).to.deep.include(buildPayload('foo%22bar'))
209+
expect(req7).to.deep.include(buildPayload('foo_%D0%B0%D0%B1%D0%B2_bar'))
210+
211+
expect(result1).to.be.eql(fakeResult)
212+
expect(result2).to.be.eql(fakeResult)
213+
expect(result3).to.be.eql(fakeResult)
214+
expect(result4).to.be.eql(fakeResult)
215+
expect(result5).to.be.eql(fakeResult)
216+
expect(result6).to.be.eql(fakeResult)
217+
expect(result7).to.be.eql(fakeResult)
218+
})
219+
177220
it('with object', async () => {
178221
const req1 = prepareMockRequest(fakeResult)
179222

test/unit/specs/data/relations.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,49 @@ describe('<Data> Relations', function() {
197197
expect(result3).to.be.eql(fakeResult)
198198
})
199199

200+
it('with specific symbols in parent id', async () => {
201+
const req1 = prepareMockRequest(fakeResult)
202+
const req2 = prepareMockRequest(fakeResult)
203+
const req3 = prepareMockRequest(fakeResult)
204+
const req4 = prepareMockRequest(fakeResult)
205+
const req5 = prepareMockRequest(fakeResult)
206+
const req6 = prepareMockRequest(fakeResult)
207+
const req7 = prepareMockRequest(fakeResult)
208+
209+
const result1 = await dataStore.loadRelations('foo bar', { relationName })
210+
const result2 = await dataStore.loadRelations('foo:bar', { relationName })
211+
const result3 = await dataStore.loadRelations('foo@bar', { relationName })
212+
const result4 = await dataStore.loadRelations('foo/bar', { relationName })
213+
const result5 = await dataStore.loadRelations('foo%bar', { relationName })
214+
const result6 = await dataStore.loadRelations('foo"bar', { relationName })
215+
const result7 = await dataStore.loadRelations('foo_абв_bar', { relationName })
216+
217+
function buildPayload(objectIdInPath) {
218+
return {
219+
method : 'GET',
220+
path : `${APP_PATH}/data/${tableName}/${objectIdInPath}/${relationName}`,
221+
headers: {},
222+
body : undefined
223+
}
224+
}
225+
226+
expect(req1).to.deep.include(buildPayload('foo%20bar'))
227+
expect(req2).to.deep.include(buildPayload('foo%3Abar'))
228+
expect(req3).to.deep.include(buildPayload('foo%40bar'))
229+
expect(req4).to.deep.include(buildPayload('foo%2Fbar'))
230+
expect(req5).to.deep.include(buildPayload('foo%25bar'))
231+
expect(req6).to.deep.include(buildPayload('foo%22bar'))
232+
expect(req7).to.deep.include(buildPayload('foo_%D0%B0%D0%B1%D0%B2_bar'))
233+
234+
expect(result1).to.be.eql(fakeResult)
235+
expect(result2).to.be.eql(fakeResult)
236+
expect(result3).to.be.eql(fakeResult)
237+
expect(result4).to.be.eql(fakeResult)
238+
expect(result5).to.be.eql(fakeResult)
239+
expect(result6).to.be.eql(fakeResult)
240+
expect(result7).to.be.eql(fakeResult)
241+
})
242+
200243
it('fails when parentObjectId is invalid', async () => {
201244
const errorMsg = 'Parent Object Id must be provided and must be a string.'
202245

0 commit comments

Comments
 (0)