@@ -2245,5 +2245,144 @@ describe('changelog-validator', () => {
22452245 ) ;
22462246 expect ( mockChangelog . addChange ) . toHaveBeenCalled ( ) ;
22472247 } ) ;
2248+
2249+ it ( 'handles renamed packages when updating existing entries and adding new ones' , async ( ) => {
2250+ const renamedPackageChanges = {
2251+ 'json-rpc-middleware-stream' : {
2252+ packageName : '@metamask/json-rpc-middleware-stream' ,
2253+ dependencyChanges : [
2254+ {
2255+ package : 'json-rpc-middleware-stream' ,
2256+ dependency : '@metamask/json-rpc-engine' ,
2257+ type : 'dependencies' as const ,
2258+ oldVersion : '^10.1.1' ,
2259+ newVersion : '^10.1.2' ,
2260+ } ,
2261+ {
2262+ package : 'json-rpc-middleware-stream' ,
2263+ dependency : '@metamask/base-controller' ,
2264+ type : 'dependencies' as const ,
2265+ oldVersion : '^9.0.0' ,
2266+ newVersion : '^9.1.0' ,
2267+ } ,
2268+ ] ,
2269+ } ,
2270+ } ;
2271+
2272+ const existingEntry =
2273+ 'Bump `@metamask/json-rpc-engine` from `^10.1.1` to `^10.1.0` ([#1234](https://github.com/example-org/example-repo/pull/1234))' ;
2274+
2275+ const writeFileSpy = jest . spyOn ( fsModule , 'writeFile' ) ;
2276+
2277+ when ( jest . spyOn ( fsModule , 'fileExists' ) )
2278+ . calledWith (
2279+ '/path/to/project/packages/json-rpc-middleware-stream/CHANGELOG.md' ,
2280+ )
2281+ . mockResolvedValue ( true )
2282+ . calledWith (
2283+ '/path/to/project/packages/json-rpc-middleware-stream/package.json' ,
2284+ )
2285+ . mockResolvedValue ( true ) ;
2286+
2287+ when ( jest . spyOn ( fsModule , 'readFile' ) )
2288+ . calledWith (
2289+ '/path/to/project/packages/json-rpc-middleware-stream/CHANGELOG.md' ,
2290+ )
2291+ . mockResolvedValueOnce (
2292+ `# Changelog\n## [Unreleased]\n- ${ existingEntry } ` ,
2293+ )
2294+ . mockResolvedValueOnce (
2295+ `# Changelog\n## [Unreleased]\n- Bump \`@metamask/json-rpc-engine\` from \`^10.1.1\` to \`^10.1.2\` ([#1234](https://github.com/example-org/example-repo/pull/1234), [#5678](https://github.com/example-org/example-repo/pull/5678))` ,
2296+ )
2297+ . calledWith (
2298+ '/path/to/project/packages/json-rpc-middleware-stream/package.json' ,
2299+ )
2300+ . mockResolvedValue (
2301+ JSON . stringify ( {
2302+ name : '@metamask/json-rpc-middleware-stream' ,
2303+ scripts : {
2304+ 'changelog:update' :
2305+ '../../scripts/update-changelog.sh @metamask/json-rpc-middleware-stream --tag-prefix-before-package-rename json-rpc-middleware-stream@ --version-before-package-rename 5.0.1' ,
2306+ } ,
2307+ } ) ,
2308+ ) ;
2309+
2310+ jest . spyOn ( packageModule , 'formatChangelog' ) . mockResolvedValue ( '' ) ;
2311+
2312+ when ( jest . spyOn ( packageManifestModule , 'readPackageManifest' ) )
2313+ . calledWith (
2314+ '/path/to/project/packages/json-rpc-middleware-stream/package.json' ,
2315+ )
2316+ . mockResolvedValue ( {
2317+ unvalidated : {
2318+ name : '@metamask/json-rpc-middleware-stream' ,
2319+ scripts : {
2320+ 'changelog:update' :
2321+ '../../scripts/update-changelog.sh @metamask/json-rpc-middleware-stream --tag-prefix-before-package-rename json-rpc-middleware-stream@ --version-before-package-rename 5.0.1' ,
2322+ } ,
2323+ } ,
2324+ validated : buildMockManifest ( {
2325+ name : '@metamask/json-rpc-middleware-stream' ,
2326+ } ) ,
2327+ } ) ;
2328+
2329+ const mockChangelog1 = {
2330+ getUnreleasedChanges : ( ) => ( { Changed : [ existingEntry ] } ) ,
2331+ } ;
2332+
2333+ const mockChangelog2 = {
2334+ getUnreleasedChanges : ( ) => ( {
2335+ Changed : [
2336+ 'Bump `@metamask/json-rpc-engine` from `^10.1.1` to `^10.1.2` ([#1234](https://github.com/example-org/example-repo/pull/1234), [#5678](https://github.com/example-org/example-repo/pull/5678))' ,
2337+ ] ,
2338+ } ) ,
2339+ addChange : jest . fn ( ) ,
2340+ toString : jest . fn ( ) . mockResolvedValue ( 'Final updated changelog' ) ,
2341+ } ;
2342+
2343+ ( parseChangelog as jest . Mock )
2344+ . mockReturnValueOnce ( mockChangelog1 )
2345+ . mockReturnValueOnce ( mockChangelog2 ) ;
2346+
2347+ await updateChangelogs ( renamedPackageChanges , {
2348+ projectRoot : '/path/to/project' ,
2349+ prNumber : '5678' ,
2350+ repoUrl : 'https://github.com/example-org/example-repo' ,
2351+ stdout,
2352+ stderr,
2353+ } ) ;
2354+
2355+ const packageRename = {
2356+ tagPrefixBeforeRename : 'json-rpc-middleware-stream@' ,
2357+ versionBeforeRename : '5.0.1' ,
2358+ } ;
2359+
2360+ // Verify both parseChangelog calls include packageRename
2361+ expect ( parseChangelog ) . toHaveBeenCalledTimes ( 2 ) ;
2362+ expect ( parseChangelog ) . toHaveBeenNthCalledWith ( 1 , {
2363+ changelogContent : `# Changelog\n## [Unreleased]\n- ${ existingEntry } ` ,
2364+ repoUrl : 'https://github.com/example-org/example-repo' ,
2365+ tagPrefix : '@metamask/json-rpc-middleware-stream@' ,
2366+ formatter : expect . any ( Function ) ,
2367+ packageRename,
2368+ } ) ;
2369+ expect ( parseChangelog ) . toHaveBeenNthCalledWith ( 2 , {
2370+ changelogContent :
2371+ '# Changelog\n## [Unreleased]\n- Bump `@metamask/json-rpc-engine` from `^10.1.1` to `^10.1.2` ([#1234](https://github.com/example-org/example-repo/pull/1234), [#5678](https://github.com/example-org/example-repo/pull/5678))' ,
2372+ repoUrl : 'https://github.com/example-org/example-repo' ,
2373+ tagPrefix : '@metamask/json-rpc-middleware-stream@' ,
2374+ formatter : expect . any ( Function ) ,
2375+ packageRename,
2376+ } ) ;
2377+
2378+ // Verify new entry was added
2379+ expect ( mockChangelog2 . addChange ) . toHaveBeenCalledWith ( {
2380+ category : 'Changed' ,
2381+ description : expect . stringContaining ( '@metamask/base-controller' ) ,
2382+ } ) ;
2383+
2384+ // Verify writeFile was called (once for update, once for final)
2385+ expect ( writeFileSpy ) . toHaveBeenCalledTimes ( 2 ) ;
2386+ } ) ;
22482387 } ) ;
22492388} ) ;
0 commit comments