Skip to content

Commit

Permalink
Merge pull request #278 from shapehq/enhancement/githubprojectdatasou…
Browse files Browse the repository at this point in the history
…rce-refactor
  • Loading branch information
simonbs authored Jul 29, 2024
2 parents f0fc183 + 2229a45 commit 0fe523c
Show file tree
Hide file tree
Showing 12 changed files with 1,026 additions and 1,548 deletions.
1,832 changes: 499 additions & 1,333 deletions __test__/projects/GitHubProjectDataSource.test.ts

Large diffs are not rendered by default.

222 changes: 222 additions & 0 deletions __test__/projects/GitHubRepositoryDataSource.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
import {
GitHubRepositoryDataSource
} from "../../src/features/projects/data"

test("It loads repositories from data source", async () => {
let didLoadRepositories = false
const sut = new GitHubRepositoryDataSource({
repositoryNameSuffix: "-openapi",
projectConfigurationFilename: ".demo-docs.yml",
loginsDataSource: {
async getLogins() {
return ["acme"]
}
},
graphQlClient: {
async graphql() {
didLoadRepositories = true
return {
search: {
results: []
}
}
}
}
})
await sut.getRepositories()
expect(didLoadRepositories).toBeTruthy()
})

test("It maps repositories from GraphQL to the GitHubRepository model", async () => {
const sut = new GitHubRepositoryDataSource({
repositoryNameSuffix: "-openapi",
projectConfigurationFilename: ".demo-docs.yml",
loginsDataSource: {
async getLogins() {
return ["acme"]
}
},
graphQlClient: {
async graphql() {
return {
search: {
results: [{
name: "foo-openapi",
owner: {
login: "acme"
},
defaultBranchRef: {
name: "main",
target: {
oid: "12345678"
}
},
branches: {
edges: [{
node: {
name: "main",
target: {
oid: "12345678",
tree: {
entries: [{
name: "openapi.yml"
}]
}
}
}
}]
},
tags: {
edges: [{
node: {
name: "1.0",
target: {
oid: "12345678",
tree: {
entries: [{
name: "openapi.yml"
}]
}
}
}
}]
}
}]
}
}
}
}
})
const repositories = await sut.getRepositories()
expect(repositories).toEqual([{
name: "foo-openapi",
owner: "acme",
defaultBranchRef: {
id: "12345678",
name: "main"
},
branches: [{
id: "12345678",
name: "main",
files: [{
name: "openapi.yml"
}]
}],
tags: [{
id: "12345678",
name: "1.0",
files: [{
name: "openapi.yml"
}]
}]
}])
})

test("It queries for both .yml and .yaml file extension with specifying .yml extension", async () => {
let query: string | undefined
const sut = new GitHubRepositoryDataSource({
repositoryNameSuffix: "-openapi",
projectConfigurationFilename: ".demo-docs.yml",
loginsDataSource: {
async getLogins() {
return ["acme"]
}
},
graphQlClient: {
async graphql(request) {
query = request.query
return {
search: {
results: []
}
}
}
}
})
await sut.getRepositories()
expect(query).toContain(".demo-docs.yml")
expect(query).toContain(".demo-docs.yaml")
})

test("It queries for both .yml and .yaml file extension with specifying .yaml extension", async () => {
let query: string | undefined
const sut = new GitHubRepositoryDataSource({
repositoryNameSuffix: "-openapi",
projectConfigurationFilename: ".demo-docs.yml",
loginsDataSource: {
async getLogins() {
return ["acme"]
}
},
graphQlClient: {
async graphql(request) {
query = request.query
return {
search: {
results: []
}
}
}
}
})
await sut.getRepositories()
expect(query).toContain(".demo-docs.yml")
expect(query).toContain(".demo-docs.yaml")
})

test("It queries for both .yml and .yaml file extension with no extension", async () => {
let query: string | undefined
const sut = new GitHubRepositoryDataSource({
repositoryNameSuffix: "-openapi",
projectConfigurationFilename: ".demo-docs",
loginsDataSource: {
async getLogins() {
return ["acme"]
}
},
graphQlClient: {
async graphql(request) {
query = request.query
return {
search: {
results: []
}
}
}
}
})
await sut.getRepositories()
expect(query).toContain(".demo-docs.yml")
expect(query).toContain(".demo-docs.yaml")
})

test("It loads repositories for all logins", async () => {
let searchQueries: string[] = []
const sut = new GitHubRepositoryDataSource({
repositoryNameSuffix: "-openapi",
projectConfigurationFilename: ".demo-docs",
loginsDataSource: {
async getLogins() {
return ["acme", "somecorp", "techsystems"]
}
},
graphQlClient: {
async graphql(request) {
if (request.variables?.searchQuery) {
searchQueries.push(request.variables.searchQuery)
}
return {
search: {
results: []
}
}
}
}
})
await sut.getRepositories()
expect(searchQueries.length).toEqual(4)
expect(searchQueries).toContain("\"-openapi\" in:name is:private")
expect(searchQueries).toContain("\"-openapi\" in:name user:acme is:public")
expect(searchQueries).toContain("\"-openapi\" in:name user:somecorp is:public")
expect(searchQueries).toContain("\"-openapi\" in:name user:techsystems is:public")
})
16 changes: 10 additions & 6 deletions src/composition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import {
} from "@/common"
import {
GitHubLoginDataSource,
GitHubProjectDataSource
GitHubProjectDataSource,
GitHubRepositoryDataSource
} from "@/features/projects/data"
import {
CachingProjectDataSource,
Expand Down Expand Up @@ -157,12 +158,15 @@ export const projectRepository = new ProjectRepository({

export const projectDataSource = new CachingProjectDataSource({
dataSource: new GitHubProjectDataSource({
loginsDataSource: new GitHubLoginDataSource({
graphQlClient: userGitHubClient
repositoryDataSource: new GitHubRepositoryDataSource({
loginsDataSource: new GitHubLoginDataSource({
graphQlClient: userGitHubClient
}),
graphQlClient: userGitHubClient,
repositoryNameSuffix: env.getOrThrow("REPOSITORY_NAME_SUFFIX"),
projectConfigurationFilename: env.getOrThrow("SHAPE_DOCS_PROJECT_CONFIGURATION_FILENAME")
}),
graphQlClient: userGitHubClient,
repositoryNameSuffix: env.getOrThrow("REPOSITORY_NAME_SUFFIX"),
projectConfigurationFilename: env.getOrThrow("SHAPE_DOCS_PROJECT_CONFIGURATION_FILENAME")
repositoryNameSuffix: env.getOrThrow("REPOSITORY_NAME_SUFFIX")
}),
repository: projectRepository
})
Expand Down
3 changes: 1 addition & 2 deletions src/features/projects/data/GitHubLoginDataSource.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import IGitHubLoginDataSource from "./IGitHubLoginDataSource"
import IGitHubGraphQLClient from "./IGitHubGraphQLClient"
import { IGitHubLoginDataSource, IGitHubGraphQLClient } from "../domain"

export default class GitHubLoginDataSource implements IGitHubLoginDataSource {
private readonly graphQlClient: IGitHubGraphQLClient
Expand Down
Loading

0 comments on commit 0fe523c

Please sign in to comment.