Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
8f22710
AI generated removal of the big sur compatibility logic. Needs vetted…
watkyn Jan 29, 2026
bcb3a12
big-sur story/JPCFM-5531 Add minor changes to update minimum supporte…
jjpritzl Mar 10, 2026
5efa226
big-sur story/JPCFM-5531 Remove swiftlint disable call due to reduced…
jjpritzl Mar 10, 2026
93ed2be
big-sur story/JPCFM-5531 Add Copilot suggestion for generating test r…
jjpritzl Mar 13, 2026
dc8df63
big-sur story/JPCFM-5531 Add Copilot refactor to loadExecutable function
jjpritzl Mar 13, 2026
343399a
big-sur story/JPCFM-5531 Remove code coverage addition
jjpritzl Mar 24, 2026
1e0027e
added detailed plan for getting to swift 6 in stages
watkyn Mar 26, 2026
0a14250
Initial plan
Copilot Mar 26, 2026
6741832
Stage 2: Convert NetworkAuthManager from actor to class
Copilot Mar 26, 2026
9256bd0
Stage 3a: Remove DispatchQueue.main.async wrappers
Copilot Mar 26, 2026
7b77113
Stage 3b: Convert UploadManager to async throws
Copilot Mar 26, 2026
a64ed56
Stage 3c: Convert Model.loadExecutable to direct return
Copilot Mar 26, 2026
542a287
Stage 3d: Convert TCCProfileImporter to direct return
Copilot Mar 26, 2026
f38e4fc
Stage 4: Add @concurrent for background I/O
Copilot Mar 26, 2026
23583a4
Stage 5: Enable Swift 6 language mode
Copilot Mar 26, 2026
c24c1e9
create-separate story/JPCFM-5564 Fix failing build and tests
jjpritzl Mar 31, 2026
24d36a5
create-separate story/JPCFM-5564 Fix code signing mistake
jjpritzl Mar 31, 2026
cf78ace
create-separate story/JPCFM-5564 Fix bad syntax in build settings
jjpritzl Mar 31, 2026
60390d5
create-separate story/JPCFM-5564 Fix bad syntax in project settings f…
jjpritzl Mar 31, 2026
2f85f1b
create-separate story/JPCFM-5564 Try to fix failing tests on GH PR
jjpritzl Apr 1, 2026
2ed25d9
create-separate story/JPCFM-5564 Try to fix unit test check issue
jjpritzl Apr 1, 2026
83f107d
create-separate story/JPCFM-5564 Make actual change with the plan to …
jjpritzl Apr 1, 2026
b28109d
create-separate story/JPCFM-5564 merge main and fix merge conflicts
jjpritzl Apr 1, 2026
b165a85
Merge branch 'master' of github.com:jamf/PPPC-Utility into copilot/cr…
watkyn Apr 2, 2026
b3db45b
removed some uneeded concurrency annotations
watkyn Apr 2, 2026
113fcad
removed a couple more spots
watkyn Apr 2, 2026
80f38ae
Update Source/SwiftUI/UploadInfoView.swift
watkyn Apr 6, 2026
4ffc19b
code review changes
watkyn Apr 6, 2026
25e2629
put the apple events selection back onto the main queue
watkyn Apr 6, 2026
798491d
disabled the drop down until it is populated.
watkyn Apr 6, 2026
cb0763a
fixed the sizing issue of the save window
watkyn Apr 6, 2026
858bfe7
added width to the save prompt
watkyn Apr 6, 2026
fdad5c6
changed sequence of model on save
watkyn Apr 6, 2026
a3d3899
reverted main story board
watkyn Apr 6, 2026
83443d5
added timing check for apple events loading
watkyn Apr 6, 2026
5297402
reverted back to sync on the drag drop executables
watkyn Apr 6, 2026
9afcf29
try macos 26
watkyn Apr 6, 2026
ae6f8ce
fixed the upload crashes
watkyn Apr 6, 2026
ce76842
claude plan 1
watkyn Apr 6, 2026
9c788a3
updated plan and claude.md
watkyn Apr 7, 2026
ec07808
added some simple unit test coverage that was missing
watkyn Apr 7, 2026
fe62ac0
Phase 2: URLSession injection + MockURLProtocol infrastructure
watkyn Apr 7, 2026
00a08f6
added more networking unit tests
watkyn Apr 7, 2026
67d20d1
Merge branch 'master' of github.com:jamf/PPPC-Utility into new-testin…
watkyn Apr 8, 2026
20ae4c1
Fix sendBearerAuthorized retry bug and add 401 retry tests
Copilot Apr 8, 2026
b3b8cb1
Phase 4: Add UploadManager and TCCProfile XML tests
watkyn Apr 8, 2026
79b2054
Merge branch 'new-testing-plan' of github.com:jamf/PPPC-Utility into …
watkyn Apr 8, 2026
1545229
updated claude.md
watkyn Apr 8, 2026
7a97fe0
added ui testing plan
watkyn Apr 8, 2026
519d54f
added UI test framework and first test for the main window
watkyn Apr 8, 2026
794c7c2
split the UI tests from the unit test
watkyn Apr 8, 2026
6bda5c4
fixed the project file ref
watkyn Apr 9, 2026
526db9d
trying out speckit on a feature
watkyn Apr 9, 2026
162d9c1
finished implementing the spec
watkyn Apr 9, 2026
5ea068c
Merge branch 'master' of github.com:jamf/PPPC-Utility into 001-fix-de…
watkyn Apr 9, 2026
c3f2ef2
added spec for the 3 new keys
watkyn Apr 9, 2026
9df88ba
implemented the spec locally since the agent does not have xcode access
watkyn Apr 9, 2026
10bdab1
addressed copilot comments (except the one about splitting the pr)
pmoprhy Apr 13, 2026
1dc9ed7
Merge branch 'master' of github.com:jamf/PPPC-Utility into 002-add-pp…
watkyn Apr 14, 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 .specify/feature.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"feature_directory": "specs/001-fix-deprecations"
"feature_directory": "specs/002-add-pppc-keys"
}
3 changes: 2 additions & 1 deletion .specify/memory/constitution.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ acceptable only for components without adequate SwiftUI coverage.

- Minimum deployment target: macOS 13.0.
- All interactive UI elements MUST have accessibility identifiers and labels.
- Service keys in the main window MUST appear in alphabetical order.
- Profiles MUST be saveable locally (signed or unsigned) and uploadable to
Jamf Pro (bearer token, basic auth fallback, or OAuth client credentials).

Expand Down Expand Up @@ -86,4 +87,4 @@ Git) are maintained in `CLAUDE.md`. Amendments require:
All PRs and code reviews MUST verify compliance with this constitution.
Complexity violations MUST be justified in the PR description.

**Version**: 1.1.0 | **Ratified**: 2026-04-09 | **Last Amended**: 2026-04-09
**Version**: 1.2.0 | **Ratified**: 2026-04-09 | **Last Amended**: 2026-04-09
16 changes: 16 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,16 @@
- Avoid snake_case in test names (e.g., `generateDisplayName_bundleIdentifier`). If a name is getting long, use a Trait with a sentence-style description instead.
- For complex tests, use a descriptive `@Test("...")` trait that explains the scenario and expected outcome so the test is understandable without reading the body.
- Use parameterized tests with Traits where it reduces duplication; 1–2 args is ideal, max 3
```swift
@Test("Service key round-trip preserves value", arguments: [
("BluetoothAlways", "Allow"),
("SystemPolicyAppBundles", "Deny")
])
func serviceKeyRoundTrip(serviceKey: String, value: String) async { … }
```
- Beyond 3 params: create separate tests with some values hard-coded
- Use `deinit` as teardown for repeated cleanup across tests in a suite. Use `class` for suites that need `deinit`; use `struct` otherwise.
- After adding or refactoring tests, look for duplication or tests that are no longer relevant. Do not add redundant tests.

## UI Testing Conventions

Expand All @@ -35,6 +43,14 @@
- Use accessibility identifiers set in `setupAccessibilityIdentifiers()` to locate UI elements
- The `-UITestMode` launch argument triggers test-specific setup (e.g., loading a test profile)

## UI Conventions

- Service keys (popup rows) in the main window must appear in alphabetical order.

## Naming

- Avoid "new" in test or function names — it becomes stale quickly. Describe the behavior, not the novelty.

## Git

- Do not stage or commit changes in terminal sessions
4 changes: 4 additions & 0 deletions PPPC Utility.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
C07B1FB82AF596D80075E38B /* UploadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07B1FB72AF596D80075E38B /* UploadManager.swift */; };
C0A2B5422B1A5D5C0007F510 /* JamfProAPIClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A2B5412B1A5D5C0007F510 /* JamfProAPIClientTests.swift */; };
C0A85DB5279873C600086283 /* TestTCCUnsignedProfile-allLower.mobileconfig in Resources */ = {isa = PBXBuildFile; fileRef = C0A85DB4279873C600086283 /* TestTCCUnsignedProfile-allLower.mobileconfig */; };
AA002200000000000000002B /* TestTCCUnsignedProfile-Legacy.mobileconfig in Resources */ = {isa = PBXBuildFile; fileRef = AA002200000000000000002A /* TestTCCUnsignedProfile-Legacy.mobileconfig */; };
C0DC2BB92B2263FC003A4474 /* Haversack in Frameworks */ = {isa = PBXBuildFile; productRef = C0DC2BB82B2263FC003A4474 /* Haversack */; };
C0E0383F27A30C7100A23FA2 /* PPPCServiceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0E0383D27A30C7100A23FA2 /* PPPCServiceInfo.swift */; };
C0E0384027A30C7100A23FA2 /* PPPCServicesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0E0383E27A30C7100A23FA2 /* PPPCServicesManager.swift */; };
Expand Down Expand Up @@ -151,6 +152,7 @@
C07B1FB72AF596D80075E38B /* UploadManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadManager.swift; sourceTree = "<group>"; };
C0A2B5412B1A5D5C0007F510 /* JamfProAPIClientTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JamfProAPIClientTests.swift; sourceTree = "<group>"; };
C0A85DB4279873C600086283 /* TestTCCUnsignedProfile-allLower.mobileconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "TestTCCUnsignedProfile-allLower.mobileconfig"; sourceTree = "<group>"; };
AA002200000000000000002A /* TestTCCUnsignedProfile-Legacy.mobileconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "TestTCCUnsignedProfile-Legacy.mobileconfig"; sourceTree = "<group>"; };
C0E0383D27A30C7100A23FA2 /* PPPCServiceInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PPPCServiceInfo.swift; sourceTree = "<group>"; };
C0E0383E27A30C7100A23FA2 /* PPPCServicesManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PPPCServicesManager.swift; sourceTree = "<group>"; };
C0E0384127A30D1D00A23FA2 /* PPPCServices.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = PPPCServices.json; sourceTree = "<group>"; };
Expand Down Expand Up @@ -266,6 +268,7 @@
children = (
5F95AE2B2315B172002E0A22 /* TestTCCProfileSigned-Broken.mobileconfig */,
C0A85DB4279873C600086283 /* TestTCCUnsignedProfile-allLower.mobileconfig */,
AA002200000000000000002A /* TestTCCUnsignedProfile-Legacy.mobileconfig */,
5F95AE2A2315B172002E0A22 /* TestTCCUnsignedProfile-Broken.mobileconfig */,
5F95AE2C2315B172002E0A22 /* TestTCCUnsignedProfile-Empty.mobileconfig */,
5F95AE292315B172002E0A22 /* TestTCCUnsignedProfile.mobileconfig */,
Expand Down Expand Up @@ -536,6 +539,7 @@
5F95AE312315B172002E0A22 /* TestTCCUnsignedProfile-Empty.mobileconfig in Resources */,
5F95AE2F2315B172002E0A22 /* TestTCCUnsignedProfile-Broken.mobileconfig in Resources */,
C0A85DB5279873C600086283 /* TestTCCUnsignedProfile-allLower.mobileconfig in Resources */,
AA002200000000000000002B /* TestTCCUnsignedProfile-Legacy.mobileconfig in Resources */,
C0EE9A7D28639BF800738B6B /* TestTCCProfileForJamfProAPI.txt in Resources */,
5F95AE302315B172002E0A22 /* TestTCCProfileSigned-Broken.mobileconfig in Resources */,
);
Expand Down
5 changes: 4 additions & 1 deletion PPPC UtilityTests/Helpers/TCCProfileBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@ class TCCProfileBuilder: NSObject {
func buildTCCPolicies(allowed: Bool?, authorization: TCCPolicyAuthorizationValue?) -> [String: [TCCPolicy]] {
return [
"SystemPolicyAllFiles": [buildTCCPolicy(allowed: allowed, authorization: authorization)],
"AppleEvents": [buildTCCPolicy(allowed: allowed, authorization: authorization)]
"AppleEvents": [buildTCCPolicy(allowed: allowed, authorization: authorization)],
"BluetoothAlways": [buildTCCPolicy(allowed: allowed, authorization: authorization)],
"SystemPolicyAppBundles": [buildTCCPolicy(allowed: allowed, authorization: authorization)],
"SystemPolicyAppData": [buildTCCPolicy(allowed: allowed, authorization: authorization)]
]
}

Expand Down
86 changes: 44 additions & 42 deletions PPPC UtilityTests/ModelTests/ExecutableTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,60 +34,62 @@ import Testing
struct ExecutableTests {
let executable = Executable()

@Test("Display name uses last component of bundle identifier")
func generateDisplayNameBundleIdentifier() {
@Test(
"Display name uses last component of identifier",
arguments: [
("com.example.MyApp", "MyApp"),
("/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal", "Terminal"),
("Terminal", "Terminal")
])
func generateDisplayName(identifier: String, expected: String) {
// when
let displayName = executable.generateDisplayName(identifier: "com.example.MyApp")
let displayName = executable.generateDisplayName(identifier: identifier)

// then
#expect(displayName == "MyApp")
#expect(displayName == expected)
}

@Test("Display name uses last component of path identifier")
func generateDisplayNamePathIdentifier() {
@Test(
"Icon path matches identifier type",
arguments: [
("com.example.MyApp", "/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/GenericApplicationIcon.icns"),
("/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal", "/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/ExecutableBinaryIcon.icns")
])
func generateIconPath(identifier: String, expected: String) {
// when
let displayName = executable.generateDisplayName(identifier: "/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal")
let iconPath = executable.generateIconPath(identifier: identifier)

// then
#expect(displayName == "Terminal")
#expect(iconPath == expected)
}

@Test("Display name returns identifier when single component")
func generateDisplayNameSingleComponent() {
// when
let displayName = executable.generateDisplayName(identifier: "Terminal")

// then
#expect(displayName == "Terminal")
}

@Test("Icon path is application for bundle identifier")
func generateIconPathForBundleIdentifier() {
// when
let iconPath = executable.generateIconPath(identifier: "com.example.MyApp")

// then
#expect(iconPath == IconFilePath.application)
}

@Test("Icon path is binary for path identifier")
func generateIconPathForPathIdentifier() {
// when
let iconPath = executable.generateIconPath(identifier: "/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal")

// then
#expect(iconPath == IconFilePath.binary)
}

@Test("All policy values default to dash")
func allPolicyValuesAreDefaults() {
@Test("All policy properties default to dash")
func policyPropertiesDefaultToDash() {
let policy = Policy()

// when
let values = policy.allPolicyValues()

// then
#expect(values.count == 20)
#expect(values.allSatisfy { $0 == "-" })
#expect(policy.Accessibility == "-")
#expect(policy.AddressBook == "-")
#expect(policy.BluetoothAlways == "-")
#expect(policy.Calendar == "-")
#expect(policy.Camera == "-")
#expect(policy.FileProviderPresence == "-")
#expect(policy.ListenEvent == "-")
#expect(policy.MediaLibrary == "-")
#expect(policy.Microphone == "-")
#expect(policy.Photos == "-")
#expect(policy.PostEvent == "-")
#expect(policy.Reminders == "-")
#expect(policy.ScreenCapture == "-")
#expect(policy.SpeechRecognition == "-")
#expect(policy.SystemPolicyAllFiles == "-")
#expect(policy.SystemPolicyAppBundles == "-")
#expect(policy.SystemPolicyAppData == "-")
#expect(policy.SystemPolicyDesktopFolder == "-")
#expect(policy.SystemPolicyDocumentsFolder == "-")
#expect(policy.SystemPolicyDownloadsFolder == "-")
#expect(policy.SystemPolicyNetworkVolumes == "-")
#expect(policy.SystemPolicyRemovableVolumes == "-")
#expect(policy.SystemPolicySysAdminFiles == "-")
}
}
49 changes: 28 additions & 21 deletions PPPC UtilityTests/ModelTests/ModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -267,39 +267,46 @@ struct ModelTests {
#expect(model.selectedExecutables.first?.policy.SystemPolicyAllFiles == "Deny")
}

// MARK: - tests for policyFromString

@Test
func policyWhenUsingAllow() {
let app = Executable(identifier: "id", codeRequirement: "req")
// MARK: - Service key round-trips

@Test(
"Service key round-trip preserves value",
arguments: [
("BluetoothAlways", "Allow"),
("SystemPolicyAppBundles", "Deny"),
("SystemPolicyAppData", "Allow")
])
func serviceKeyRoundTrip(serviceKey: String, value: String) async {
let model = ModelBuilder()
.addExecutable(settings: [serviceKey: value])
.build()

// when
let policy = model.policyFromString(executable: app, value: "Allow")
let profile = model.exportProfile(organization: "Org", identifier: "ID", displayName: "Name", payloadDescription: "Desc")
await model.importProfile(tccProfile: profile)

// then
#expect(policy?.authorization == .allow)
let result = model.selectedExecutables.last?.policy.value(forKey: serviceKey) as? String
#expect(result == value)
}

@Test
func policyWhenUsingDeny() {
let app = Executable(identifier: "id", codeRequirement: "req")

// when
let policy = model.policyFromString(executable: app, value: "Deny")

// then
#expect(policy?.authorization == .deny)
}
// MARK: - tests for policyFromString

@Test
func policyWhenUsingAllowForStandardUsers() {
@Test(
"policyFromString maps display value to authorization",
arguments: [
("Allow", TCCPolicyAuthorizationValue.allow),
("Deny", TCCPolicyAuthorizationValue.deny),
("Let Standard Users Approve", TCCPolicyAuthorizationValue.allowStandardUserToSetSystemService)
])
func policyFromStringAuthorization(value: String, expected: String) {
let app = Executable(identifier: "id", codeRequirement: "req")

// when
let policy = model.policyFromString(executable: app, value: "Let Standard Users Approve")
let policy = model.policyFromString(executable: app, value: value)

// then
#expect(policy?.authorization == .allowStandardUserToSetSystemService)
#expect(policy?.authorization == expected)
}

@Test
Expand Down
17 changes: 16 additions & 1 deletion PPPC UtilityTests/ModelTests/PPPCServicesManagerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,22 @@ struct PPPCServicesManagerTests {
let actual = PPPCServicesManager()

// then
#expect(actual.allServices.count == 21)
#expect(actual.allServices.count == 24)
}

@Test(
"Service is loaded with correct English name",
arguments: [
("BluetoothAlways", "Bluetooth Always"),
("SystemPolicyAppBundles", "App Bundles"),
("SystemPolicyAppData", "App Data")
])
func serviceIsLoaded(key: String, expectedName: String) throws {
let services = PPPCServicesManager()
let service = try #require(services.allServices[key])

// then
#expect(service.englishName == expectedName)
}

@Test("User help with entitlements")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,31 @@ struct TCCProfileImporterTests {

let tccProfile = try tccProfileImporter.decodeTCCProfile(fileUrl: resourceURL)
#expect(!tccProfile.content.isEmpty)
#expect(!tccProfile.content[0].services.isEmpty)
let services = tccProfile.content[0].services
#expect(!services.isEmpty)
#expect(services.count == 24, "Profile should contain exactly 24 services")
#expect(services["BluetoothAlways"] != nil, "BluetoothAlways service should exist")
#expect(services["SystemPolicyAppBundles"] != nil, "SystemPolicyAppBundles service should exist")
#expect(services["SystemPolicyAppData"] != nil, "SystemPolicyAppData service should exist")
}
Comment thread
pmoprhy marked this conversation as resolved.

@Test("Legacy profile without new keys imports with dash defaults")
func legacyProfileImportsWithDashDefaults() async throws {
let tccProfileImporter = TCCProfileImporter()
let resourceURL = try getResourceProfile(fileName: "TestTCCUnsignedProfile-Legacy")
let tccProfile = try tccProfileImporter.decodeTCCProfile(fileUrl: resourceURL)

// when
let model = Model()
await model.importProfile(tccProfile: tccProfile)

// then
#expect(!model.selectedExecutables.isEmpty, "Legacy profile should import at least one executable")
for executable in model.selectedExecutables {
#expect(executable.policy.BluetoothAlways == "-", "BluetoothAlways should default to dash for legacy profiles")
#expect(executable.policy.SystemPolicyAppBundles == "-", "SystemPolicyAppBundles should default to dash for legacy profiles")
#expect(executable.policy.SystemPolicyAppData == "-", "SystemPolicyAppData should default to dash for legacy profiles")
}
Comment thread
pmoprhy marked this conversation as resolved.
}

@Test
Expand Down
15 changes: 6 additions & 9 deletions PPPC UtilityTests/TCCProfileImporterTests/TCCProfileTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ struct TCCProfileTests {
#expect(content.version == 1)

// then verify the services key
#expect(content.services.count == 2)
#expect(content.services.count == 5)
let allFiles = content.services["SystemPolicyAllFiles"]
#expect(allFiles?.count == 1)
allFiles?.forEach { policy in
Expand All @@ -77,6 +77,9 @@ struct TCCProfileTests {
#expect(policy.receiverIdentifierType == "policy receiver id type")
#expect(policy.receiverCodeRequirement == "policy receiver code req")
}
#expect(content.services["BluetoothAlways"] != nil, "BluetoothAlways should be included")
#expect(content.services["SystemPolicyAppBundles"] != nil, "SystemPolicyAppBundles should be included")
#expect(content.services["SystemPolicyAppData"] != nil, "SystemPolicyAppData should be included")
}
Comment thread
pmoprhy marked this conversation as resolved.
}

Expand Down Expand Up @@ -108,7 +111,7 @@ struct TCCProfileTests {
#expect(content.version == 1)

// then verify the services key
#expect(content.services.count == 2)
#expect(content.services.count == 5)
let allFiles = content.services["SystemPolicyAllFiles"]
#expect(allFiles?.count == 1)
allFiles?.forEach { policy in
Expand Down Expand Up @@ -141,13 +144,7 @@ struct TCCProfileTests {
#expect(content.version == 1)

// then verify the services key
#expect(content.services.count == 2)
let allFiles = content.services["SystemPolicyAllFiles"]
#expect(allFiles?.count == 1)
allFiles?.forEach { policy in
#expect(policy.allowed == false)
#expect(policy.authorization == .allow)
}
#expect(content.services.count == 5)
}
}

Expand Down
Loading
Loading