From 746c442d0146c4d0f3ded8900ff2b3dced70f160 Mon Sep 17 00:00:00 2001 From: Jahziel Villasana-Espinoza Date: Mon, 22 Jul 2024 16:11:07 -0400 Subject: [PATCH] feat: list host software integration tests (#20632) > Related issue: #20229 # Checklist for submitter If some of the following don't apply, delete the relevant line. - [x] Added/updated tests - [x] Manual QA for all new/changed functionality --- server/service/integration_mdm_test.go | 79 ++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 4 deletions(-) diff --git a/server/service/integration_mdm_test.go b/server/service/integration_mdm_test.go index 6ddee1929e..f0d60d122f 100644 --- a/server/service/integration_mdm_test.go +++ b/server/service/integration_mdm_test.go @@ -9776,12 +9776,20 @@ func (s *integrationMDMTestSuite) TestVPPApps() { addedApp = appResp.AppStoreApps[0] addAppResp = addAppStoreAppResponse{} s.DoJSON("POST", "/api/latest/fleet/software/app_store_apps", &addAppStoreAppRequest{TeamID: &team.ID, AppStoreID: addedApp.AdamID}, http.StatusOK, &addAppResp) - s.lastActivityMatches(fleet.ActivityAddedAppStoreApp{}.ActivityName(), fmt.Sprintf(`{"team_name": "%s", "software_title": "%s", "app_store_id": "%s", "team_id": %d}`, team.Name, addedApp.Name, addedApp.AdamID, team.ID), 0) + s.lastActivityMatches( + fleet.ActivityAddedAppStoreApp{}.ActivityName(), + fmt.Sprintf(`{"team_name": "%s", "software_title": "%s", "app_store_id": "%s", "team_id": %d}`, team.Name, addedApp.Name, addedApp.AdamID, team.ID), + 0, + ) errApp := appResp.AppStoreApps[1] addAppResp = addAppStoreAppResponse{} s.DoJSON("POST", "/api/latest/fleet/software/app_store_apps", &addAppStoreAppRequest{TeamID: &team.ID, AppStoreID: errApp.AdamID}, http.StatusOK, &addAppResp) - s.lastActivityMatches(fleet.ActivityAddedAppStoreApp{}.ActivityName(), fmt.Sprintf(`{"team_name": "%s", "software_title": "%s", "app_store_id": "%s", "team_id": %d}`, team.Name, errApp.Name, errApp.AdamID, team.ID), 0) + s.lastActivityMatches( + fleet.ActivityAddedAppStoreApp{}.ActivityName(), + fmt.Sprintf(`{"team_name": "%s", "software_title": "%s", "app_store_id": "%s", "team_id": %d}`, team.Name, errApp.Name, errApp.AdamID, team.ID), + 0, + ) listSw = listSoftwareTitlesResponse{} s.DoJSON("GET", "/api/latest/fleet/software/titles", nil, http.StatusOK, &listSw, "team_id", fmt.Sprint(team.ID), "available_for_install", "true") @@ -9813,7 +9821,19 @@ func (s *integrationMDMTestSuite) TestVPPApps() { } } - s.lastActivityMatches(fleet.ActivityInstalledAppStoreApp{}.ActivityName(), fmt.Sprintf(`{"host_id": %d, "host_display_name": "%s", "software_title": "%s", "app_store_id": "%s", "command_uuid": "%s", "status": "%s"}`, mdmHost.ID, mdmHost.DisplayName(), errApp.Name, errApp.AdamID, cmdUUID, fleet.SoftwareInstallerFailed), 0) + s.lastActivityMatches( + fleet.ActivityInstalledAppStoreApp{}.ActivityName(), + fmt.Sprintf( + `{"host_id": %d, "host_display_name": "%s", "software_title": "%s", "app_store_id": "%s", "command_uuid": "%s", "status": "%s"}`, + mdmHost.ID, + mdmHost.DisplayName(), + errApp.Name, + errApp.AdamID, + cmdUUID, + fleet.SoftwareInstallerFailed, + ), + 0, + ) // Trigger install to the host installResp = installSoftwareResponse{} @@ -9833,7 +9853,58 @@ func (s *integrationMDMTestSuite) TestVPPApps() { } } - s.lastActivityMatches(fleet.ActivityInstalledAppStoreApp{}.ActivityName(), fmt.Sprintf(`{"host_id": %d, "host_display_name": "%s", "software_title": "%s", "app_store_id": "%s", "command_uuid": "%s", "status": "%s"}`, mdmHost.ID, mdmHost.DisplayName(), addedApp.Name, addedApp.AdamID, cmdUUID, fleet.SoftwareInstallerInstalled), 0) + s.lastActivityMatches( + fleet.ActivityInstalledAppStoreApp{}.ActivityName(), + fmt.Sprintf( + `{"host_id": %d, "host_display_name": "%s", "software_title": "%s", "app_store_id": "%s", "command_uuid": "%s", "status": "%s"}`, + mdmHost.ID, + mdmHost.DisplayName(), + addedApp.Name, + addedApp.AdamID, + cmdUUID, + fleet.SoftwareInstallerInstalled, + ), + 0, + ) + + // Check list host software + + getHostSw := getHostSoftwareResponse{} + s.DoJSON("GET", fmt.Sprintf("/api/latest/fleet/hosts/%d/software", mdmHost.ID), nil, http.StatusOK, &getHostSw) + gotSW := getHostSw.Software + require.Len(t, gotSW, 2) // App 1 and App 2 + got1, got2 := gotSW[0], gotSW[1] + require.Equal(t, got1.Name, "App 1") + require.NotNil(t, got1.AppStoreApp) + require.Equal(t, got1.AppStoreApp.AppStoreID, addedApp.AdamID) + require.Equal(t, got1.AppStoreApp.IconURL, ptr.String(addedApp.IconURL)) + require.Empty(t, got1.AppStoreApp.Name) // Name is only present for installer packages + require.Equal(t, got1.AppStoreApp.Version, addedApp.LatestVersion) + require.NotNil(t, *got1.Status) + require.Equal(t, *got1.Status, fleet.SoftwareInstallerInstalled) + require.Equal(t, got2.Name, "App 2") + require.NotNil(t, *got2.Status) + require.Equal(t, *got2.Status, fleet.SoftwareInstallerFailed) + require.NotNil(t, got2.AppStoreApp) + require.Equal(t, got2.AppStoreApp.AppStoreID, errApp.AdamID) + require.Equal(t, got2.AppStoreApp.IconURL, ptr.String(errApp.IconURL)) + require.Empty(t, got2.AppStoreApp.Name) + require.Equal(t, got2.AppStoreApp.Version, errApp.LatestVersion) + + // Check with a query + getHostSw = getHostSoftwareResponse{} + s.DoJSON("GET", fmt.Sprintf("/api/latest/fleet/hosts/%d/software", mdmHost.ID), nil, http.StatusOK, &getHostSw, "query", "App 1") + require.Len(t, getHostSw.Software, 1) // App 1 only + got1 = getHostSw.Software[0] + require.Equal(t, got1.Name, "App 1") + require.NotNil(t, got1.AppStoreApp) + require.NotNil(t, got1.AppStoreApp) + require.Equal(t, got1.AppStoreApp.AppStoreID, addedApp.AdamID) + require.Equal(t, got1.AppStoreApp.IconURL, ptr.String(addedApp.IconURL)) + require.Empty(t, got1.AppStoreApp.Name) + require.Equal(t, got1.AppStoreApp.Version, addedApp.LatestVersion) + require.NotNil(t, *got1.Status) + require.Equal(t, *got1.Status, fleet.SoftwareInstallerInstalled) // Delete VPP token and check that it's not appearing anymore s.Do("DELETE", "/api/latest/fleet/mdm/apple/vpp_token", &deleteMDMAppleVPPTokenRequest{}, http.StatusNoContent)