@@ -48,11 +48,21 @@ def test_workflow_is_manual_and_binds_one_explicit_successful_qar_artifact(self)
4848 self .assertIn ("--source-artifact-id \" ${QAR_ARTIFACT_ID}\" " , workflow )
4949 self .assertIn ("--source-artifact-sha256 \" ${M0_SOURCE_SNAPSHOT_SHA256}\" " , workflow )
5050
51- def test_workflow_uses_only_dedicated_read_and_publish_credentials (self ):
51+ def test_workflow_uses_only_scoped_app_reader_and_publish_credentials (self ):
5252 workflow = WORKFLOW .read_text (encoding = "utf-8" )
5353
54- self .assertIn ("QAR_ARTIFACT_READ_TOKEN: ${{ secrets.QAR_ARTIFACT_READ_TOKEN }}" , workflow )
55- self .assertIn ("GH_TOKEN=\" ${QAR_ARTIFACT_READ_TOKEN}\" gh api" , workflow )
54+ self .assertIn ("uses: actions/create-github-app-token@v3" , workflow )
55+ self .assertIn ("id: qar-artifact-reader" , workflow )
56+ self .assertIn ("app-id: ${{ vars.QAR_ARTIFACT_READER_APP_ID }}" , workflow )
57+ self .assertIn ("private-key: ${{ secrets.QAR_ARTIFACT_READER_APP_PRIVATE_KEY }}" , workflow )
58+ self .assertIn ("owner: QuantStrategyLab" , workflow )
59+ self .assertIn ("repositories: QuantAdvisorResearch" , workflow )
60+ self .assertIn ("permission-actions: read" , workflow )
61+ self .assertNotIn ("QAR_ARTIFACT_READ_TOKEN" , workflow )
62+ self .assertEqual (
63+ workflow .count ("GH_TOKEN: ${{ steps.qar-artifact-reader.outputs.token }}" ),
64+ 3 ,
65+ )
5666 self .assertIn (
5767 "QSL_M0_RESEARCH_LEDGER_PUBLISH_URL: ${{ vars.M0_RESEARCH_SYNC_URL }}" ,
5868 workflow ,
@@ -72,20 +82,19 @@ def test_workflow_uses_only_dedicated_read_and_publish_credentials(self):
7282 self .assertNotIn ("${QSL_M0_RESEARCH_LEDGER_PUBLISH_URL}" , workflow )
7383 self .assertNotIn ("${QSL_M0_RESEARCH_LEDGER_PUBLISH_TOKEN}" , workflow )
7484
75- read_token_steps = workflow .count ("QAR_ARTIFACT_READ_TOKEN: ${{ secrets.QAR_ARTIFACT_READ_TOKEN }}" )
76- self .assertEqual (read_token_steps , 3 )
7785 self .assertEqual (workflow .count ("QSL_M0_RESEARCH_LEDGER_PUBLISH_URL: ${{ vars.M0_RESEARCH_SYNC_URL }}" ), 1 )
7886 self .assertEqual (workflow .count ("QSL_M0_RESEARCH_LEDGER_PUBLISH_TOKEN: ${{ secrets.M0_RESEARCH_SYNC_TOKEN }}" ), 1 )
7987 build_step = workflow .split ("- name: Build and publish verified no-order M0 ledger" , maxsplit = 1 )[1 ]
80- self .assertNotIn ("QAR_ARTIFACT_READ_TOKEN" , build_step )
88+ self .assertNotIn ("qar-artifact-reader.outputs.token" , build_step )
89+ self .assertNotIn ("QAR_ARTIFACT_READER_APP_PRIVATE_KEY" , build_step )
8190
8291 def test_sensitive_values_are_not_emitted_by_workflow_commands (self ):
8392 workflow = WORKFLOW .read_text (encoding = "utf-8" )
8493
8594 for line in workflow .splitlines ():
8695 self .assertFalse (
8796 re .search (
88- r"\b(?:echo|printf)\b.*\$\{?(?:QAR_ARTIFACT_READ_TOKEN |QSL_M0_RESEARCH_LEDGER_PUBLISH_(?:URL|TOKEN))" ,
97+ r"\b(?:echo|printf)\b.*\$\{?(?:QAR_ARTIFACT_READER_APP_PRIVATE_KEY |QSL_M0_RESEARCH_LEDGER_PUBLISH_(?:URL|TOKEN))" ,
8998 line ,
9099 ),
91100 line ,
0 commit comments