gitproviders

package
v0.7.0-rc5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 28, 2022 License: MPL-2.0 Imports: 12 Imported by: 7

README

Cache system of gitproviders pkg

How it works

This cache system works through Cassettes. A Cassette is a yaml file that stores all the interactions made towards the github api where that same Cassette was involved. This file is generated the first time the tests using the same cassette are run. If the file exists, that cassette will be used to emulate the previously recorded responses.

How to implement a Cassette recorder

Set up environment variables
  • GITHUB_TOKEN is used for authentication.
  • GITHUB_ORG is used to specify the Github organization we want to test with.
  • GITHUB_USER is used to specify the Github account we want to test with.

Note: Only GITHUB_TOKEN is a must, the other can be set as needed.

Set up a recorder

To initialize the recorder, use the function getTestClientWithCassette:

client, recorder, err := getTestClientWithCassette("CASSETTE_NAME", "provider name")
  • client is the object from fluxcd/go-git-providers that was injected with the recorder and makes the api calls.
  • recorder is the object from dnaeon/go-vcr that helps to save the yaml file which is triggered by using recorder.Done().
  • CASSETTE_NAME name of the Cassette.
Complete implementation example using ginkgo
var _ = Describe("create github repo", func() {
	accounts := getAccounts()  

    var gitProvider defaultGitProvider
	var recorder *recorder.Recorder
	var err error
	BeforeEach(func() {
	    var client gitprovider.Client
		client, recorder, err = getTestClientWithCassette("CASSETTE_ID", "provider name")
		Expect(err).NotTo(HaveOccurred())
		gitProvider = defaultGitProvider{
			provider: client,
		}
	})

	It("should create a repository successfully", func() {
		err = gitProvider.CreateRepository(repoName, accounts.GithubOrgName, true)
		Expect(err).NotTo(HaveOccurred())
	})

	AfterEach(func() {
	    // delete org repo
		ctx := context.Background()
		orgRepoRef := NewOrgRepositoryRef(github.DefaultDomain, accounts.GithubOrgName, repoName)
		org, err := client.OrgRepositories().Get(ctx, orgRepoRef)
		Expect(err).NotTo(HaveOccurred())
		err = org.Delete(ctx)
		Expect(err).NotTo(HaveOccurred())
		// save Cassette in pkg/gitproviders/cache/CASSETTE_ID.yaml
		err = recorder.Stop()
		Expect(err).NotTo(HaveOccurred())
	})

})

Troubleshooting

  • If you face the error Requested interaction not found it means there is an api call that was not saved in the Cassette when it was created.
  • If you added more interactions to an existing test you will need to regenerate the Cassette yaml. To do so remove yaml file and rerun the test. Otherwise, you will get the previous error.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrRepositoryNoPermissionsOrDoesNotExist = errors.New("no permissions to access this repository or repository doesn't exists")

Functions

func NewOrgRepositoryRef

func NewOrgRepositoryRef(domain, org, repoName string) gitprovider.OrgRepositoryRef

func ViperGetStringMapString added in v0.6.0

func ViperGetStringMapString(key string) map[string]string

ViperGetStringMapString looks up a command line flag or env var in the format "foo=1,bar=2" GetStringMapString tries to JSON decode the env var If that fails (silently), try and decode the classic "foo=1,bar=2" form. https://github.com/spf13/viper/issues/911

Types

type AccountTypeGetter added in v0.3.1

type AccountTypeGetter func(provider gitprovider.Client, domain string, owner string) (ProviderAccountType, error)

type Client added in v0.5.0

type Client interface {
	GetProvider(repoUrl RepoURL, getAccountType AccountTypeGetter) (GitProvider, error)
}

type Config added in v0.2.2

type Config struct {
	// Provider defines the GitProvider.
	Provider GitProviderName

	// Hostname is the HTTP/S hostname of the Provider,
	// e.g. github.example.com.
	Hostname string

	// Token contains the token used to authenticate with the
	// Provider.
	Token string
}

Config defines the configuration for connecting to a GitProvider.

type GitProvider added in v0.2.2

type GitProvider interface {
	RepositoryExists(ctx context.Context, repoUrl RepoURL) (bool, error)
	DeployKeyExists(ctx context.Context, repoUrl RepoURL) (bool, error)
	GetDefaultBranch(ctx context.Context, repoUrl RepoURL) (string, error)
	GetRepoVisibility(ctx context.Context, repoUrl RepoURL) (*gitprovider.RepositoryVisibility, error)
	UploadDeployKey(ctx context.Context, repoUrl RepoURL, deployKey []byte) error
	CreatePullRequest(ctx context.Context, repoUrl RepoURL, prInfo PullRequestInfo) (gitprovider.PullRequest, error)
	GetCommits(ctx context.Context, repoUrl RepoURL, targetBranch string, pageSize int, pageToken int) ([]gitprovider.Commit, error)
	GetProviderDomain() string
	GetRepoDirFiles(ctx context.Context, repoUrl RepoURL, dirPath, targetBranch string) ([]*gitprovider.CommitFile, error)
	MergePullRequest(ctx context.Context, repoUrl RepoURL, pullRequestNumber int, commitMesage string) error
}

GitProvider Handler

func New added in v0.1.0

func New(config Config, owner string, getAccountType AccountTypeGetter) (GitProvider, error)

func NewDryRun added in v0.3.1

func NewDryRun() (GitProvider, error)

type GitProviderName added in v0.2.2

type GitProviderName string

GitProviderName holds a Git provider definition.

const (
	GitProviderGitHub GitProviderName = "github"
	GitProviderGitLab GitProviderName = "gitlab"
)

type ProviderAccountType added in v0.0.4

type ProviderAccountType string
const (
	AccountTypeUser ProviderAccountType = "user"
	AccountTypeOrg  ProviderAccountType = "organization"
	DeployKeyName                       = "wego-deploy-key"
)

func GetAccountType added in v0.0.4

func GetAccountType(provider gitprovider.Client, domain string, owner string) (ProviderAccountType, error)

type PullRequestInfo added in v0.3.1

type PullRequestInfo struct {
	Title                     string
	Description               string
	CommitMessage             string
	TargetBranch              string
	NewBranch                 string
	SkipAddingFilesOnCreation bool
	Files                     []gitprovider.CommitFile
}

type RepoURL added in v0.3.2

type RepoURL struct {
	// contains filtered or unexported fields
}

func NewRepoURL added in v0.3.2

func NewRepoURL(uri string) (RepoURL, error)

func (RepoURL) Owner added in v0.3.2

func (n RepoURL) Owner() string

func (RepoURL) Protocol added in v0.3.2

func (n RepoURL) Protocol() RepositoryURLProtocol

func (RepoURL) Provider added in v0.3.2

func (n RepoURL) Provider() GitProviderName

func (RepoURL) RepositoryName added in v0.3.2

func (n RepoURL) RepositoryName() string

func (RepoURL) String added in v0.3.2

func (n RepoURL) String() string

func (RepoURL) URL added in v0.3.2

func (n RepoURL) URL() *url.URL

type RepositoryURLProtocol added in v0.2.5

type RepositoryURLProtocol string
const RepositoryURLProtocolHTTPS RepositoryURLProtocol = "https"
const RepositoryURLProtocolSSH RepositoryURLProtocol = "ssh"

Directories

Path Synopsis
Code generated by counterfeiter.
Code generated by counterfeiter.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL