Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 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
090fcbb
Merge branch 'master' of github.com:jamf/PPPC-Utility into add-ui-tests
watkyn Apr 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
18 changes: 16 additions & 2 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Unit Tests
name: Tests

on:
pull_request:
Expand All @@ -10,7 +10,7 @@ permissions:
contents: read

jobs:
test:
unit-tests:
runs-on: macos-26
steps:
- uses: actions/checkout@v4
Expand All @@ -23,3 +23,17 @@ jobs:
-destination "platform=macOS" \
CODE_SIGN_IDENTITY="-" \
CODE_SIGNING_REQUIRED=NO

ui-tests:
runs-on: macos-26
steps:
- uses: actions/checkout@v4

- name: Run UI tests
run: |
xcodebuild test \
-project "PPPC Utility.xcodeproj" \
-scheme "PPPC Utility UI Tests" \
-destination "platform=macOS" \
CODE_SIGN_IDENTITY="-" \
CODE_SIGNING_REQUIRED=NO
8 changes: 8 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@
- 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.

## UI Testing Conventions

- UI tests use XCTest (XCUITest), not Swift Testing — the UI test target uses Swift 5 with minimal concurrency checking
- Prefer **multiple assertions per test** to minimize app launches. Each test method relaunches the app, which is expensive. Group related checks (e.g., verify all buttons exist in one test) rather than one assertion per test.
- Do not use `// when` / `// then` comment blocks in UI tests — they add noise without clarity in assertion-heavy tests
- Use accessibility identifiers set in `setupAccessibilityIdentifiers()` to locate UI elements
- The `-UITestMode` launch argument triggers test-specific setup (e.g., loading a test profile)

## Git

- Do not stage or commit changes in terminal sessions
29 changes: 29 additions & 0 deletions PPPC Utility UI Tests.xctestplan
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"configurations" : [
{
"id" : "C4300CCF-D433-4368-B895-3721F691DA4D",
"name" : "Test Scheme Action",
"options" : {

}
}
],
"defaultOptions" : {
"codeCoverage" : true,
"targetForVariableExpansion" : {
"containerPath" : "container:PPPC Utility.xcodeproj",
"identifier" : "6EC409D9214D65BC00BE4F17",
"name" : "PPPC Utility"
}
},
"testTargets" : [
{
"target" : {
"containerPath" : "container:PPPC Utility.xcodeproj",
"identifier" : "AA0001000000000000000001",
"name" : "PPPC UtilityUITests"
}
}
],
"version" : 1
}
136 changes: 136 additions & 0 deletions PPPC Utility.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@
C0EE9A7F2863BDE300738B6B /* JamfProAPITypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0EE9A7E2863BDE300738B6B /* JamfProAPITypes.swift */; };
C0EE9A812863BE2B00738B6B /* NetworkAuthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0EE9A802863BE2B00738B6B /* NetworkAuthManager.swift */; };
D023DD16033D452488B41741 /* ArrayExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B5B34EC5FC52B5B4C9D0258 /* ArrayExtensionTests.swift */; };
AA000E00000000000000000E /* AppLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000B00000000000000000B /* AppLaunchTests.swift */; };
AA001200000000000000001C /* TestTCCUnsignedProfile.mobileconfig in Resources */ = {isa = PBXBuildFile; fileRef = AA001100000000000000001B /* TestTCCUnsignedProfile.mobileconfig */; };
Comment thread
watkyn marked this conversation as resolved.
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand All @@ -77,6 +79,13 @@
remoteGlobalIDString = 6EC409D9214D65BC00BE4F17;
remoteInfo = "PPPC Utility";
};
AA0006000000000000000006 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6EC409D2214D65BC00BE4F17 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 6EC409D9214D65BC00BE4F17;
remoteInfo = "PPPC Utility";
};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
Expand Down Expand Up @@ -147,6 +156,11 @@
DAC55385D89BDBD447395AF1 /* TCCPolicyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCCPolicyTests.swift; sourceTree = "<group>"; };
F3DBEDB941B7AEAE7BFF2776 /* MockURLProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockURLProtocol.swift; sourceTree = "<group>"; };
F82A8F992F85984800A72E5C /* PPPC Utility.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "PPPC Utility.xctestplan"; sourceTree = "<group>"; };
AA002100000000000000002B /* PPPC Utility UI Tests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "PPPC Utility UI Tests.xctestplan"; sourceTree = "<group>"; };
AA000B00000000000000000B /* AppLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLaunchTests.swift; sourceTree = "<group>"; };
AA000D00000000000000000D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
AA0005000000000000000005 /* PPPC UtilityUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PPPC UtilityUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
AA001100000000000000001B /* TestTCCUnsignedProfile.mobileconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = TestTCCUnsignedProfile.mobileconfig; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand All @@ -165,6 +179,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
AA0003000000000000000003 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
Expand Down Expand Up @@ -269,13 +290,15 @@
isa = PBXGroup;
children = (
F82A8F992F85984800A72E5C /* PPPC Utility.xctestplan */,
AA002100000000000000002B /* PPPC Utility UI Tests.xctestplan */,
6E95730721553B650002C30B /* LICENSE */,
97227C6726248CD7000F26C1 /* CHANGELOG.md */,
6E5D5A1521541B8F00B43312 /* README.md */,
6EC409DC214D65BC00BE4F17 /* Source */,
5F95AE1423158EF0002E0A22 /* External */,
6EC409F6214D975A00BE4F17 /* Resources */,
5F95AE1C2315A6AD002E0A22 /* PPPC UtilityTests */,
AA001000000000000000001A /* PPPC UtilityUITests */,
6EC409DB214D65BC00BE4F17 /* Products */,
);
sourceTree = "<group>";
Expand All @@ -285,6 +308,7 @@
children = (
6EC409DA214D65BC00BE4F17 /* PPPC Utility.app */,
5F95AE1B2315A6AD002E0A22 /* PPPC UtilityTests.xctest */,
AA0005000000000000000005 /* PPPC UtilityUITests.xctest */,
);
name = Products;
sourceTree = "<group>";
Expand Down Expand Up @@ -313,6 +337,7 @@
6EC409E6214D65BD00BE4F17 /* Info.plist */,
C0E0384127A30D1D00A23FA2 /* PPPCServices.json */,
6E957309215557870002C30B /* PPPC Utility.entitlements */,
AA001100000000000000001B /* TestTCCUnsignedProfile.mobileconfig */,
);
path = Resources;
sourceTree = "<group>";
Expand Down Expand Up @@ -378,6 +403,15 @@
path = NetworkingTests;
sourceTree = "<group>";
};
AA001000000000000000001A /* PPPC UtilityUITests */ = {
isa = PBXGroup;
children = (
AA000B00000000000000000B /* AppLaunchTests.swift */,
AA000D00000000000000000D /* Info.plist */,
);
path = "PPPC UtilityUITests";
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
Expand Down Expand Up @@ -419,6 +453,24 @@
productReference = 6EC409DA214D65BC00BE4F17 /* PPPC Utility.app */;
productType = "com.apple.product-type.application";
};
AA0001000000000000000001 /* PPPC UtilityUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = AA0008000000000000000008 /* Build configuration list for PBXNativeTarget "PPPC UtilityUITests" */;
buildPhases = (
AA0002000000000000000002 /* Sources */,
AA0003000000000000000003 /* Frameworks */,
AA0004000000000000000004 /* Resources */,
);
buildRules = (
);
dependencies = (
AA0007000000000000000007 /* PBXTargetDependency */,
);
name = "PPPC UtilityUITests";
productName = "PPPC UtilityUITests";
productReference = AA0005000000000000000005 /* PPPC UtilityUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
Expand All @@ -434,6 +486,10 @@
LastSwiftMigration = 1020;
TestTargetID = 6EC409D9214D65BC00BE4F17;
};
AA0001000000000000000001 = {
CreatedOnToolsVersion = 16.0;
TestTargetID = 6EC409D9214D65BC00BE4F17;
};
6EC409D9214D65BC00BE4F17 = {
CreatedOnToolsVersion = 10.0;
LastSwiftMigration = 1100;
Expand Down Expand Up @@ -466,6 +522,7 @@
targets = (
6EC409D9214D65BC00BE4F17 /* PPPC Utility */,
5F95AE1A2315A6AD002E0A22 /* PPPC UtilityTests */,
AA0001000000000000000001 /* PPPC UtilityUITests */,
);
};
/* End PBXProject section */
Expand All @@ -491,9 +548,17 @@
6EC409E2214D65BD00BE4F17 /* Assets.xcassets in Resources */,
C0E0384227A30D1D00A23FA2 /* PPPCServices.json in Resources */,
6EC409E5214D65BD00BE4F17 /* Main.storyboard in Resources */,
AA001200000000000000001C /* TestTCCUnsignedProfile.mobileconfig in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
AA0004000000000000000004 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
Expand Down Expand Up @@ -561,6 +626,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
AA0002000000000000000002 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
AA000E00000000000000000E /* AppLaunchTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
Expand All @@ -569,6 +642,11 @@
target = 6EC409D9214D65BC00BE4F17 /* PPPC Utility */;
targetProxy = 5F95AE202315A6AD002E0A22 /* PBXContainerItemProxy */;
};
AA0007000000000000000007 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 6EC409D9214D65BC00BE4F17 /* PPPC Utility */;
targetProxy = AA0006000000000000000006 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
Expand Down Expand Up @@ -809,6 +887,55 @@
};
name = Release;
};
AA0009000000000000000009 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "PPPC UtilityUITests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.jamf.PPPC-UtilityUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_STRICT_CONCURRENCY = minimal;
SWIFT_VERSION = 5.0;
TEST_TARGET_NAME = "PPPC Utility";
};
name = Debug;
};
AA000A00000000000000000A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "PPPC UtilityUITests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.jamf.PPPC-UtilityUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_STRICT_CONCURRENCY = minimal;
SWIFT_VERSION = 5.0;
TEST_TARGET_NAME = "PPPC Utility";
};
name = Release;
};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
Expand Down Expand Up @@ -839,6 +966,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
AA0008000000000000000008 /* Build configuration list for PBXNativeTarget "PPPC UtilityUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
AA0009000000000000000009 /* Debug */,
AA000A00000000000000000A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */

/* Begin XCRemoteSwiftPackageReference section */
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading