Skip to content

Commit 5ae02c7

Browse files
authored
test: Added helper to get version of package when package.json not exported, and updated tests that need it (newrelic#3411)
1 parent 8047bf1 commit 5ae02c7

File tree

13 files changed

+32
-83
lines changed

13 files changed

+32
-83
lines changed

test/lib/agent_helper.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ const semver = require('semver')
2121
const crypto = require('crypto')
2222
const util = require('util')
2323
const cp = require('child_process')
24+
const fs = require('node:fs')
25+
const path = require('node:path')
2426

2527
let _agent = null
2628
let _agentApi = null
@@ -618,3 +620,19 @@ helper.execSync = function execSync({ cwd, script }) {
618620
throw err.stderr
619621
}
620622
}
623+
624+
/**
625+
* Used to get version from package.json.
626+
* Some packages define exports and omit `package.json` so `require` or `import`
627+
* will fail when trying to read package.json. This instead just reads file and parses to json
628+
*
629+
* @param {string} dirname value of `__dirname` in caller
630+
* @param {string} pkg name of package
631+
* @returns {string} package version
632+
*/
633+
helper.readPackageVersion = function readPackageVersion(dirname, pkg) {
634+
const parsedPath = path.join(dirname, 'node_modules', pkg, 'package.json')
635+
const packageFile = fs.readFileSync(parsedPath)
636+
const { version } = JSON.parse(packageFile)
637+
return version
638+
}

test/versioned/elastic/elasticsearch.test.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@
66
'use strict'
77
const test = require('node:test')
88
const assert = require('node:assert')
9-
const path = require('node:path')
109
const helper = require('../../lib/agent_helper')
1110
const params = require('../../lib/params')
1211
const urltils = require('../../../lib/util/urltils')
1312
const crypto = require('crypto')
1413
const { assertPackageMetrics } = require('../../lib/custom-assertions')
15-
const { readFile } = require('fs/promises')
1614
const semver = require('semver')
1715
const DB_INDEX = `test-${randomString()}`
1816
const DB_INDEX_2 = `test2-${randomString()}`
@@ -52,10 +50,7 @@ function setMsearch(body, version) {
5250

5351
test('Elasticsearch instrumentation', async (t) => {
5452
t.beforeEach(async (ctx) => {
55-
// Determine version. ElasticSearch v7 did not export package, so we have to read the file
56-
// instead of requiring it, as we can with 8+.
57-
const pkg = await readFile(path.join(__dirname, '/node_modules/@elastic/elasticsearch/package.json'))
58-
const { version: pkgVersion } = JSON.parse(pkg.toString())
53+
const pkgVersion = helper.readPackageVersion(__dirname, '@elastic/elasticsearch')
5954

6055
const agent = helper.instrumentMockedAgent()
6156

test/versioned/google-genai/chat-completions.test.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77

88
const test = require('node:test')
99
const assert = require('node:assert')
10-
const fs = require('node:fs')
11-
const path = require('node:path')
12-
1310
const { removeModules } = require('../../lib/cache-buster')
1411
const { assertPackageMetrics, assertSegments, assertSpanKind, match } = require('../../lib/custom-assertions')
1512
const { assertChatCompletionMessages, assertChatCompletionSummary } = require('./common')
@@ -19,10 +16,7 @@ const helper = require('../../lib/agent_helper')
1916
const {
2017
AI: { GEMINI }
2118
} = require('../../../lib/metrics/names')
22-
// have to read and not require because @google/genai does not export the package.json
23-
const { version: pkgVersion } = JSON.parse(
24-
fs.readFileSync(path.join(__dirname, '/node_modules/@google/genai/package.json'))
25-
)
19+
const pkgVersion = helper.readPackageVersion(__dirname, '@google/genai')
2620
const { DESTINATIONS } = require('../../../lib/config/attribute-filter')
2721
const responses = require('./mock-responses')
2822
const TRACKING_METRIC = `Supportability/Nodejs/ML/Gemini/${pkgVersion}`

test/versioned/google-genai/embeddings.test.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77

88
const test = require('node:test')
99
const assert = require('node:assert')
10-
const fs = require('node:fs')
11-
const path = require('node:path')
12-
1310
const { removeModules } = require('../../lib/cache-buster')
1411
const { assertSegments, assertSpanKind, match } = require('../../lib/custom-assertions')
1512
const GoogleGenAIMockServer = require('./mock-server')
@@ -18,10 +15,7 @@ const helper = require('../../lib/agent_helper')
1815
const {
1916
AI: { GEMINI }
2017
} = require('../../../lib/metrics/names')
21-
// have to read and not require because @google/genai does not export the package.json
22-
const { version: pkgVersion } = JSON.parse(
23-
fs.readFileSync(path.join(__dirname, '/node_modules/@google/genai/package.json'))
24-
)
18+
const pkgVersion = helper.readPackageVersion(__dirname, '@google/genai')
2519
const { DESTINATIONS } = require('../../../lib/config/attribute-filter')
2620

2721
test.beforeEach(async (ctx) => {

test/versioned/mcp-sdk/client-stdio.test.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ const assert = require('node:assert')
1111
const { removeModules } = require('../../lib/cache-buster')
1212
const helper = require('../../lib/agent_helper')
1313
const { assertPackageMetrics, assertSegments, assertSpanKind } = require('../../lib/custom-assertions')
14-
const { readFile } = require('node:fs/promises')
15-
const path = require('node:path')
16-
1714
const {
1815
MCP
1916
} = require('../../../lib/metrics/names')
@@ -28,8 +25,7 @@ test.beforeEach(async (ctx) => {
2825

2926
const { Client } = require('@modelcontextprotocol/sdk/client/index.js')
3027
const { StdioClientTransport } = require('@modelcontextprotocol/sdk/client/stdio.js')
31-
const pkg = await readFile(path.join(__dirname, '/node_modules/@modelcontextprotocol/sdk/package.json'))
32-
const { version: pkgVersion } = JSON.parse(pkg.toString())
28+
const pkgVersion = helper.readPackageVersion(__dirname, '@modelcontextprotocol/sdk')
3329
ctx.nr.pkgVersion = pkgVersion
3430

3531
ctx.nr.transport = new StdioClientTransport({

test/versioned/mysql2/basic-pool.test.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,9 @@
55

66
'use strict'
77

8-
const fs = require('node:fs')
9-
const path = require('node:path')
108
const basicPoolTests = require('../mysql/basic-pool')
119
const constants = require('./constants')
10+
const helper = require('../../lib/agent_helper')
1211

13-
// exports are defined in newer versions so must read file directly
14-
let pkgVersion
15-
try {
16-
;({ version: pkgVersion } = require('mysql2/package'))
17-
} catch {
18-
;({ version: pkgVersion } = JSON.parse(
19-
fs.readFileSync(path.join(__dirname, '/node_modules/mysql2/package.json'))
20-
))
21-
}
22-
12+
const pkgVersion = helper.readPackageVersion(__dirname, 'mysql2')
2313
basicPoolTests({ factory: () => require('mysql2'), constants, pkgVersion })

test/versioned/mysql2/basic.test.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,12 @@
77

88
const basicTests = require('../mysql/basic')
99
const constants = require('./constants')
10-
const fs = require('node:fs')
11-
const path = require('node:path')
12-
13-
// certain versions of mysql2 lack an export for the package.json
14-
// so require('mysql2/package.json') will not work
15-
function getPkgVersion() {
16-
const resolvedPath = path.join(__dirname, '/node_modules/mysql2/package.json')
17-
const result = fs.readFileSync(resolvedPath)
18-
const { version } = JSON.parse(result.toString())
19-
return version
20-
}
10+
const helper = require('../../lib/agent_helper')
2111

2212
basicTests({
2313
lib: 'mysql2',
2414
factory: () => require('mysql2'),
25-
version: getPkgVersion(),
15+
version: helper.readPackageVersion(__dirname, 'mysql2'),
2616
poolFactory: () => require('generic-pool'),
2717
constants
2818
})

test/versioned/mysql2/promises.test.js

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,14 @@
66
'use strict'
77

88
const setup = require('../mysql/setup')
9-
const fs = require('fs')
109
const semver = require('semver')
1110
const test = require('node:test')
1211
const assert = require('node:assert')
13-
const path = require('node:path')
1412
const helper = require('../../lib/agent_helper')
1513
const params = require('../../lib/params')
1614
const urltils = require('../../../lib/util/urltils')
1715
const { DATABASE, USER, TABLE } = require('./constants')
18-
19-
// exports are defined in newer versions so must read file directly
20-
let pkgVersion
21-
try {
22-
;({ version: pkgVersion } = require('mysql2/package'))
23-
} catch {
24-
;({ version: pkgVersion } = JSON.parse(
25-
fs.readFileSync(path.join(__dirname, '/node_modules/mysql2/package.json'))
26-
))
27-
}
16+
const pkgVersion = helper.readPackageVersion(__dirname, 'mysql2')
2817

2918
test('mysql2 promises', { timeout: 30000 }, async (t) => {
3019
t.beforeEach(async (ctx) => {

test/versioned/openai/chat-completions-res-api.test.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
const test = require('node:test')
99
const assert = require('node:assert')
10-
const fs = require('node:fs')
11-
const path = require('node:path')
1210
const { tspl } = require('@matteo.collina/tspl')
1311

1412
const { removeModules } = require('../../lib/cache-buster')
@@ -19,9 +17,7 @@ const helper = require('../../lib/agent_helper')
1917
const {
2018
AI: { OPENAI }
2119
} = require('../../../lib/metrics/names')
22-
const { version: pkgVersion } = JSON.parse(
23-
fs.readFileSync(path.join(__dirname, '/node_modules/openai/package.json'))
24-
)
20+
const pkgVersion = helper.readPackageVersion(__dirname, 'openai')
2521
const { DESTINATIONS } = require('../../../lib/config/attribute-filter')
2622
const TRACKING_METRIC = `Supportability/Nodejs/ML/OpenAI/${pkgVersion}`
2723

test/versioned/openai/chat-completions.test.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
const test = require('node:test')
99
const assert = require('node:assert')
10-
const fs = require('node:fs')
11-
const path = require('node:path')
1210
const semver = require('semver')
1311

1412
const { removeModules } = require('../../lib/cache-buster')
@@ -19,10 +17,7 @@ const helper = require('../../lib/agent_helper')
1917
const {
2018
AI: { OPENAI }
2119
} = require('../../../lib/metrics/names')
22-
// have to read and not require because openai does not export the package.json
23-
const { version: pkgVersion } = JSON.parse(
24-
fs.readFileSync(path.join(__dirname, '/node_modules/openai/package.json'))
25-
)
20+
const pkgVersion = helper.readPackageVersion(__dirname, 'openai')
2621
const { DESTINATIONS } = require('../../../lib/config/attribute-filter')
2722
const TRACKING_METRIC = `Supportability/Nodejs/ML/OpenAI/${pkgVersion}`
2823

0 commit comments

Comments
 (0)