package cli import ( "os" "path/filepath" "testing" ) func TestProfileList(t *testing.T) { tmpDir := t.TempDir() // Create some dummy profile files profiles := []string{"home.conf", "work.conf", "not-a-conf.txt"} for _, p := range profiles { err := os.WriteFile(filepath.Join(tmpDir, p), []byte("test content"), 0644) if err != nil { t.Fatalf("failed to create test profile %s: %v", p, err) } } app := NewApp([]string{"wg-wrap", "profile", "list"}) app.ConfigDir = tmpDir err := app.Route() if err != nil { t.Errorf("expected no error, got %v", err) } } func TestProfileImport(t *testing.T) { tmpDir := t.TempDir() profilesDir := filepath.Join(tmpDir, "profiles") err := os.MkdirAll(profilesDir, 0755) if err != nil { t.Fatalf("failed to create profiles dir: %v", err) } srcFile := filepath.Join(tmpDir, "source.conf") err = os.WriteFile(srcFile, []byte("[Interface]\nPrivateKey = test\n"), 0644) if err != nil { t.Fatalf("failed to create source conf: %v", err) } // 1. Test importing with derived name (no explicit name argument) app := NewApp([]string{"wg-wrap", "profile", "import", srcFile}) app.ConfigDir = profilesDir err = app.Route() if err != nil { t.Errorf("expected no error, got %v", err) } // Verify the file was actually copied to derived name and has correct permissions destFile := filepath.Join(profilesDir, "source.conf") if _, err := os.Stat(destFile); os.IsNotExist(err) { t.Errorf("expected profile to be imported to %s", destFile) } var info os.FileInfo info, err = os.Stat(destFile) if err != nil { t.Fatalf("failed to stat imported profile: %v", err) } if info.Mode().Perm() != 0600 { t.Errorf("expected imported profile to have permissions 0600, got %o", info.Mode().Perm()) } // 2. Test importing with explicit name argument customName := "custom-vpn" appCustom := NewApp([]string{"wg-wrap", "profile", "import", srcFile, customName}) appCustom.ConfigDir = profilesDir err = appCustom.Route() if err != nil { t.Errorf("expected no error for custom name import, got %v", err) } destCustomFile := filepath.Join(profilesDir, customName+".conf") if _, err := os.Stat(destCustomFile); os.IsNotExist(err) { t.Errorf("expected profile to be imported to %s", destCustomFile) } info, err = os.Stat(destCustomFile) if err != nil { t.Fatalf("failed to stat imported profile: %v", err) } if info.Mode().Perm() != 0600 { t.Errorf("expected imported profile to have permissions 0600, got %o", info.Mode().Perm()) } // 3. Test duplicate import (should fail) appDup := NewApp([]string{"wg-wrap", "profile", "import", srcFile, customName}) appDup.ConfigDir = profilesDir err = appDup.Route() if err == nil { t.Errorf("expected error when importing duplicate profile, got nil") } } func TestProfileDelete(t *testing.T) { tmpDir := t.TempDir() profilesDir := filepath.Join(tmpDir, "profiles") err := os.MkdirAll(profilesDir, 0755) if err != nil { t.Fatalf("failed to create profiles dir: %v", err) } profileName := "test-profile" profileFile := filepath.Join(profilesDir, profileName+".conf") err = os.WriteFile(profileFile, []byte("[Interface]\nPrivateKey = test\n"), 0644) if err != nil { t.Fatalf("failed to create profile file: %v", err) } app := NewApp([]string{"wg-wrap", "profile", "delete", profileName}) app.ConfigDir = profilesDir err = app.Route() if err != nil { t.Errorf("expected no error, got %v", err) } if _, err := os.Stat(profileFile); !os.IsNotExist(err) { t.Errorf("expected profile file %s to be deleted", profileFile) } } func TestProfileDeleteNotFound(t *testing.T) { tmpDir := t.TempDir() app := NewApp([]string{"wg-wrap", "profile", "delete", "non-existent"}) app.ConfigDir = tmpDir err := app.Route() if err == nil { t.Errorf("expected error when deleting non-existent profile, got nil") } } func TestProfileConfigure(t *testing.T) { tmpDir := t.TempDir() profilesDir := filepath.Join(tmpDir, "profiles") err := os.MkdirAll(profilesDir, 0755) if err != nil { t.Fatalf("failed to create profiles dir: %v", err) } profileName := "test-profile" profileFile := filepath.Join(profilesDir, profileName+".conf") err = os.WriteFile(profileFile, []byte("[Interface]\nPrivateKey = test\n"), 0644) if err != nil { t.Fatalf("failed to create profile file: %v", err) } app := NewApp([]string{"wg-wrap", "profile", "configure", profileName}) app.ConfigDir = profilesDir // Use "true" as the mock editor to ensure it exits successfully immediately t.Setenv("EDITOR", "true") err = app.Route() if err != nil { t.Errorf("expected successful configuration, got error: %v", err) } }