@@ -342,6 +342,120 @@ describe('action', () => {
342342 expect ( core . setOutput ) . toHaveBeenCalledWith ( 'sha' , commitSha ) ;
343343 } ) ;
344344
345+ it ( 'uses multi-line message for commit' , async ( ) => {
346+ const multiLineMessage =
347+ 'feat: add new feature\n\nThis is the body\nwith multiple lines' ;
348+ const commitSha = 'commit-sha' ;
349+
350+ mockGetInput ( { message : multiLineMessage , token } ) ;
351+ mockGetBooleanInput ( { } ) ;
352+ vi . mocked ( lib . getHeadRef ) . mockResolvedValue ( 'main' ) ;
353+ vi . mocked ( lib . getHeadSha ) . mockResolvedValue ( 'head-sha' ) ;
354+ vi . mocked ( lib . getHeadTreeHash ) . mockResolvedValue ( 'head-tree-hash' ) ;
355+ vi . mocked ( lib . getStagedFiles ) . mockResolvedValue ( stagedFiles ) ;
356+ vi . mocked ( createTree ) . mockResolvedValue ( { data : { sha : 'tree-sha' } } ) ;
357+ vi . mocked ( createCommit ) . mockResolvedValue ( { data : { sha : commitSha } } ) ;
358+ vi . mocked ( updateRef ) . mockResolvedValue ( { data : { } } ) ;
359+
360+ await main . run ( ) ;
361+ expect ( runSpy ) . toHaveReturned ( ) ;
362+
363+ expect ( createCommit ) . toHaveBeenCalledWith (
364+ expect . objectContaining ( {
365+ message : multiLineMessage
366+ } )
367+ ) ;
368+
369+ expect ( core . setOutput ) . toHaveBeenCalledWith ( 'message' , multiLineMessage ) ;
370+ } ) ;
371+
372+ it ( 'uses commit-author with valid format' , async ( ) => {
373+ const commitAuthor = 'John Doe <john@example.com>' ;
374+ const commitSha = 'commit-sha' ;
375+
376+ mockGetInput ( { message, token, 'commit-author' : commitAuthor } ) ;
377+ mockGetBooleanInput ( { } ) ;
378+ vi . mocked ( lib . getHeadRef ) . mockResolvedValue ( 'main' ) ;
379+ vi . mocked ( lib . getHeadSha ) . mockResolvedValue ( 'head-sha' ) ;
380+ vi . mocked ( lib . getHeadTreeHash ) . mockResolvedValue ( 'head-tree-hash' ) ;
381+ vi . mocked ( lib . getStagedFiles ) . mockResolvedValue ( stagedFiles ) ;
382+ vi . mocked ( createTree ) . mockResolvedValue ( { data : { sha : 'tree-sha' } } ) ;
383+ vi . mocked ( createCommit ) . mockResolvedValue ( { data : { sha : commitSha } } ) ;
384+ vi . mocked ( updateRef ) . mockResolvedValue ( { data : { } } ) ;
385+
386+ await main . run ( ) ;
387+ expect ( runSpy ) . toHaveReturned ( ) ;
388+
389+ expect ( createCommit ) . toHaveBeenCalledWith (
390+ expect . objectContaining ( {
391+ author : {
392+ name : 'John Doe' ,
393+ email : 'john@example.com'
394+ }
395+ } )
396+ ) ;
397+ } ) ;
398+
399+ it ( 'warns and ignores invalid commit-author format' , async ( ) => {
400+ const commitAuthor = 'invalid-format' ;
401+ const commitSha = 'commit-sha' ;
402+
403+ mockGetInput ( { message, token, 'commit-author' : commitAuthor } ) ;
404+ mockGetBooleanInput ( { } ) ;
405+ vi . mocked ( lib . getHeadRef ) . mockResolvedValue ( 'main' ) ;
406+ vi . mocked ( lib . getHeadSha ) . mockResolvedValue ( 'head-sha' ) ;
407+ vi . mocked ( lib . getHeadTreeHash ) . mockResolvedValue ( 'head-tree-hash' ) ;
408+ vi . mocked ( lib . getStagedFiles ) . mockResolvedValue ( stagedFiles ) ;
409+ vi . mocked ( createTree ) . mockResolvedValue ( { data : { sha : 'tree-sha' } } ) ;
410+ vi . mocked ( createCommit ) . mockResolvedValue ( { data : { sha : commitSha } } ) ;
411+ vi . mocked ( updateRef ) . mockResolvedValue ( { data : { } } ) ;
412+
413+ await main . run ( ) ;
414+ expect ( runSpy ) . toHaveReturned ( ) ;
415+
416+ expect ( core . warning ) . toHaveBeenCalledWith (
417+ 'Invalid commit-author format: "invalid-format". Expected format: "Name <email>". Ignoring author.'
418+ ) ;
419+ expect ( createCommit ) . toHaveBeenCalledWith (
420+ expect . not . objectContaining ( {
421+ author : expect . anything ( )
422+ } )
423+ ) ;
424+ } ) ;
425+
426+ it ( 'uses multi-line message with commit-author' , async ( ) => {
427+ const multiLineMessage = 'feat: add feature\n\nBody text here' ;
428+ const commitAuthor = 'Jane Smith <jane@example.com>' ;
429+ const commitSha = 'commit-sha' ;
430+
431+ mockGetInput ( {
432+ message : multiLineMessage ,
433+ token,
434+ 'commit-author' : commitAuthor
435+ } ) ;
436+ mockGetBooleanInput ( { } ) ;
437+ vi . mocked ( lib . getHeadRef ) . mockResolvedValue ( 'main' ) ;
438+ vi . mocked ( lib . getHeadSha ) . mockResolvedValue ( 'head-sha' ) ;
439+ vi . mocked ( lib . getHeadTreeHash ) . mockResolvedValue ( 'head-tree-hash' ) ;
440+ vi . mocked ( lib . getStagedFiles ) . mockResolvedValue ( stagedFiles ) ;
441+ vi . mocked ( createTree ) . mockResolvedValue ( { data : { sha : 'tree-sha' } } ) ;
442+ vi . mocked ( createCommit ) . mockResolvedValue ( { data : { sha : commitSha } } ) ;
443+ vi . mocked ( updateRef ) . mockResolvedValue ( { data : { } } ) ;
444+
445+ await main . run ( ) ;
446+ expect ( runSpy ) . toHaveReturned ( ) ;
447+
448+ expect ( createCommit ) . toHaveBeenCalledWith (
449+ expect . objectContaining ( {
450+ message : multiLineMessage ,
451+ author : {
452+ name : 'Jane Smith' ,
453+ email : 'jane@example.com'
454+ }
455+ } )
456+ ) ;
457+ } ) ;
458+
345459 it ( 'handles generic errors' , async ( ) => {
346460 mockGetInput ( { message, token } ) ;
347461 vi . mocked ( lib . getStagedFiles ) . mockImplementation ( ( ) => {
0 commit comments