Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7cd38ee
fix(Test-MyDebug): correct trace condition logic
rulasg Mar 7, 2026
4f59783
feat(project-item): add assignee display in Show-ProjectItem function
rulasg Mar 7, 2026
c0cb651
refactor(Invoke-GetItem): simplify GraphQL request by removing unnece…
rulasg Mar 7, 2026
6f9e032
fix(Resolve-ProjectItem): add sanity check for item database consistency
rulasg Mar 7, 2026
4963cab
feat(Update-ProjectItemsWithIntegration): add CommitMaxItems paramete…
rulasg Mar 7, 2026
3b884b7
wip - try improve performance caching fields
rulasg Mar 7, 2026
a0920b0
feat(items): add normalization for project item titles
rulasg Mar 7, 2026
426125c
Merge branch 'improve-performance-fields' into rulasg/issue208
rulasg Mar 7, 2026
80bcef8
refactor(Update-ProjectItemsWithIntegration): remove unnecessary proj…
rulasg Mar 7, 2026
e44f80c
feat(database): add Get-DatabaseKey function for key generation
rulasg Mar 7, 2026
5b86cd0
refactor(database): replace Get-DatabaseKey with Get-ProjectDatabaseK…
rulasg Mar 7, 2026
7a64873
fix(cache): improve field cache locking mechanism and management to a…
rulasg Mar 7, 2026
3965403
Merge pull request #209 from rulasg/rulasg/issue208
rulasg Mar 7, 2026
fcd4e16
refactor(logging): enhance debug logging functionality and improve se…
rulasg Mar 8, 2026
542f029
refactor(environment): rename environment cache keys for consistency
rulasg Mar 8, 2026
0a4d3f6
refactor(tests): rename environment item functions for consistency
rulasg Mar 8, 2026
185af5f
fix(cache): improve cache lock handling and add debug messages for cl…
rulasg Mar 8, 2026
6141aaa
refactor(database): enhance debug logging for database operations
rulasg Mar 8, 2026
687d920
feat(get-Project): create memory caching mechanism
rulasg Mar 8, 2026
f7830b3
fix(Update-Project): replace incremental query concatenation with rec…
rulasg Mar 8, 2026
3dd6d99
fix(test): update repository filename format in test assertion
rulasg Mar 8, 2026
136a64d
refactor(test): optimize project database test by using cached projec…
rulasg Mar 8, 2026
2fd55dd
fix(get-Project): add force parameter to project update call
rulasg Mar 9, 2026
76d0c39
fix(Update-Project): remove unnecessary query parameter in database u…
rulasg Mar 9, 2026
1b93299
feat(projectdatabase): project cache to projectdatabase
rulasg Mar 9, 2026
c5a24c7
fix(Save-ProjectV2toDatabase): change Fields parameter type from Obje…
rulasg Mar 9, 2026
b7bcf46
fix(mockdatabase): update cachelock file naming convention
rulasg Mar 9, 2026
a642a37
refactor(Update-ProjectDatabase): retain existing items when skipping…
rulasg Mar 9, 2026
15a240e
refactor(Get-ProjectFields): remove caching functions and streamline …
rulasg Mar 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Test/private/MockCall_Project700.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ function Get-Mock_Project_700 {
$project.title = $pActual.title
$project.number = $pActual.number
$project.url = $pActual.url
$project.cacheFileName = "$($pActual.owner.login)_$($pActual.number).json"
$project.cacheFileName = "db-$($pActual.owner.login)-$($pActual.number)-project.json"

# Fields info
$project.fields = @{}
Expand Down
5 changes: 5 additions & 0 deletions Test/private/mockdatabase.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,13 @@ function Get-Mock_DatabaseRootPath{
}

function Update-Mock_DatabaseFileWithReplace([string]$FileName, [string]$SearchString, [string]$ReplaceString){

$dbpath = Get-Mock_DatabaseRootPath | Join-Path -ChildPath $FileName
$content = Get-Content $dbpath
$content = $content -replace $SearchString, $ReplaceString
$content | Set-Content $dbpath

# Reset the memory cache deleting the cachelock file
$cachelock = $dbpath -replace '\.json$', '-lock.json'
Remove-Item -Path $cachelock -Force -ErrorAction SilentlyContinue
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
{
"data": {
"node": {
"id": "PVTI_lADOAlIw4c4BCe3Vzgeio4o",
"type": "ISSUE",
"fullDatabaseId": "128099210",
"project": {
"id": "PVT_kwDOAlIw4c4BCe3V",
"url": "https://github.com/orgs/octodemo/projects/700"
},
"content": {
"__typename": "Issue",
"id": "I_kwDOPrRnkc7KkwSq",
"body": "Body of issue for development",
"title": "[RULaSG-DeV-1] Issue [RULASG-DEV-1] for [value between] development",
"updatedAt": "2025-10-15T21:30:02Z",
"createdAt": "2025-09-09T14:01:17Z",
"number": 26,
"url": "https://github.com/octodemo/rulasg-dev-1/issues/26",
"state": "OPEN",
"repository": {
"name": "rulasg-dev-1",
"owner": {
"login": "octodemo"
}
},
"comments": {
"totalCount": 3,
"nodes": [
{
"createdAt": "2025-09-23T17:51:06Z",
"updatedAt": "2025-10-15T21:29:45Z",
"url": "https://github.com/octodemo/rulasg-dev-1/issues/26#issuecomment-3324995787",
"body": "Sample comment 1",
"fullDatabaseId": "3324995787",
"author": {
"login": "rulasg"
}
},
{
"createdAt": "2025-09-24T08:29:13Z",
"updatedAt": "2025-10-15T21:29:55Z",
"url": "https://github.com/octodemo/rulasg-dev-1/issues/26#issuecomment-3327194303",
"body": "Sample comment 2",
"fullDatabaseId": "3327194303",
"author": {
"login": "rulasg"
}
},
{
"createdAt": "2025-09-30T05:42:49Z",
"updatedAt": "2025-10-15T21:30:02Z",
"url": "https://github.com/octodemo/rulasg-dev-1/issues/26#issuecomment-3350059109",
"body": "Sample comment 3",
"fullDatabaseId": "3350059109",
"author": {
"login": "rulasg"
}
}
]
}
},
"fieldValues": {
"nodes": [
{
"__typename": "ProjectV2ItemFieldRepositoryValue",
"repository": {
"url": "https://github.com/octodemo/rulasg-dev-1"
},
"field": {
"__typename": "ProjectV2Field",
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rg-k",
"name": "Repository",
"dataType": "REPOSITORY"
}
},
{
"__typename": "ProjectV2ItemFieldMilestoneValue",
"milestone": {
"title": "Milestone 3: Quality and Deployment",
"description": "Testing, documentation, and deployment pipeline setup",
"dueOn": "2025-10-18T00:00:00Z"
},
"field": {
"__typename": "ProjectV2Field",
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rg-g",
"name": "Milestone",
"dataType": "MILESTONE"
}
},
{
"__typename": "ProjectV2ItemFieldTextValue",
"text": "[RULaSG-DeV-1] Issue [RULASG-DEV-1] for [value between] development",
"field": {
"__typename": "ProjectV2Field",
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rg-M",
"name": "Title",
"dataType": "TITLE"
}
},
{
"__typename": "ProjectV2ItemFieldSingleSelectValue",
"name": "In Progress",
"field": {
"__typename": "ProjectV2SingleSelectField",
"id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U",
"name": "Status",
"dataType": "SINGLE_SELECT",
"options": [
{
"id": "f75ad846",
"name": "Todo"
},
{
"id": "47fc9ee4",
"name": "In Progress"
},
{
"id": "98236657",
"name": "Done"
}
]
}
},
{
"__typename": "ProjectV2ItemFieldNumberValue",
"number": 333.0,
"field": {
"__typename": "ProjectV2Field",
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rhjU",
"name": "field-number",
"dataType": "NUMBER"
}
},
{
"__typename": "ProjectV2ItemFieldIterationValue",
"title": "field-iteration 3",
"startDate": "2025-10-05",
"duration": 14,
"field": {
"__typename": "ProjectV2IterationField",
"id": "PVTIF_lADOAlIw4c4BCe3Vzg0rhqQ",
"name": "field-iteration",
"dataType": "ITERATION"
}
},
{
"__typename": "ProjectV2ItemFieldTextValue",
"text": "text3",
"field": {
"__typename": "ProjectV2Field",
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rhko",
"name": "field-text",
"dataType": "TEXT"
}
},
{
"__typename": "ProjectV2ItemFieldSingleSelectValue",
"name": "option-3",
"field": {
"__typename": "ProjectV2SingleSelectField",
"id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rhno",
"name": "field-singleselect",
"dataType": "SINGLE_SELECT",
"options": [
{
"id": "7d96a925",
"name": "option-1"
},
{
"id": "cd02c585",
"name": "option-2"
},
{
"id": "6b66c93a",
"name": "option-3"
}
]
}
}
]
}
}
}
}
6 changes: 3 additions & 3 deletions Test/public/environment/projectParameters.test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ function Test_SetProjectParameters_SUCCESS{
Set-ProjectParameters -Owner $owner -ProjectNumber $projectNumber

$v = @{
Owner = @{value =$owner ; file = $($dbPath | Join-Path -Child "EnvironmentCache_Owner.json")}
ProjectNumber = @{value =$projectNumber ; file = $($dbPath | Join-Path -Child "EnvironmentCache_ProjectNumber.json")}
ProjectTitle = @{value =$projectTitle ; file = $($dbPath | Join-Path -Child "EnvironmentCache_ProjectTitle.json")}
Owner = @{value =$owner ; file = $($dbPath | Join-Path -Child "env-owner.json")}
ProjectNumber = @{value =$projectNumber ; file = $($dbPath | Join-Path -Child "env-ProjectNumber.json")}
ProjectTitle = @{value =$projectTitle ; file = $($dbPath | Join-Path -Child "env-ProjectTitle.json")}
}

$v.keys | ForEach-Object {
Expand Down
51 changes: 51 additions & 0 deletions Test/public/items/edit_project_item.test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,57 @@
Assert-AreEqual -Expected $newTitle -Presented $result.$itemId.title.Value
}

function Test_EditProjectItems_NormalizeTitle_AlreadyNormalized{

# Arrange
$p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number
MockCall_GetProject $p -skipItems
$i= $p.issue ; $itemId = $i.id

MockCall_GetProject $p -SkipItems

$newTitle = "[rulasg-dev-1] Issue [rulasg-dev-1] for [value between] development"

# Mock the direct call for item
MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId-Normalized.json"
# Act
Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -NormalizeTitle

# Assert
$result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber

Assert-Count -Expected 1 -Presented $result.$itemId.Keys
Assert-AreEqual -Expected $newTitle -Presented $result.$itemId.title.Value
}

function Test_NormalizedTitle{

Invoke-PrivateContext{
$cases = @(
@{item = @{Title= "Test"; repositoryName = "rulasg-dev-1"}; expected = "[rulasg-dev-1] Test"}
@{item = @{Title= "[rulasg-dev-1] Test"; repositoryName = "rulasg-dev-1"}; expected = "[rulasg-dev-1] Test"}

Check notice

Code scanning / PSScriptAnalyzer

Line has trailing whitespace Note

Line has trailing whitespace
@{item = @{Title= "[BBVA] Test"; repositoryName = "bBva"}; expected = "[bBva] Test"}

Check notice

Code scanning / PSScriptAnalyzer

Line has trailing whitespace Note

Line has trailing whitespace
@{item = @{Title= "Test [rulasg-dev-1]"; repositoryName = "rulasg-dev-1"}; expected = "Test [rulasg-dev-1]"}

Check notice

Code scanning / PSScriptAnalyzer

Line has trailing whitespace Note

Line has trailing whitespace
@{item = @{Title= "Test [rulasg-dEv-1]"; repositoryName = "rulasg-dev-1"}; expected = "Test [rulasg-dev-1]"}

@{item = @{Title= "[RULaSG-DeV-1] Test"; repositoryName = "rulasg-dev-1"}; expected = "[rulasg-dev-1] Test"}
@{item = @{Title= "[RULaSG-DeV-1] Test [value between] development"; repositoryName = "rulasg-dev-1"}; `
expected = "[rulasg-dev-1] Test [value between] development"}
@{item = @{Title= "[RULaSG-DeV-1] Issue [RULASG-DEV-1] for [value between] development"; repositoryName = "rulasg-dev-1"}; `
expected = "[rulasg-dev-1] Issue [rulasg-dev-1] for [value between] development"}
)

foreach($case in $cases){
$result = Get-NormalizedTitle -Item $case.item
Assert-AreEqual -Expected $case.expected -Presented $result
}

}
}

function Test_EditProjectItems_OpenInBrowser{

# Arrange
Expand Down
24 changes: 12 additions & 12 deletions Test/public/project/updateprojectrecent.test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ function Test_UpdateProject_SetsRecentUpdateToday_WhenQueryIsNull{
# Assert
Assert-IsTrue $result

# Verify Set-EnvItem_Last_RecentUpdate_Today was called - check the env item is set to today
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
# Verify Set-EnvProjectLastUpdate_Today was called - check the env item is set to today
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }

Assert-AreEqual -Expected $today -Presented $envValue -Comment "Set-EnvItem_Last_RecentUpdate_Today should set env item to today when Query is null"
Assert-AreEqual -Expected $today -Presented $envValue -Comment "Set-EnvProjectLastUpdate_Today should set env item to today when Query is null"
}

function Test_UpdateProjectRecent_FirstCAll_SetRecentUpdate_toToday{
Expand All @@ -34,8 +34,8 @@ function Test_UpdateProjectRecent_FirstCAll_SetRecentUpdate_toToday{
# Assert
Assert-IsTrue $result

# Verify Set-EnvItem_Last_RecentUpdate_Today was NOT called - env item should be null/empty
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
# Verify Set-EnvProjectLastUpdate_Today was NOT called - env item should be null/empty
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
Assert-AreEqual -Expected $today -Presented $envValue

}
Expand All @@ -50,8 +50,8 @@ function Test_UpdateProjectRecent_UpdateBasedOn_FirstTime{

$result = Update-ProjectRecent -Owner $owner -ProjectNumber $projectNumber

## Assert check that the EnvironmentCache_Last_RecentUpdate_octodemo_700.json is set to today
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
## Assert check that the env-Last_RecentUpdate_octodemo_700.json is set to today
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
Assert-AreEqual -Expected $today -Presented $envValue

}
Expand All @@ -64,8 +64,8 @@ function Test_UpdateProjectRecent_UpdateBasedOn_SetToToday{
# Act - use the mock to run the project full sync to set the last recent update to today
MockCall_GetProject_700 -Cache

## Assert check that the EnvironmentCache_Last_RecentUpdate_octodemo_700.json is set to today
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
## Assert check that the env-Last_RecentUpdate_octodemo_700.json is set to today
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
Assert-AreEqual -Expected $today -Presented $envValue

# Reset Mocks to ensure no mocks functions left from caching project
Expand All @@ -91,8 +91,8 @@ function Test_UpdateProjectRecent_UpdateBasedOn_SetToTehPast{
# Act - use the mock to run the project full sync to set the last recent update to today
MockCall_GetProject_700 -Cache

## Assert check that the EnvironmentCache_Last_RecentUpdate_octodemo_700.json is set to today
Invoke-PrivateContext { Set-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 -Value "2024-02-18" }
## Assert check that the env-Last_RecentUpdate_octodemo_700.json is set to today
Invoke-PrivateContext { Set-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 -Value "2024-02-18" }


# Reset Mocks to ensure no mocks functions left from caching project
Expand All @@ -110,6 +110,6 @@ function Test_UpdateProjectRecent_UpdateBasedOn_SetToTehPast{
Assert-IsTrue $result

# ASsert that value has changed to today
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
Assert-AreEqual -Expected $today -Presented $envValue
}
18 changes: 11 additions & 7 deletions Test/public/projectDatabase/project_database.test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -27,25 +27,29 @@
function Test_SaveProjectDatabase_Safe_PrivateCall{

$p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number
MockCall_GetProject_700
MockCall_GetProject_700 -Cache

Invoke-PrivateContext {

$Owner = "octodemo" ; $ProjectNumber = 700
# Cache the project
$prj1 = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
# $prj1 = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber

# modify the project
$db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber ; Save-ProjectDatabaseSafe -Database $db

# $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
$db1 = Get-ProjectFromDatabase -Owner $Owner -ProjectNumber $ProjectNumber
$dbClone = $db1 | ConvertTo-Json | ConvertFrom-Json
Save-ProjectDatabaseSafe -Database $db1

Check notice

Code scanning / PSScriptAnalyzer

Line has trailing whitespace Note

Line has trailing whitespace
# Check that safeId has changed
$prj2 = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
Assert-AreNotEqual -Presented $prj2.safeId -Expected $prj1.safeId
$db2 = Get-ProjectFromDatabase -Owner $Owner -ProjectNumber $ProjectNumber
# $prj2 = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
Assert-AreNotEqual -Presented $dbClone.safeId -Expected $db2.safeId

## When saving again as prj1 that has been saved before it will throw
$hasThrow = $false
try{
Save-ProjectDatabaseSafe -Database $prj1
Save-ProjectDatabaseSafe -Database $dbClone
} catch {
$hasThrow = $true
}
Expand Down
2 changes: 1 addition & 1 deletion Test/public/repository/get-repository.test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ function Test_GetRepository{

# Assert repo cache created
$dbpath = get-Mock_DatabaseRootPath
$dbname = "$($r.owner)-$($r.name).json"
$dbname = "repo-$($r.owner)-$($r.name).json"

Assert-ItemExist -Path (Join-Path -Path $dbpath -ChildPath $dbname)

Expand Down
Loading
Loading