From d56eddd438ee1e9555af508736a9205ca0841b25 Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Fri, 24 Apr 2026 11:26:36 +0530 Subject: [PATCH 1/7] added react native tests --- tests/ReactNativeTest.php | 45 +++ tests/languages/react-native/browser.js | 345 ++++++++++++++++++ tests/languages/react-native/index.html | 11 + .../react-native/rollup.test.config.mjs | 52 +++ .../react-native/shims/expo-file-system.js | 28 ++ tests/languages/react-native/tests.js | 35 ++ 6 files changed, 516 insertions(+) create mode 100644 tests/ReactNativeTest.php create mode 100644 tests/languages/react-native/browser.js create mode 100644 tests/languages/react-native/index.html create mode 100644 tests/languages/react-native/rollup.test.config.mjs create mode 100644 tests/languages/react-native/shims/expo-file-system.js create mode 100644 tests/languages/react-native/tests.js diff --git a/tests/ReactNativeTest.php b/tests/ReactNativeTest.php new file mode 100644 index 0000000000..2dab1478d8 --- /dev/null +++ b/tests/ReactNativeTest.php @@ -0,0 +1,45 @@ + { + let response; + let responseRealtime = 'Realtime failed!'; + let responseRealtimeWithQueries = 'Realtime failed!'; + let responseRealtimeWithQueriesFailure = 'Realtime failed!'; + + let rtsubFailureUnsubscribed = false; + let rtsubFailureFiredAfterUnsubscribe = false; + + const client = new Client(); + + const foo = new Foo(client); + const bar = new Bar(client); + const general = new General(client); + const sdkHeaders = client.getHeaders(); + + console.log( + `x-sdk-name: ${sdkHeaders['x-sdk-name']}; x-sdk-platform: ${sdkHeaders['x-sdk-platform']}; x-sdk-language: ${sdkHeaders['x-sdk-language']}; x-sdk-version: ${sdkHeaders['x-sdk-version']}` + ); + + client.setProject('123456'); + response = await client.ping(); + console.log(response.result); + + client.setProject('console'); + client.setEndpointRealtime('wss://cloud.appwrite.io/v1'); + + const realtime = new Realtime(client); + + await realtime.subscribe(['tests'], (message) => { + responseRealtime = message.payload.response; + }); + + const rtsubWithQueries = await realtime.subscribe( + ['tests'], + (message) => { + responseRealtimeWithQueries = message.payload.response; + }, + [[Query.equal('response', ['WS:/v1/realtime:passed'])]], + ); + + const rtsubWithQueriesFailure = await realtime.subscribe( + ['tests'], + (message) => { + if (rtsubFailureUnsubscribed) rtsubFailureFiredAfterUnsubscribe = true; + responseRealtimeWithQueriesFailure = message.payload.response; + }, + [[Query.equal('response', ['failed'])]], + ); + + // Foo + response = await foo.get('string', 123, ['string in array']); + console.log(response.result); + response = await foo.post('string', 123, ['string in array']); + console.log(response.result); + response = await foo.put('string', 123, ['string in array']); + console.log(response.result); + response = await foo.patch('string', 123, ['string in array']); + console.log(response.result); + response = await foo.delete('string', 123, ['string in array']); + console.log(response.result); + + // Foo (Object params) + response = await foo.get({ x: 'string', y: 123, z: ['string in array'] }); + console.log(response.result); + response = await foo.post({ x: 'string', y: 123, z: ['string in array'] }); + console.log(response.result); + response = await foo.put({ x: 'string', y: 123, z: ['string in array'] }); + console.log(response.result); + response = await foo.patch({ x: 'string', y: 123, z: ['string in array'] }); + console.log(response.result); + response = await foo.delete({ x: 'string', y: 123, z: ['string in array'] }); + console.log(response.result); + + // Bar + response = await bar.get('string', 123, ['string in array']); + console.log(response.result); + response = await bar.post('string', 123, ['string in array']); + console.log(response.result); + response = await bar.put('string', 123, ['string in array']); + console.log(response.result); + response = await bar.patch('string', 123, ['string in array']); + console.log(response.result); + response = await bar.delete('string', 123, ['string in array']); + console.log(response.result); + + // Bar (Object params) + response = await bar.get({ required: 'string', xdefault: 123, z: ['string in array'] }); + console.log(response.result); + response = await bar.post({ required: 'string', xdefault: 123, z: ['string in array'] }); + console.log(response.result); + response = await bar.put({ required: 'string', xdefault: 123, z: ['string in array'] }); + console.log(response.result); + response = await bar.patch({ required: 'string', xdefault: 123, z: ['string in array'] }); + console.log(response.result); + response = await bar.delete({ required: 'string', xdefault: 123, z: ['string in array'] }); + console.log(response.result); + + // General + response = await general.redirect(); + console.log(response.result); + + // Enum + response = await general.enum(MockType.First); + console.log(response.result); + + // Request model tests + response = await general.createPlayer({ id: 'player1', name: 'John Doe', score: 100 }); + console.log(response.result); + response = await general.createPlayers([ + { id: 'player1', name: 'John Doe', score: 100 }, + { id: 'player2', name: 'Jane Doe', score: 200 }, + ]); + console.log(response.result); + + // Exception responses + try { + response = await general.error400(); + } catch (error) { + console.log(error.message); + console.log(error.response); + } + try { + response = await general.error500(); + } catch (error) { + console.log(error.message); + console.log(error.response); + } + try { + response = await general.error502(); + } catch (error) { + console.log(error.message); + console.log(error.response); + } + try { + client.setEndpoint('htp://cloud.appwrite.io/v1'); + } catch (error) { + console.log(error.message); + } + + // Realtime waits + const delay = (ms) => new Promise((res) => setTimeout(res, ms)); + await delay(5000); + console.log(responseRealtime); + console.log(responseRealtimeWithQueries); + console.log(responseRealtimeWithQueriesFailure); + + try { + await rtsubWithQueriesFailure.unsubscribe(); + rtsubFailureUnsubscribed = true; + await rtsubWithQueriesFailure.unsubscribe(); + await delay(500); + if (rtsubFailureFiredAfterUnsubscribe) { + throw new Error('callback fired after unsubscribe'); + } + console.log('Realtime unsubscribe:passed'); + } catch (e) { + console.log('Realtime unsubscribe:failed'); + } + + try { + await rtsubWithQueries.update({ channels: ['tests'], queries: [] }); + console.log('Realtime update:passed'); + } catch (e) { + console.log('Realtime update:failed'); + } + + try { + await realtime.disconnect(); + console.log('Realtime disconnect:passed'); + } catch (e) { + console.log('Realtime disconnect:failed'); + } + + // Query helper tests + console.log(Query.equal('released', [true])); + console.log(Query.equal('title', ['Spiderman', 'Dr. Strange'])); + console.log(Query.notEqual('title', 'Spiderman')); + console.log(Query.lessThan('releasedYear', 1990)); + console.log(Query.greaterThan('releasedYear', 1990)); + console.log(Query.search('name', 'john')); + console.log(Query.isNull('name')); + console.log(Query.isNotNull('name')); + console.log(Query.between('age', 50, 100)); + console.log(Query.between('age', 50.5, 100.5)); + console.log(Query.between('name', 'Anna', 'Brad')); + console.log(Query.startsWith('name', 'Ann')); + console.log(Query.endsWith('name', 'nne')); + console.log(Query.select(['name', 'age'])); + console.log(Query.orderAsc('title')); + console.log(Query.orderDesc('title')); + console.log(Query.orderRandom()); + console.log(Query.cursorAfter('my_movie_id')); + console.log(Query.cursorBefore('my_movie_id')); + console.log(Query.limit(50)); + console.log(Query.offset(20)); + console.log(Query.contains('title', 'Spider')); + console.log(Query.contains('labels', 'first')); + console.log(Query.containsAny('labels', ['first', 'second'])); + console.log(Query.containsAll('labels', ['first', 'second'])); + + console.log(Query.notContains('title', 'Spider')); + console.log(Query.notSearch('name', 'john')); + console.log(Query.notBetween('age', 50, 100)); + console.log(Query.notStartsWith('name', 'Ann')); + console.log(Query.notEndsWith('name', 'nne')); + console.log(Query.createdBefore('2023-01-01')); + console.log(Query.createdAfter('2023-01-01')); + console.log(Query.createdBetween('2023-01-01', '2023-12-31')); + console.log(Query.updatedBefore('2023-01-01')); + console.log(Query.updatedAfter('2023-01-01')); + console.log(Query.updatedBetween('2023-01-01', '2023-12-31')); + + console.log(Query.distanceEqual('location', [[40.7128, -74], [40.7128, -74]], 1000)); + console.log(Query.distanceEqual('location', [40.7128, -74], 1000, true)); + console.log(Query.distanceNotEqual('location', [40.7128, -74], 1000)); + console.log(Query.distanceNotEqual('location', [40.7128, -74], 1000, true)); + console.log(Query.distanceGreaterThan('location', [40.7128, -74], 1000)); + console.log(Query.distanceGreaterThan('location', [40.7128, -74], 1000, true)); + console.log(Query.distanceLessThan('location', [40.7128, -74], 1000)); + console.log(Query.distanceLessThan('location', [40.7128, -74], 1000, true)); + + console.log(Query.intersects('location', [40.7128, -74])); + console.log(Query.notIntersects('location', [40.7128, -74])); + console.log(Query.crosses('location', [40.7128, -74])); + console.log(Query.notCrosses('location', [40.7128, -74])); + console.log(Query.overlaps('location', [40.7128, -74])); + console.log(Query.notOverlaps('location', [40.7128, -74])); + console.log(Query.touches('location', [40.7128, -74])); + console.log(Query.notTouches('location', [40.7128, -74])); + console.log(Query.contains('location', [[40.7128, -74], [40.7128, -74]])); + console.log(Query.notContains('location', [[40.7128, -74], [40.7128, -74]])); + console.log(Query.equal('location', [[40.7128, -74], [40.7128, -74]])); + console.log(Query.notEqual('location', [[40.7128, -74], [40.7128, -74]])); + + console.log(Query.or([ + Query.equal('released', true), + Query.lessThan('releasedYear', 1990), + ])); + console.log(Query.and([ + Query.equal('released', false), + Query.greaterThan('releasedYear', 2015), + ])); + + console.log(Query.regex('name', 'pattern.*')); + console.log(Query.exists(['attr1', 'attr2'])); + console.log(Query.notExists(['attr1', 'attr2'])); + console.log(Query.elemMatch('friends', [ + Query.equal('name', 'Alice'), + Query.greaterThan('age', 18), + ])); + + // Permission & Role helper tests + console.log(Permission.read(Role.any())); + console.log(Permission.write(Role.user(ID.custom('userid')))); + console.log(Permission.create(Role.users())); + console.log(Permission.update(Role.guests())); + console.log(Permission.delete(Role.team('teamId', 'owner'))); + console.log(Permission.delete(Role.team('teamId'))); + console.log(Permission.create(Role.member('memberId'))); + console.log(Permission.update(Role.users('verified'))); + console.log(Permission.update(Role.user(ID.custom('userid'), 'unverified'))); + console.log(Permission.create(Role.label('admin'))); + + // ID helper tests + console.log(ID.unique()); + console.log(ID.custom('custom_id')); + + // Channel helper tests + console.log(Channel.database('db1').collection('col1').document().toString()); + console.log(Channel.database('db1').collection('col1').document('doc1').toString()); + console.log(Channel.database('db1').collection('col1').document('doc1').create().toString()); + console.log(Channel.database('db1').collection('col1').document('doc1').upsert().toString()); + console.log(Channel.tablesdb('db1').table('table1').row().toString()); + console.log(Channel.tablesdb('db1').table('table1').row('row1').toString()); + console.log(Channel.tablesdb('db1').table('table1').row('row1').update().toString()); + console.log(Channel.account()); + console.log(Channel.bucket('bucket1').file().toString()); + console.log(Channel.bucket('bucket1').file('file1').toString()); + console.log(Channel.bucket('bucket1').file('file1').delete().toString()); + console.log(Channel.function('func2').toString()); + console.log(Channel.function('func1').toString()); + console.log(Channel.execution('exec2').toString()); + console.log(Channel.execution('exec1').toString()); + console.log(Channel.documents()); + console.log(Channel.rows()); + console.log(Channel.files()); + console.log(Channel.executions()); + console.log(Channel.teams()); + console.log(Channel.team('team2').toString()); + console.log(Channel.team('team1').toString()); + console.log(Channel.team('team1').create().toString()); + console.log(Channel.memberships()); + console.log(Channel.membership('membership2').toString()); + console.log(Channel.membership('membership1').toString()); + console.log(Channel.membership('membership1').update().toString()); + + // Operator helper tests + console.log(Operator.increment(1)); + console.log(Operator.increment(5, 100)); + console.log(Operator.decrement(1)); + console.log(Operator.decrement(3, 0)); + console.log(Operator.multiply(2)); + console.log(Operator.multiply(3, 1000)); + console.log(Operator.divide(2)); + console.log(Operator.divide(4, 1)); + console.log(Operator.modulo(5)); + console.log(Operator.power(2)); + console.log(Operator.power(3, 100)); + console.log(Operator.arrayAppend(['item1', 'item2'])); + console.log(Operator.arrayPrepend(['first', 'second'])); + console.log(Operator.arrayInsert(0, 'newItem')); + console.log(Operator.arrayRemove('oldItem')); + console.log(Operator.arrayUnique()); + console.log(Operator.arrayIntersect(['a', 'b', 'c'])); + console.log(Operator.arrayDiff(['x', 'y'])); + console.log(Operator.arrayFilter(Condition.Equal, 'test')); + console.log(Operator.stringConcat('suffix')); + console.log(Operator.stringReplace('old', 'new')); + console.log(Operator.toggle()); + console.log(Operator.dateAddDays(7)); + console.log(Operator.dateSubDays(3)); + console.log(Operator.dateSetNow()); + + window.__APPWRITE_TEST_DONE__ = true; +})().catch((err) => { + console.log('TEST RUNNER ERROR: ' + (err && err.message ? err.message : String(err))); + window.__APPWRITE_TEST_DONE__ = true; +}); diff --git a/tests/languages/react-native/index.html b/tests/languages/react-native/index.html new file mode 100644 index 0000000000..29d8a541ca --- /dev/null +++ b/tests/languages/react-native/index.html @@ -0,0 +1,11 @@ + + + + + + Appwrite React Native Test + + + + + diff --git a/tests/languages/react-native/rollup.test.config.mjs b/tests/languages/react-native/rollup.test.config.mjs new file mode 100644 index 0000000000..1c6bc9dd16 --- /dev/null +++ b/tests/languages/react-native/rollup.test.config.mjs @@ -0,0 +1,52 @@ +import alias from '@rollup/plugin-alias'; +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import typescript from '@rollup/plugin-typescript'; +import replace from '@rollup/plugin-replace'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +export default { + input: 'browser.js', + output: { + file: 'dist/browser.bundle.js', + format: 'iife', + name: 'AppwriteTest', + sourcemap: false, + inlineDynamicImports: true, + }, + plugins: [ + alias({ + entries: [ + { find: 'react-native', replacement: 'react-native-web' }, + { + find: 'expo-file-system', + replacement: path.resolve(__dirname, 'shims/expo-file-system.js'), + }, + ], + }), + replace({ + preventAssignment: true, + values: { + 'process.env.NODE_ENV': JSON.stringify('production'), + __DEV__: 'false', + }, + }), + resolve({ + browser: true, + extensions: ['.mjs', '.js', '.jsx', '.ts', '.tsx', '.json'], + preferBuiltins: false, + }), + commonjs(), + typescript({ + tsconfig: './tsconfig.json', + noEmitOnError: false, + compilerOptions: { + declaration: false, + declarationMap: false, + }, + }), + ], +}; diff --git a/tests/languages/react-native/shims/expo-file-system.js b/tests/languages/react-native/shims/expo-file-system.js new file mode 100644 index 0000000000..412db8d0a2 --- /dev/null +++ b/tests/languages/react-native/shims/expo-file-system.js @@ -0,0 +1,28 @@ +const notImplemented = (name) => () => { + throw new Error( + `expo-file-system shim: ${name} was called, but uploads are not exercised by this test harness.` + ); +}; + +export const EncodingType = { UTF8: 'utf8', Base64: 'base64' }; +export const documentDirectory = ''; +export const cacheDirectory = ''; + +export const getInfoAsync = notImplemented('getInfoAsync'); +export const readAsStringAsync = notImplemented('readAsStringAsync'); +export const writeAsStringAsync = notImplemented('writeAsStringAsync'); +export const deleteAsync = notImplemented('deleteAsync'); +export const uploadAsync = notImplemented('uploadAsync'); +export const FileSystemUploadType = { BINARY_CONTENT: 0, MULTIPART: 1 }; + +export default { + EncodingType, + documentDirectory, + cacheDirectory, + getInfoAsync, + readAsStringAsync, + writeAsStringAsync, + deleteAsync, + uploadAsync, + FileSystemUploadType, +}; diff --git a/tests/languages/react-native/tests.js b/tests/languages/react-native/tests.js new file mode 100644 index 0000000000..84a78e4e5e --- /dev/null +++ b/tests/languages/react-native/tests.js @@ -0,0 +1,35 @@ +const playwright = require('playwright'); +const handler = require('serve-handler'); +const http = require('http'); +const { exit } = require('process'); + +const server = http.createServer((request, response) => { + return handler(request, response); +}); + +server.listen(3000, async () => { + console.log('Test Started'); + const browser = await playwright[process.env.BROWSER].launch({ + args: [ + '--allow-insecure-localhost', + '--disable-web-security', + ], + }); + const context = await browser.newContext(); + const page = await context.newPage(); + page.on('console', message => { + if (message.type() === 'log') { + console.log(message.text()); + } + }); + page.on('pageerror', err => { + console.log('PAGE ERROR: ' + err.message); + }); + await page.goto('http://localhost:3000'); + + setTimeout(async () => { + await browser.close(); + server.close(); + exit(0); + }, 20000); +}); From ef86b7c59772d81af0f066c1c3519a61272de1ae Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Fri, 24 Apr 2026 11:34:39 +0530 Subject: [PATCH 2/7] updated the ci --- .github/workflows/tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d78c1ba7b0..0ed2eeec55 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -48,7 +48,8 @@ jobs: AppleSwift56, Swift56, WebChromium, - WebNode + WebNode, + ReactNative ] steps: From 8fd1fe000d5cfe21bc2b0bb4062e430372dfc76c Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Fri, 24 Apr 2026 11:52:13 +0530 Subject: [PATCH 3/7] updated --- templates/react-native/src/models.ts.twig | 21 +++++++++++++++++++ .../src/services/template.ts.twig | 6 +++--- tests/ReactNativeTest.php | 6 +++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/templates/react-native/src/models.ts.twig b/templates/react-native/src/models.ts.twig index a8a14ade39..dcb30e7137 100644 --- a/templates/react-native/src/models.ts.twig +++ b/templates/react-native/src/models.ts.twig @@ -28,4 +28,25 @@ export namespace Models { }; {% endif %} {% endfor %} +{% for requestModel in spec.requestModels %} + + /** + * {{ requestModel.description }} + */ + export type {{ requestModel.name | caseUcfirst }}{{ requestModel.name | getGenerics(spec, true) | raw }} = { +{% for property in requestModel.properties %} + /** + * {{ property.description | raw }} + */ + {{ property.name | removeDash }}{% if not property.required %}?{% endif %}: {{ property | getSubSchema(spec, requestModel.name) | raw }}; +{% endfor %} + } +{% if requestModel.additionalProperties %} + + export type Default{{ requestModel.name | caseUcfirst }}{{ requestModel.name | getGenerics(spec, true) | raw }} = {{ requestModel.name | caseUcfirst }}{{ requestModel.name | getGenerics(spec, true) | raw }} & { + [key: string]: any; + [__default]: true; + }; +{% endif %} +{% endfor %} } diff --git a/templates/react-native/src/services/template.ts.twig b/templates/react-native/src/services/template.ts.twig index 40e3be45ab..4e99ba6bc3 100644 --- a/templates/react-native/src/services/template.ts.twig +++ b/templates/react-native/src/services/template.ts.twig @@ -45,7 +45,7 @@ export class {{ service.name | caseUcfirst }} extends Service { {%~ endif %} */ {%~ if method.parameters.all|length > 0 %} - {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(params{% set hasRequiredParams = false %}{% for parameter in method.parameters.all %}{% if parameter.required %}{% set hasRequiredParams = true %}{% endif %}{% endfor %}{% if not hasRequiredParams %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} {% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void{% endif %} }): {{ method | getReturn(spec) | raw }}; + {% if 'multipart/form-data' in method.consumes %}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(params{% set hasRequiredParams = false %}{% for parameter in method.parameters.all %}{% if parameter.required %}{% set hasRequiredParams = true %}{% endif %}{% endfor %}{% if not hasRequiredParams %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} {% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void{% endif %} }): {{ method | getReturn(spec) | raw }}; /** {%~ if method.description %} * {{ method.description | replace({'\n': '\n * '}) | raw }} @@ -58,8 +58,8 @@ export class {{ service.name | caseUcfirst }} extends Service { * @returns {{ '{' }}{{ method | getReturn(spec) | raw }}{{ '}' }} * @deprecated Use the object parameter style method for a better developer experience. */ - {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void{% endif %}): {{ method | getReturn(spec) | raw }}; - {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}( + {% if 'multipart/form-data' in method.consumes %}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void{% endif %}): {{ method | getReturn(spec) | raw }}; + {% if 'multipart/form-data' in method.consumes %}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}( {% if method.parameters.all|length > 0 %}paramsOrFirst{% if not method.parameters.all[0].required or method.parameters.all[0].nullable %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void {% endif %} } | {{ method.parameters.all[0] | getPropertyType(method) | raw }}{% if method.parameters.all|length > 1 %}, ...rest: [{% for parameter in method.parameters.all[1:] %}({{ parameter | getPropertyType(method) | raw }})?{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %},((progress: UploadProgress) => void)?{% endif %}]{% endif %}{% endif %} diff --git a/tests/ReactNativeTest.php b/tests/ReactNativeTest.php index 2dab1478d8..876ec7c408 100644 --- a/tests/ReactNativeTest.php +++ b/tests/ReactNativeTest.php @@ -18,12 +18,12 @@ class ReactNativeTest extends Base 'cp tests/languages/react-native/browser.js tests/sdks/react-native/browser.js', 'cp tests/languages/react-native/rollup.test.config.mjs tests/sdks/react-native/rollup.test.config.mjs', 'mkdir -p tests/sdks/react-native/shims && cp tests/languages/react-native/shims/expo-file-system.js tests/sdks/react-native/shims/expo-file-system.js', - 'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.56.1-jammy sh -c "npm install && npm install --no-save react-native-web react react-dom @rollup/plugin-alias @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace serve-handler"', - 'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.56.1-jammy sh -c "npx rollup -c rollup.test.config.mjs"', + 'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy sh -c "npm install && npm install --no-save react-native-web react react-dom @rollup/plugin-alias @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace serve-handler"', + 'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy sh -c "npx rollup -c rollup.test.config.mjs"', ]; protected string $command = - 'docker run --network="mockapi" --rm -v $(pwd):/app -e BROWSER=chromium -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.56.1-jammy node tests.js'; + 'docker run --network="mockapi" --rm -v $(pwd):/app -e BROWSER=chromium -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy node tests.js'; protected array $expectedOutput = [ ...Base::PING_RESPONSE, From d85481d7babe9ab50d68a8e68867f4246a980ef4 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 29 Apr 2026 20:22:07 +1200 Subject: [PATCH 4/7] fix: react native test rollup typescript outDir @rollup/plugin-typescript requires the TypeScript compiler's outDir to sit inside the directory of the Rollup output file. Without an explicit outDir the plugin inferred a path outside dist/ and refused to render the bundle, leaving the playwright runner with nothing to load. Also: drop the redundant serve-handler from the no-save install (it is already a dev dependency), and replace the hard 20s timeout with page.waitForFunction so a fast-failing test exits sooner. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/scheduled_tasks.lock | 1 + tests/ReactNativeTest.php | 2 +- ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 ++++ .../obj/Debug/net6.0/Tests60.AssemblyInfo.cs | 22 +++++++++++++++++++ .../net6.0/Tests60.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 13 +++++++++++ ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 ++++ .../obj/Debug/net8.0/Tests80.AssemblyInfo.cs | 22 +++++++++++++++++++ .../net8.0/Tests80.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 13 +++++++++++ ...CoreApp,Version=v9.0.AssemblyAttributes.cs | 4 ++++ .../obj/Debug/net9.0/Tests90.AssemblyInfo.cs | 22 +++++++++++++++++++ .../net9.0/Tests90.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 13 +++++++++++ .../react-native/rollup.test.config.mjs | 5 +++++ tests/languages/react-native/tests.js | 16 +++++++++----- 16 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 .claude/scheduled_tasks.lock create mode 100644 tests/languages/dotnet/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfo.cs create mode 100644 tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfoInputs.cache create mode 100644 tests/languages/dotnet/obj/Debug/net6.0/Tests60.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 tests/languages/dotnet/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs create mode 100644 tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfo.cs create mode 100644 tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfoInputs.cache create mode 100644 tests/languages/dotnet/obj/Debug/net8.0/Tests80.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 tests/languages/dotnet/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs create mode 100644 tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfo.cs create mode 100644 tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfoInputs.cache create mode 100644 tests/languages/dotnet/obj/Debug/net9.0/Tests90.GeneratedMSBuildEditorConfig.editorconfig diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 0000000000..89db8dd581 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"8c691ee3-025e-41eb-a1e6-190cd3a09839","pid":81116,"procStart":"Wed Apr 29 08:09:53 2026","acquiredAt":1777450737130} \ No newline at end of file diff --git a/tests/ReactNativeTest.php b/tests/ReactNativeTest.php index 876ec7c408..bb7987622b 100644 --- a/tests/ReactNativeTest.php +++ b/tests/ReactNativeTest.php @@ -18,7 +18,7 @@ class ReactNativeTest extends Base 'cp tests/languages/react-native/browser.js tests/sdks/react-native/browser.js', 'cp tests/languages/react-native/rollup.test.config.mjs tests/sdks/react-native/rollup.test.config.mjs', 'mkdir -p tests/sdks/react-native/shims && cp tests/languages/react-native/shims/expo-file-system.js tests/sdks/react-native/shims/expo-file-system.js', - 'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy sh -c "npm install && npm install --no-save react-native-web react react-dom @rollup/plugin-alias @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace serve-handler"', + 'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy sh -c "npm install && npm install --no-save react-native-web react react-dom @rollup/plugin-alias @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace"', 'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy sh -c "npx rollup -c rollup.test.config.mjs"', ]; diff --git a/tests/languages/dotnet/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/tests/languages/dotnet/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000000..0e18c2b3ec --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] diff --git a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfo.cs b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfo.cs new file mode 100644 index 0000000000..c82404c4b2 --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Tests60")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c714ee52659ef5968b3372ff4da0e407140a6250")] +[assembly: System.Reflection.AssemblyProductAttribute("Tests60")] +[assembly: System.Reflection.AssemblyTitleAttribute("Tests60")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfoInputs.cache b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfoInputs.cache new file mode 100644 index 0000000000..101681690c --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0de7db6ad8361ffad569963997792fbc0d1929899e256eb885532e6706087400 diff --git a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.GeneratedMSBuildEditorConfig.editorconfig b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000000..dea122f02c --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,13 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Tests60 +build_property.ProjectDir = /Users/jakebarnby/Local/sdk-generator/tests/languages/dotnet/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/tests/languages/dotnet/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/tests/languages/dotnet/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000000..dca70aa49c --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfo.cs b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfo.cs new file mode 100644 index 0000000000..aa4ffa829c --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Tests80")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c714ee52659ef5968b3372ff4da0e407140a6250")] +[assembly: System.Reflection.AssemblyProductAttribute("Tests80")] +[assembly: System.Reflection.AssemblyTitleAttribute("Tests80")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfoInputs.cache b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfoInputs.cache new file mode 100644 index 0000000000..1e9727b00b --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +537a34599b41c5ee3eb19c16fe586e653b1e5e75c76b1ad4548b6cd3614f7fb9 diff --git a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.GeneratedMSBuildEditorConfig.editorconfig b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000000..a3e773eefa --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,13 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Tests80 +build_property.ProjectDir = /Users/jakebarnby/Local/sdk-generator/tests/languages/dotnet/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/tests/languages/dotnet/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/tests/languages/dotnet/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs new file mode 100644 index 0000000000..9e76325487 --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] diff --git a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfo.cs b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfo.cs new file mode 100644 index 0000000000..1557517837 --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Tests90")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c714ee52659ef5968b3372ff4da0e407140a6250")] +[assembly: System.Reflection.AssemblyProductAttribute("Tests90")] +[assembly: System.Reflection.AssemblyTitleAttribute("Tests90")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfoInputs.cache b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfoInputs.cache new file mode 100644 index 0000000000..1cf468b8b8 --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +1ec82f6904f8af41feab6a9df11d38ced7bcf8d9c90ccf52538666130a63d243 diff --git a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.GeneratedMSBuildEditorConfig.editorconfig b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000000..d99a9b252c --- /dev/null +++ b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,13 @@ +is_global = true +build_property.TargetFramework = net9.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Tests90 +build_property.ProjectDir = /Users/jakebarnby/Local/sdk-generator/tests/languages/dotnet/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/tests/languages/react-native/rollup.test.config.mjs b/tests/languages/react-native/rollup.test.config.mjs index 1c6bc9dd16..cc2e90bad7 100644 --- a/tests/languages/react-native/rollup.test.config.mjs +++ b/tests/languages/react-native/rollup.test.config.mjs @@ -44,9 +44,14 @@ export default { tsconfig: './tsconfig.json', noEmitOnError: false, compilerOptions: { + allowJs: true, declaration: false, declarationMap: false, + outDir: 'dist', + rootDir: '.', }, + include: ['src/**/*.ts', 'browser.js'], + exclude: ['node_modules/**', 'dist/**'], }), ], }; diff --git a/tests/languages/react-native/tests.js b/tests/languages/react-native/tests.js index 84a78e4e5e..dadf56d8f8 100644 --- a/tests/languages/react-native/tests.js +++ b/tests/languages/react-native/tests.js @@ -27,9 +27,15 @@ server.listen(3000, async () => { }); await page.goto('http://localhost:3000'); - setTimeout(async () => { - await browser.close(); - server.close(); - exit(0); - }, 20000); + try { + await page.waitForFunction(() => window.__APPWRITE_TEST_DONE__ === true, { + timeout: 20000, + }); + } catch (e) { + console.log('TEST RUNNER TIMEOUT: ' + e.message); + } + + await browser.close(); + server.close(); + exit(0); }); From ffccd7d0fe1e314cbf66f9282a1ddcc693e568e8 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 29 Apr 2026 20:22:20 +1200 Subject: [PATCH 5/7] chore: remove accidentally committed local build artifacts Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/scheduled_tasks.lock | 1 - ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 ---- .../obj/Debug/net6.0/Tests60.AssemblyInfo.cs | 22 ------------------- .../net6.0/Tests60.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 13 ----------- ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 ---- .../obj/Debug/net8.0/Tests80.AssemblyInfo.cs | 22 ------------------- .../net8.0/Tests80.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 13 ----------- ...CoreApp,Version=v9.0.AssemblyAttributes.cs | 4 ---- .../obj/Debug/net9.0/Tests90.AssemblyInfo.cs | 22 ------------------- .../net9.0/Tests90.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 13 ----------- 13 files changed, 121 deletions(-) delete mode 100644 .claude/scheduled_tasks.lock delete mode 100644 tests/languages/dotnet/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs delete mode 100644 tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfo.cs delete mode 100644 tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfoInputs.cache delete mode 100644 tests/languages/dotnet/obj/Debug/net6.0/Tests60.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 tests/languages/dotnet/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs delete mode 100644 tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfo.cs delete mode 100644 tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfoInputs.cache delete mode 100644 tests/languages/dotnet/obj/Debug/net8.0/Tests80.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 tests/languages/dotnet/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs delete mode 100644 tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfo.cs delete mode 100644 tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfoInputs.cache delete mode 100644 tests/languages/dotnet/obj/Debug/net9.0/Tests90.GeneratedMSBuildEditorConfig.editorconfig diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock deleted file mode 100644 index 89db8dd581..0000000000 --- a/.claude/scheduled_tasks.lock +++ /dev/null @@ -1 +0,0 @@ -{"sessionId":"8c691ee3-025e-41eb-a1e6-190cd3a09839","pid":81116,"procStart":"Wed Apr 29 08:09:53 2026","acquiredAt":1777450737130} \ No newline at end of file diff --git a/tests/languages/dotnet/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/tests/languages/dotnet/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs deleted file mode 100644 index 0e18c2b3ec..0000000000 --- a/tests/languages/dotnet/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] diff --git a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfo.cs b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfo.cs deleted file mode 100644 index c82404c4b2..0000000000 --- a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("Tests60")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c714ee52659ef5968b3372ff4da0e407140a6250")] -[assembly: System.Reflection.AssemblyProductAttribute("Tests60")] -[assembly: System.Reflection.AssemblyTitleAttribute("Tests60")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfoInputs.cache b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfoInputs.cache deleted file mode 100644 index 101681690c..0000000000 --- a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -0de7db6ad8361ffad569963997792fbc0d1929899e256eb885532e6706087400 diff --git a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.GeneratedMSBuildEditorConfig.editorconfig b/tests/languages/dotnet/obj/Debug/net6.0/Tests60.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index dea122f02c..0000000000 --- a/tests/languages/dotnet/obj/Debug/net6.0/Tests60.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -is_global = true -build_property.TargetFramework = net6.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = Tests60 -build_property.ProjectDir = /Users/jakebarnby/Local/sdk-generator/tests/languages/dotnet/ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/tests/languages/dotnet/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/tests/languages/dotnet/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs deleted file mode 100644 index dca70aa49c..0000000000 --- a/tests/languages/dotnet/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfo.cs b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfo.cs deleted file mode 100644 index aa4ffa829c..0000000000 --- a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("Tests80")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c714ee52659ef5968b3372ff4da0e407140a6250")] -[assembly: System.Reflection.AssemblyProductAttribute("Tests80")] -[assembly: System.Reflection.AssemblyTitleAttribute("Tests80")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfoInputs.cache b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfoInputs.cache deleted file mode 100644 index 1e9727b00b..0000000000 --- a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -537a34599b41c5ee3eb19c16fe586e653b1e5e75c76b1ad4548b6cd3614f7fb9 diff --git a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.GeneratedMSBuildEditorConfig.editorconfig b/tests/languages/dotnet/obj/Debug/net8.0/Tests80.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index a3e773eefa..0000000000 --- a/tests/languages/dotnet/obj/Debug/net8.0/Tests80.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -is_global = true -build_property.TargetFramework = net8.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = Tests80 -build_property.ProjectDir = /Users/jakebarnby/Local/sdk-generator/tests/languages/dotnet/ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/tests/languages/dotnet/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/tests/languages/dotnet/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs deleted file mode 100644 index 9e76325487..0000000000 --- a/tests/languages/dotnet/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] diff --git a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfo.cs b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfo.cs deleted file mode 100644 index 1557517837..0000000000 --- a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("Tests90")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c714ee52659ef5968b3372ff4da0e407140a6250")] -[assembly: System.Reflection.AssemblyProductAttribute("Tests90")] -[assembly: System.Reflection.AssemblyTitleAttribute("Tests90")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfoInputs.cache b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfoInputs.cache deleted file mode 100644 index 1cf468b8b8..0000000000 --- a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -1ec82f6904f8af41feab6a9df11d38ced7bcf8d9c90ccf52538666130a63d243 diff --git a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.GeneratedMSBuildEditorConfig.editorconfig b/tests/languages/dotnet/obj/Debug/net9.0/Tests90.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index d99a9b252c..0000000000 --- a/tests/languages/dotnet/obj/Debug/net9.0/Tests90.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -is_global = true -build_property.TargetFramework = net9.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = Tests90 -build_property.ProjectDir = /Users/jakebarnby/Local/sdk-generator/tests/languages/dotnet/ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = From 7fd7b821055adba8d886094622de30e42e806c65 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 29 Apr 2026 20:40:14 +1200 Subject: [PATCH 6/7] fix: add Client.ping() to react native template The PING_RESPONSE assertion in ReactNativeTest hit a TypeError because the generated Client had no ping(); the test runner aborted before any SDK call landed, which cascaded into the whole expected-output diff. Mirrors the web template's existing helper (templates/web/src/client.ts.twig:864). Co-Authored-By: Claude Opus 4.7 (1M context) --- templates/react-native/src/client.ts.twig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/react-native/src/client.ts.twig b/templates/react-native/src/client.ts.twig index f4bdb85a2a..00a366d052 100644 --- a/templates/react-native/src/client.ts.twig +++ b/templates/react-native/src/client.ts.twig @@ -543,6 +543,10 @@ class Client { } } + async ping(): Promise { + return this.call('GET', new URL(this.config.endpoint + '/ping')); + } + async call(method: string, url: URL, headers: Headers = {}, params: Payload = {}, responseType = 'json'): Promise { method = method.toUpperCase(); From 8741445df968e442340782ac8510a079426a2af5 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 29 Apr 2026 20:52:04 +1200 Subject: [PATCH 7/7] fix: skip non-spec WebSocket third arg on react-native-web MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The React Native realtime template called the WebSocket constructor with three arguments (url, protocols, headers) — a React Native runtime extension that the React Native test bundle (which aliases react-native to react-native-web) cannot service via the browser's native WebSocket. Newer Chromium dispatched an immediate error event, the subscribe() promise rejected, and the test runner aborted before any of the foo/bar calls landed. When Platform.OS reports 'web' the SDK is running in a browser host, so the browser already attaches its own Origin header and no third argument is needed. Co-Authored-By: Claude Opus 4.7 (1M context) --- templates/web/src/services/realtime.ts.twig | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/templates/web/src/services/realtime.ts.twig b/templates/web/src/services/realtime.ts.twig index ec7d3cf593..635a859a50 100644 --- a/templates/web/src/services/realtime.ts.twig +++ b/templates/web/src/services/realtime.ts.twig @@ -183,11 +183,13 @@ export class Realtime { const connectionId = ++this.connectionId; {% if language.name == 'ReactNative' %} const WebSocketCtor: any = WebSocket; - const socket = (this.socket = new WebSocketCtor(url, undefined, { - headers: { - Origin: `{{ spec.title | caseLower }}-${Platform.OS}://${this.client.config.platform}` - } - })); + const socket = (this.socket = Platform.OS === 'web' + ? new WebSocketCtor(url) + : new WebSocketCtor(url, undefined, { + headers: { + Origin: `{{ spec.title | caseLower }}-${Platform.OS}://${this.client.config.platform}` + } + })); {% else %} const socket = (this.socket = new WebSocket(url)); {% endif %}