add sanity tests for chats
This commit is contained in:
parent
7cdd943ef8
commit
8716ae13b8
36
.github/workflows/sanity-test.yaml
vendored
36
.github/workflows/sanity-test.yaml
vendored
@ -3,6 +3,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- 5063-chats-backup-v0-integration-tests
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
user:
|
user:
|
||||||
@ -423,6 +424,41 @@ jobs:
|
|||||||
|
|
||||||
##########################################################################################################################################
|
##########################################################################################################################################
|
||||||
|
|
||||||
|
# Teams Chats
|
||||||
|
|
||||||
|
# generate a folder name
|
||||||
|
- name: TeamsChats - Create export foldername
|
||||||
|
id: export-folder-teamschats
|
||||||
|
run: |
|
||||||
|
suffix=$(date +"%Y-%m-%d_%H-%M-%S")
|
||||||
|
echo name="${{ env.RESTORE_DEST_PFX }}$suffix" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: TeamsChats - Backup
|
||||||
|
id: teamschats-backup
|
||||||
|
timeout-minutes: 30
|
||||||
|
uses: ./.github/actions/backup-restore-test
|
||||||
|
with:
|
||||||
|
service: teamschats
|
||||||
|
kind: first-backup
|
||||||
|
backup-args: '--user "${{ vars.CORSO_M365_TEST_USER_ID }}"'
|
||||||
|
restore-container: '${{ jobs.export-folder-teamschats.outputs.name }}'
|
||||||
|
log-dir: ${{ env.CORSO_LOG_DIR }}
|
||||||
|
with-export: true
|
||||||
|
|
||||||
|
- name: TeamsChats - Incremental backup
|
||||||
|
id: teamschats-incremental
|
||||||
|
timeout-minutes: 30
|
||||||
|
uses: ./.github/actions/backup-restore-test
|
||||||
|
with:
|
||||||
|
service: teamschats
|
||||||
|
kind: incremental
|
||||||
|
backup-args: '--group "${{ vars.CORSO_M365_TEST_USER_ID }}"'
|
||||||
|
restore-container: '${{ jobs.export-folder-teamschats.outputs.name }}'
|
||||||
|
log-dir: ${{ env.CORSO_LOG_DIR }}
|
||||||
|
with-export: true
|
||||||
|
|
||||||
|
##########################################################################################################################################
|
||||||
|
|
||||||
# Logging & Notifications
|
# Logging & Notifications
|
||||||
|
|
||||||
# Upload the original go test output as an artifact for later review.
|
# Upload the original go test output as an artifact for later review.
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -10,6 +10,7 @@
|
|||||||
*.test
|
*.test
|
||||||
test_results/
|
test_results/
|
||||||
testlog/
|
testlog/
|
||||||
|
sanity.test
|
||||||
|
|
||||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
*.out
|
*.out
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package common
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -21,7 +22,7 @@ func BuildFilepathSanitree(
|
|||||||
err error,
|
err error,
|
||||||
) error {
|
) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fatal(ctx, "error passed to filepath walker", err)
|
Fatal(ctx, fmt.Sprintf("error passed to filepath walker for dir %q", p), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
relPath, err := filepath.Rel(rootDir, p)
|
relPath, err := filepath.Rel(rootDir, p)
|
||||||
|
|||||||
93
src/cmd/sanity_test/export/teamschats.go
Normal file
93
src/cmd/sanity_test/export/teamschats.go
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
package export
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"io/fs"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
||||||
|
|
||||||
|
"github.com/alcionai/corso/src/cmd/sanity_test/common"
|
||||||
|
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||||
|
"github.com/alcionai/corso/src/pkg/path"
|
||||||
|
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CheckTeamsChatsExport(
|
||||||
|
ctx context.Context,
|
||||||
|
ac api.Client,
|
||||||
|
envs common.Envs,
|
||||||
|
) {
|
||||||
|
sourceTree := populateChatsSanitree(
|
||||||
|
ctx,
|
||||||
|
ac,
|
||||||
|
envs.UserID)
|
||||||
|
|
||||||
|
fpTree := common.BuildFilepathSanitree(ctx, envs.RestoreContainer)
|
||||||
|
|
||||||
|
comparator := func(
|
||||||
|
ctx context.Context,
|
||||||
|
expect *common.Sanitree[models.Chatable, models.Chatable],
|
||||||
|
result *common.Sanitree[fs.FileInfo, fs.FileInfo],
|
||||||
|
) {
|
||||||
|
for key := range expect.Leaves {
|
||||||
|
expect.Leaves[key].Size = 0 // chat sizes cannot be compared
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedResultLeaves := map[string]*common.Sanileaf[fs.FileInfo, fs.FileInfo]{}
|
||||||
|
|
||||||
|
for key, leaf := range result.Leaves {
|
||||||
|
key = strings.TrimSuffix(key, ".json")
|
||||||
|
leaf.Size = 0 // we cannot compare sizes
|
||||||
|
updatedResultLeaves[key] = leaf
|
||||||
|
}
|
||||||
|
|
||||||
|
common.CompareLeaves(ctx, expect.Leaves, updatedResultLeaves, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
common.CompareDiffTrees(
|
||||||
|
ctx,
|
||||||
|
sourceTree,
|
||||||
|
fpTree.Children[path.ChatsCategory.HumanString()],
|
||||||
|
comparator)
|
||||||
|
|
||||||
|
common.Infof(ctx, "Success")
|
||||||
|
}
|
||||||
|
|
||||||
|
func populateChatsSanitree(
|
||||||
|
ctx context.Context,
|
||||||
|
ac api.Client,
|
||||||
|
userID string,
|
||||||
|
) *common.Sanitree[models.Chatable, models.Chatable] {
|
||||||
|
root := &common.Sanitree[models.Chatable, models.Chatable]{
|
||||||
|
ID: userID,
|
||||||
|
Name: path.ChatsCategory.HumanString(),
|
||||||
|
Leaves: map[string]*common.Sanileaf[models.Chatable, models.Chatable]{},
|
||||||
|
// teamschat should not have child containers
|
||||||
|
}
|
||||||
|
|
||||||
|
cc := api.CallConfig{
|
||||||
|
Expand: []string{"lastMessagePreview"},
|
||||||
|
}
|
||||||
|
|
||||||
|
chats, err := ac.Chats().GetChats(ctx, userID, cc)
|
||||||
|
if err != nil {
|
||||||
|
common.Fatal(ctx, "getting channels", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, chat := range chats {
|
||||||
|
leaf := &common.Sanileaf[
|
||||||
|
models.Chatable, models.Chatable,
|
||||||
|
]{
|
||||||
|
Parent: root,
|
||||||
|
ID: ptr.Val(chat.GetId()),
|
||||||
|
Name: ptr.Val(chat.GetId()),
|
||||||
|
}
|
||||||
|
|
||||||
|
root.Leaves[ptr.Val(chat.GetId())] = leaf
|
||||||
|
}
|
||||||
|
|
||||||
|
root.CountLeaves = len(root.Leaves)
|
||||||
|
|
||||||
|
return root
|
||||||
|
}
|
||||||
@ -67,6 +67,7 @@ func main() {
|
|||||||
expCMD.AddCommand(exportSharePointCMD())
|
expCMD.AddCommand(exportSharePointCMD())
|
||||||
expCMD.AddCommand(exportExchangeCMD())
|
expCMD.AddCommand(exportExchangeCMD())
|
||||||
expCMD.AddCommand(exportGroupsCMD())
|
expCMD.AddCommand(exportGroupsCMD())
|
||||||
|
expCMD.AddCommand(exportTeamsChatsCMD())
|
||||||
root.AddCommand(expCMD)
|
root.AddCommand(expCMD)
|
||||||
|
|
||||||
if err := root.Execute(); err != nil {
|
if err := root.Execute(); err != nil {
|
||||||
@ -200,6 +201,29 @@ func sanityTestExportExchange(cmd *cobra.Command, args []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func exportTeamsChatsCMD() *cobra.Command {
|
||||||
|
return &cobra.Command{
|
||||||
|
Use: "teamschats",
|
||||||
|
Short: "run the teamschats export sanity tests",
|
||||||
|
DisableAutoGenTag: true,
|
||||||
|
RunE: sanityTestExportTeamsChats,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sanityTestExportTeamsChats(cmd *cobra.Command, args []string) error {
|
||||||
|
ctx := common.SetDebug(cmd.Context())
|
||||||
|
envs := common.EnvVars(ctx)
|
||||||
|
|
||||||
|
ac, err := common.GetAC()
|
||||||
|
if err != nil {
|
||||||
|
return print.Only(ctx, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
export.CheckTeamsChatsExport(ctx, ac, envs)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// service commands - restore
|
// service commands - restore
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user