From 4e92f24f2a64627c84394180ae2af7bf3423b39d Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Tue, 2 Feb 2021 14:52:55 +0000
Subject: [PATCH 01/12] Add unstyled/prototype product feedback page
---
.../settings/feedback/ProductFeedback.tsx | 25 +++++++++++++++++++
client/web/src/user/settings/routes.tsx | 8 ++++++
client/web/src/user/settings/sidebaritems.ts | 7 ++++++
3 files changed, 40 insertions(+)
create mode 100644 client/web/src/user/settings/feedback/ProductFeedback.tsx
diff --git a/client/web/src/user/settings/feedback/ProductFeedback.tsx b/client/web/src/user/settings/feedback/ProductFeedback.tsx
new file mode 100644
index 000000000000..6954d3f72579
--- /dev/null
+++ b/client/web/src/user/settings/feedback/ProductFeedback.tsx
@@ -0,0 +1,25 @@
+import React, { useEffect } from 'react'
+import { TelemetryProps } from '../../../../../shared/src/telemetry/telemetryService'
+
+interface Props extends TelemetryProps {}
+
+export const ProductFeedbackPage: React.FunctionComponent = ({ telemetryService }) => {
+ useEffect(() => {
+ telemetryService.logViewEvent('UserSettingsRepositories')
+ }, [telemetryService])
+
+ return (
+ <>
+ Product research and feedback
+
+ Our product team conducts occasional research to learn about how you use Sourcegraph and ask for
+ feedback about upcoming ideas. Sign up to participate in our research and help us shape the future of
+ our product!Î
+
+ {/* TODO: Add button icon */}
+
+ Sign up now
+
+ >
+ )
+}
diff --git a/client/web/src/user/settings/routes.tsx b/client/web/src/user/settings/routes.tsx
index 182dafbac8cc..b796ee4bf02c 100644
--- a/client/web/src/user/settings/routes.tsx
+++ b/client/web/src/user/settings/routes.tsx
@@ -135,4 +135,12 @@ export const userSettingsAreaRoutes: readonly UserSettingsAreaRoute[] = [
props.authenticatedUser.tags.includes('AllowUserExternalServicePublic')) ||
props.user.tags?.includes('AllowUserExternalServicePublic'),
},
+ {
+ path: '/product-research',
+ exact: true,
+ render: lazyComponent(() => import('./feedback/ProductFeedback'), 'ProductFeedbackPage'),
+ condition: () =>
+ // TODO: Gate correctly and allow admins to disable
+ true,
+ },
]
diff --git a/client/web/src/user/settings/sidebaritems.ts b/client/web/src/user/settings/sidebaritems.ts
index 1e40490539db..c8d7b9ec1291 100644
--- a/client/web/src/user/settings/sidebaritems.ts
+++ b/client/web/src/user/settings/sidebaritems.ts
@@ -47,5 +47,12 @@ export const userSettingsSideBarItems: UserSettingsSidebarItems = {
props.authenticatedUser.tags.includes('AllowUserExternalServicePublic')) ||
props.user.tags?.includes('AllowExternalServicePublic'),
},
+ {
+ label: 'Product research',
+ to: '/product-research',
+ condition: () =>
+ // TODO: Gate correctly and allow admins to disable
+ true,
+ },
],
}
From ea43b4c102da8f6f86fc41ce16a0784a0da8c975 Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Wed, 3 Feb 2021 15:03:42 +0000
Subject: [PATCH 02/12] Update Product Feedback page styling
---
client/web/src/user/settings/feedback/ProductFeedback.tsx | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/client/web/src/user/settings/feedback/ProductFeedback.tsx b/client/web/src/user/settings/feedback/ProductFeedback.tsx
index 6954d3f72579..d7f8f116a0a7 100644
--- a/client/web/src/user/settings/feedback/ProductFeedback.tsx
+++ b/client/web/src/user/settings/feedback/ProductFeedback.tsx
@@ -10,14 +10,13 @@ export const ProductFeedbackPage: React.FunctionComponent = ({ telemetryS
return (
<>
- Product research and feedback
+ Product research and feedback
Our product team conducts occasional research to learn about how you use Sourcegraph and ask for
feedback about upcoming ideas. Sign up to participate in our research and help us shape the future of
our product!Î
- {/* TODO: Add button icon */}
-
+
Sign up now
>
From 21874f381651853f7499d4a0a5e4393fa5df245b Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Thu, 4 Feb 2021 08:51:53 +0000
Subject: [PATCH 03/12] Add logic for admins to allow admins to toggle the
product reseearch page
---
client/web/src/jscontext.ts | 2 ++
.../ProductFeedback.tsx => research/ProductResearch.tsx} | 8 ++++----
client/web/src/user/settings/routes.tsx | 2 +-
cmd/frontend/internal/app/jscontext/jscontext.go | 2 ++
schema/schema.go | 2 ++
schema/site.schema.json | 7 +++++++
schema/site_stringdata.go | 7 +++++++
7 files changed, 25 insertions(+), 5 deletions(-)
rename client/web/src/user/settings/{feedback/ProductFeedback.tsx => research/ProductResearch.tsx} (75%)
diff --git a/client/web/src/jscontext.ts b/client/web/src/jscontext.ts
index 22caddf87976..547eccb11f1e 100644
--- a/client/web/src/jscontext.ts
+++ b/client/web/src/jscontext.ts
@@ -113,6 +113,8 @@ export interface SourcegraphContext extends Pick, 'e
brandName: string
}
+ productResearchPageEnabled?: boolean
+
/** The publishable key for the billing service (Stripe). */
billingPublishableKey?: string
}
diff --git a/client/web/src/user/settings/feedback/ProductFeedback.tsx b/client/web/src/user/settings/research/ProductResearch.tsx
similarity index 75%
rename from client/web/src/user/settings/feedback/ProductFeedback.tsx
rename to client/web/src/user/settings/research/ProductResearch.tsx
index d7f8f116a0a7..9ac6c1b18182 100644
--- a/client/web/src/user/settings/feedback/ProductFeedback.tsx
+++ b/client/web/src/user/settings/research/ProductResearch.tsx
@@ -3,10 +3,10 @@ import { TelemetryProps } from '../../../../../shared/src/telemetry/telemetrySer
interface Props extends TelemetryProps {}
-export const ProductFeedbackPage: React.FunctionComponent = ({ telemetryService }) => {
+export const ProductResearchPage: React.FunctionComponent = props => {
useEffect(() => {
- telemetryService.logViewEvent('UserSettingsRepositories')
- }, [telemetryService])
+ props.telemetryService.logViewEvent('UserSettingsRepositories')
+ }, [props.telemetryService])
return (
<>
@@ -14,7 +14,7 @@ export const ProductFeedbackPage: React.FunctionComponent = ({ telemetryS
Our product team conducts occasional research to learn about how you use Sourcegraph and ask for
feedback about upcoming ideas. Sign up to participate in our research and help us shape the future of
- our product!Î
+ our product!
Sign up now
diff --git a/client/web/src/user/settings/routes.tsx b/client/web/src/user/settings/routes.tsx
index b796ee4bf02c..be630069c8ef 100644
--- a/client/web/src/user/settings/routes.tsx
+++ b/client/web/src/user/settings/routes.tsx
@@ -138,7 +138,7 @@ export const userSettingsAreaRoutes: readonly UserSettingsAreaRoute[] = [
{
path: '/product-research',
exact: true,
- render: lazyComponent(() => import('./feedback/ProductFeedback'), 'ProductFeedbackPage'),
+ render: lazyComponent(() => import('./research/ProductResearch'), 'ProductResearchPage'),
condition: () =>
// TODO: Gate correctly and allow admins to disable
true,
diff --git a/cmd/frontend/internal/app/jscontext/jscontext.go b/cmd/frontend/internal/app/jscontext/jscontext.go
index 8183d0372f93..2095ca337dd9 100644
--- a/cmd/frontend/internal/app/jscontext/jscontext.go
+++ b/cmd/frontend/internal/app/jscontext/jscontext.go
@@ -88,6 +88,8 @@ type JSContext struct {
CodeIntelAutoIndexingEnabled bool `json:"codeIntelAutoIndexingEnabled"`
+ ProductResearchPageEnabled bool `json:"productResearchPageEnabled"`
+
ExperimentalFeatures schema.ExperimentalFeatures `json:"experimentalFeatures"`
}
diff --git a/schema/schema.go b/schema/schema.go
index 54b8a8024a8d..00457b351295 100644
--- a/schema/schema.go
+++ b/schema/schema.go
@@ -1303,6 +1303,8 @@ type SiteConfiguration struct {
ParentSourcegraph *ParentSourcegraph `json:"parentSourcegraph,omitempty"`
// PermissionsUserMapping description: Settings for Sourcegraph permissions, which allow the site admin to explicitly manage repository permissions via the GraphQL API. This setting cannot be enabled if repository permissions for any specific external service are enabled (i.e., when the external service's `authorization` field is set).
PermissionsUserMapping *PermissionsUserMapping `json:"permissions.userMapping,omitempty"`
+ // ProductResearchPageEnabled description: Enables users access to the product research page in their settings.
+ ProductResearchPageEnabled *bool `json:"productResearchPage.enabled,omitempty"`
// RepoConcurrentExternalServiceSyncers description: The number of concurrent external service syncers that can run.
RepoConcurrentExternalServiceSyncers int `json:"repoConcurrentExternalServiceSyncers,omitempty"`
// RepoListUpdateInterval description: Interval (in minutes) for checking code hosts (such as GitHub, Gitolite, etc.) for new repositories.
diff --git a/schema/site.schema.json b/schema/site.schema.json
index 33a1a25a0405..653b7318bb61 100644
--- a/schema/site.schema.json
+++ b/schema/site.schema.json
@@ -885,6 +885,13 @@
"type": "integer",
"default": 2000,
"group": "Misc."
+ },
+ "productResearchPage.enabled": {
+ "description": "Enables users access to the product research page in their settings.",
+ "type": "boolean",
+ "!go": { "pointer": true },
+ "default": true,
+ "group": "Misc."
}
},
"definitions": {
diff --git a/schema/site_stringdata.go b/schema/site_stringdata.go
index dcb39eebcfba..8d0e5442c20d 100644
--- a/schema/site_stringdata.go
+++ b/schema/site_stringdata.go
@@ -890,6 +890,13 @@ const SiteSchemaJSON = `{
"type": "integer",
"default": 2000,
"group": "Misc."
+ },
+ "productResearchPage.enabled": {
+ "description": "Enables users access to the product research page in their settings.",
+ "type": "boolean",
+ "!go": { "pointer": true },
+ "default": true,
+ "group": "Misc."
}
},
"definitions": {
From c0f7f6dd391858bab3dc45f2f785d71b27ac70b6 Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Thu, 4 Feb 2021 10:40:07 +0000
Subject: [PATCH 04/12] Add button icon
---
client/web/src/user/settings/research/ProductResearch.tsx | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/client/web/src/user/settings/research/ProductResearch.tsx b/client/web/src/user/settings/research/ProductResearch.tsx
index 9ac6c1b18182..7193ef3db283 100644
--- a/client/web/src/user/settings/research/ProductResearch.tsx
+++ b/client/web/src/user/settings/research/ProductResearch.tsx
@@ -1,11 +1,12 @@
import React, { useEffect } from 'react'
import { TelemetryProps } from '../../../../../shared/src/telemetry/telemetryService'
+import OpenInNew from 'mdi-react/OpenInNewIcon'
interface Props extends TelemetryProps {}
export const ProductResearchPage: React.FunctionComponent = props => {
useEffect(() => {
- props.telemetryService.logViewEvent('UserSettingsRepositories')
+ props.telemetryService.logViewEvent('UserSettingsProductResearch')
}, [props.telemetryService])
return (
@@ -17,7 +18,7 @@ export const ProductResearchPage: React.FunctionComponent = props => {
our product!
- Sign up now
+ Sign up now
>
)
From 6788ce65b16477fd9f5a789e353480da53317a07 Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Thu, 4 Feb 2021 10:40:43 +0000
Subject: [PATCH 05/12] Open Sign up now link in new tab
---
client/web/src/user/settings/research/ProductResearch.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/client/web/src/user/settings/research/ProductResearch.tsx b/client/web/src/user/settings/research/ProductResearch.tsx
index 7193ef3db283..3670f3f28bfe 100644
--- a/client/web/src/user/settings/research/ProductResearch.tsx
+++ b/client/web/src/user/settings/research/ProductResearch.tsx
@@ -17,7 +17,7 @@ export const ProductResearchPage: React.FunctionComponent = props => {
feedback about upcoming ideas. Sign up to participate in our research and help us shape the future of
our product!
-
+
Sign up now
>
From 6edda386b13b5c0501c23dd2ec3d3e09697fa6cb Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Fri, 5 Feb 2021 12:07:05 +0000
Subject: [PATCH 06/12] Add tests
---
.../code-hosts/shared/codeHost.test.tsx | 8 ++--
.../src/components/CodeExcerpt.test.tsx | 6 +--
.../shared/src/components/FileMatch.test.tsx | 2 +-
.../src/components/FileMatchChildren.test.tsx | 2 +-
.../src/components/ResultContainer.test.tsx | 12 ++---
.../web/src/search/input/SearchPage.test.tsx | 10 ++---
.../search/queryBuilder/QueryBuilder.test.tsx | 24 +++++-----
.../search/results/SearchResultsList.test.tsx | 22 ++++-----
.../research/ProductResearch.test.tsx | 28 ++++++++++++
.../settings/research/ProductResearch.tsx | 23 +++++++---
jest.config.base.js | 6 ++-
package.json | 2 +
yarn.lock | 45 ++++++++++++++++++-
13 files changed, 139 insertions(+), 51 deletions(-)
create mode 100644 client/web/src/user/settings/research/ProductResearch.test.tsx
diff --git a/client/browser/src/shared/code-hosts/shared/codeHost.test.tsx b/client/browser/src/shared/code-hosts/shared/codeHost.test.tsx
index 7f8750ee770d..d144a1d3c618 100644
--- a/client/browser/src/shared/code-hosts/shared/codeHost.test.tsx
+++ b/client/browser/src/shared/code-hosts/shared/codeHost.test.tsx
@@ -268,7 +268,7 @@ describe('codeHost', () => {
type: 'CodeEditor',
},
])
- expect(codeView.classList.contains('sg-mounted')).toBe(true)
+ expect(codeView).toHaveClass('sg-mounted')
const toolbar = elementRenderedAtMount(toolbarMount)
expect(toolbar).not.toBeUndefined()
})
@@ -347,7 +347,7 @@ describe('codeHost', () => {
])
await decorated()
expect(line.querySelectorAll('.line-decoration-attachment')).toHaveLength(1)
- expect(line.querySelector('.line-decoration-attachment')!.textContent).toEqual('test decoration')
+ expect(line.querySelector('.line-decoration-attachment')!).toHaveTextContent('test decoration')
// Decorate the code view again, and verify that previous decorations
// are cleaned up and replaced by the new decorations.
@@ -372,7 +372,7 @@ describe('codeHost', () => {
)
.toPromise()
expect(line.querySelectorAll('.line-decoration-attachment').length).toBe(1)
- expect(line.querySelector('.line-decoration-attachment')!.textContent).toEqual('test decoration 2')
+ expect(line.querySelector('.line-decoration-attachment')!).toHaveTextContent('test decoration 2')
})
it('decorates a diff code view', async () => {
@@ -785,7 +785,7 @@ describe('codeHost', () => {
expect(services.viewer.viewers.size).toEqual(1)
codeView.dispatchEvent(new MouseEvent('mouseover'))
sinon.assert.called(dom.getCodeElementFromTarget)
- expect(nativeTooltip.classList.contains('native-tooltip--hidden')).toBe(true)
+ expect(nativeTooltip).toHaveClass('native-tooltip--hidden')
})
test('gracefully handles viewing private repos on a public Sourcegraph instance', async () => {
diff --git a/client/shared/src/components/CodeExcerpt.test.tsx b/client/shared/src/components/CodeExcerpt.test.tsx
index 07b14cf39b0c..1e1a01e856fa 100644
--- a/client/shared/src/components/CodeExcerpt.test.tsx
+++ b/client/shared/src/components/CodeExcerpt.test.tsx
@@ -69,9 +69,9 @@ describe('CodeExcerpt', () => {
it('renders the code portion of each row', () => {
const { container } = render()
- expect(getByText(container, 'first of code')).toBeTruthy()
- expect(getByText(container, 'second of code')).toBeTruthy()
- expect(getByText(container, 'third of code')).toBeTruthy()
+ expect(getByText(container, 'first of code')).toBeVisible()
+ expect(getByText(container, 'second of code')).toBeVisible()
+ expect(getByText(container, 'third of code')).toBeVisible()
})
it('highlights matches correctly', () => {
diff --git a/client/shared/src/components/FileMatch.test.tsx b/client/shared/src/components/FileMatch.test.tsx
index 07df4ff65764..06e35ae5c153 100644
--- a/client/shared/src/components/FileMatch.test.tsx
+++ b/client/shared/src/components/FileMatch.test.tsx
@@ -31,7 +31,7 @@ describe('FileMatch', () => {
it('renders one result container', () => {
const { container } = render()
- expect(getByTestId(container, 'result-container')).toBeTruthy()
+ expect(getByTestId(container, 'result-container')).toBeVisible()
expect(getAllByTestId(container, 'result-container').length).toBe(1)
})
})
diff --git a/client/shared/src/components/FileMatchChildren.test.tsx b/client/shared/src/components/FileMatchChildren.test.tsx
index b5be98203c44..919096311aa0 100644
--- a/client/shared/src/components/FileMatchChildren.test.tsx
+++ b/client/shared/src/components/FileMatchChildren.test.tsx
@@ -51,7 +51,7 @@ describe('FileMatchChildren', () => {
it('calls onSelect callback when an item is clicked', () => {
const { container } = render()
const item = container.querySelector('.file-match-children__item')
- expect(item).toBeTruthy()
+ expect(item).toBeVisible()
fireEvent.click(item!)
expect(onSelect.calledOnce).toBe(true)
})
diff --git a/client/shared/src/components/ResultContainer.test.tsx b/client/shared/src/components/ResultContainer.test.tsx
index f7fe9b60be38..e6561fe9ba48 100644
--- a/client/shared/src/components/ResultContainer.test.tsx
+++ b/client/shared/src/components/ResultContainer.test.tsx
@@ -111,7 +111,7 @@ describe('ResultContainer', () => {
expect(expandedItems.length).toBe(1)
const header = container.querySelector('.result-container__header--collapsible')
- expect(header).toBeTruthy()
+ expect(header).toBeVisible()
fireEvent.click(header!)
@@ -122,19 +122,19 @@ describe('ResultContainer', () => {
it('displays the expand label when collapsed', () => {
const { container } = render()
const header = getByTestId(container, 'result-container-header')
- expect(header).toBeTruthy()
- expect(getByText(container, 'Show matches')).toBeTruthy()
+ expect(header).toBeVisible()
+ expect(getByText(container, 'Show matches')).toBeVisible()
})
it('displays the collapse label when expanded', () => {
const { container } = render()
const clickableHeader = container.querySelector('.result-container__header--collapsible')
- expect(clickableHeader).toBeTruthy()
+ expect(clickableHeader).toBeVisible()
fireEvent.click(clickableHeader!)
- expect(getByText(container, 'Hide matches')).toBeTruthy()
+ expect(getByText(container, 'Hide matches')).toBeVisible()
})
it('displays all results by default, when allExpanded is true', () => {
@@ -151,7 +151,7 @@ describe('ResultContainer', () => {
expect(expandedItems.length).toBe(5)
const header = container.querySelector('.result-container__header--collapsible')
- expect(header).toBeTruthy()
+ expect(header).toBeVisible()
fireEvent.click(header!)
expandedItems = container.querySelectorAll('.file-match-children__item')
diff --git a/client/web/src/search/input/SearchPage.test.tsx b/client/web/src/search/input/SearchPage.test.tsx
index 8bfa635eacfc..f9de1e9d5714 100644
--- a/client/web/src/search/input/SearchPage.test.tsx
+++ b/client/web/src/search/input/SearchPage.test.tsx
@@ -61,14 +61,14 @@ describe('SearchPage', () => {
it('should not show home panels if on Sourcegraph.com and showEnterpriseHomePanels disabled', () => {
container = render().container
const homePanels = container.querySelector('.home-panels')
- expect(homePanels).toBeFalsy()
+ expect(homePanels).not.toBeInTheDocument()
})
it('should show home panels if on Sourcegraph.com and showEnterpriseHomePanels enabled', () => {
container = render()
.container
const homePanels = container.querySelector('.home-panels')
- expect(homePanels).toBeTruthy()
+ expect(homePanels).toBeVisible()
})
it('should show home panels if on Sourcegraph.com and showEnterpriseHomePanels enabled with user logged out', () => {
@@ -81,18 +81,18 @@ describe('SearchPage', () => {
/>
).container
const homePanels = container.querySelector('.home-panels')
- expect(homePanels).toBeFalsy()
+ expect(homePanels).not.toBeInTheDocument()
})
it('should not show home panels if showEnterpriseHomePanels disabled', () => {
container = render().container
const homePanels = container.querySelector('.home-panels')
- expect(homePanels).toBeFalsy()
+ expect(homePanels).not.toBeInTheDocument()
})
it('should show home panels if showEnterpriseHomePanels enabled and not on Sourcegraph.com', () => {
container = render().container
const homePanels = container.querySelector('.home-panels')
- expect(homePanels).toBeTruthy()
+ expect(homePanels).toBeVisible()
})
})
diff --git a/client/web/src/search/queryBuilder/QueryBuilder.test.tsx b/client/web/src/search/queryBuilder/QueryBuilder.test.tsx
index f3ff1c8c9b6c..79ae3a121f94 100644
--- a/client/web/src/search/queryBuilder/QueryBuilder.test.tsx
+++ b/client/web/src/search/queryBuilder/QueryBuilder.test.tsx
@@ -65,10 +65,10 @@ describe('QueryBuilder', () => {
})
it('checks that the "Author", "Before", "After", and "Message" fields do not exist if the search type is set to code search', () => {
- expect(queryByTestId(container, 'test-author')).toBeNull()
- expect(queryByTestId(container, 'test-after')).toBeNull()
- expect(queryByTestId(container, 'test-before')).toBeNull()
- expect(queryByTestId(container, 'test-message')).toBeNull()
+ expect(queryByTestId(container, 'test-author')).not.toBeInTheDocument()
+ expect(queryByTestId(container, 'test-after')).not.toBeInTheDocument()
+ expect(queryByTestId(container, 'test-before')).not.toBeInTheDocument()
+ expect(queryByTestId(container, 'test-message')).not.toBeInTheDocument()
})
it('checks that the "Author", "Before", "After", and "Message" fields exist if the search type is set to diff search', async () => {
@@ -76,13 +76,13 @@ describe('QueryBuilder', () => {
fireEvent.change(typeField, { target: { value: 'diff' } })
await waitFor(() => queryByTestId(container, 'test-author'))
- expect(queryByTestId(container, 'test-author')).toBeTruthy()
+ expect(queryByTestId(container, 'test-author')).toBeVisible()
await waitFor(() => queryByTestId(container, 'test-after'))
- expect(queryByTestId(container, 'test-after')).toBeTruthy()
+ expect(queryByTestId(container, 'test-after')).toBeVisible()
await waitFor(() => queryByTestId(container, 'test-before'))
- expect(queryByTestId(container, 'test-before')).toBeTruthy()
+ expect(queryByTestId(container, 'test-before')).toBeVisible()
await waitFor(() => queryByTestId(container, 'test-message'))
- expect(queryByTestId(container, 'test-message')).toBeTruthy()
+ expect(queryByTestId(container, 'test-message')).toBeVisible()
})
it('checks that the "Author", "Before", and "After" fields exist if type is commit', async () => {
@@ -90,13 +90,13 @@ describe('QueryBuilder', () => {
fireEvent.change(typeField, { target: { value: 'commit' } })
await waitFor(() => queryByTestId(container, 'test-author'))
- expect(queryByTestId(container, 'test-author')).toBeTruthy()
+ expect(queryByTestId(container, 'test-author')).toBeVisible()
await waitFor(() => queryByTestId(container, 'test-after'))
- expect(queryByTestId(container, 'test-after')).toBeTruthy()
+ expect(queryByTestId(container, 'test-after')).toBeVisible()
await waitFor(() => queryByTestId(container, 'test-before'))
- expect(queryByTestId(container, 'test-before')).toBeTruthy()
+ expect(queryByTestId(container, 'test-before')).toBeVisible()
await waitFor(() => queryByTestId(container, 'test-message'))
- expect(queryByTestId(container, 'test-message')).toBeTruthy()
+ expect(queryByTestId(container, 'test-message')).toBeVisible()
})
it('fires the onFieldsQueryChange prop handler with the "author:" filter when updating the "Author" field', async () => {
diff --git a/client/web/src/search/results/SearchResultsList.test.tsx b/client/web/src/search/results/SearchResultsList.test.tsx
index 22013f34611f..de5a64243308 100644
--- a/client/web/src/search/results/SearchResultsList.test.tsx
+++ b/client/web/src/search/results/SearchResultsList.test.tsx
@@ -132,7 +132,7 @@ describe('SearchResultsList', () => {
)
- expect(queryByTestId(container, 'loading-container')).toBeTruthy()
+ expect(queryByTestId(container, 'loading-container')).toBeVisible()
})
it('shows error message when the search GraphQL request returns an error', () => {
@@ -141,7 +141,7 @@ describe('SearchResultsList', () => {
)
- expect(getByTestId(container, 'search-results-list-error')).toBeTruthy()
+ expect(getByTestId(container, 'search-results-list-error')).toBeVisible()
})
it('renders the search results info bar when there are results', () => {
@@ -150,7 +150,7 @@ describe('SearchResultsList', () => {
)
- expect(getByTestId(container, 'results-info-bar')).toBeTruthy()
+ expect(getByTestId(container, 'results-info-bar')).toBeVisible()
})
it('renders one search result', () => {
@@ -159,7 +159,7 @@ describe('SearchResultsList', () => {
)
- expect(getByTestId(container, 'result-container')).toBeTruthy()
+ expect(getByTestId(container, 'result-container')).toBeVisible()
expect(getAllByTestId(container, 'result-container').length).toBe(1)
})
@@ -169,8 +169,8 @@ describe('SearchResultsList', () => {
)
- expect(queryByTestId(container, 'loading-container')).toBeFalsy()
- expect(queryByTestId(container, 'search-results-list-error')).toBeFalsy()
+ expect(queryByTestId(container, 'loading-container')).not.toBeInTheDocument()
+ expect(queryByTestId(container, 'search-results-list-error')).not.toBeInTheDocument()
})
it('renders correct number of search results if there are multiple', () => {
@@ -199,7 +199,7 @@ describe('SearchResultsList', () => {
)
- expect(getByTestId(container, 'search-show-more-button')).toBeTruthy()
+ expect(getByTestId(container, 'search-show-more-button')).toBeVisible()
})
it('does not display "Show More" if the limit isn\'t hit', () => {
@@ -265,7 +265,7 @@ describe('SearchResultsList', () => {
)
scrollToBottom()
- expect(getByTestId(container, 'search-show-more-button')).toBeTruthy()
+ expect(getByTestId(container, 'search-show-more-button')).toBeVisible()
})
it('does not add filters to query in search suggestions link', () => {
@@ -295,7 +295,7 @@ describe('SearchResultsList', () => {
)
const link = getByTestId(container, 'proposed-query-link') as HTMLAnchorElement
- expect(link).toBeTruthy()
+ expect(link).toBeVisible()
expect(link.href).toStrictEqual('http://localhost/search?q=repo:test1%7Ctest2&patternType=regexp')
})
@@ -328,8 +328,8 @@ describe('SearchResultsList', () => {
const link = getByTestId(container, 'proposed-query-link') as HTMLAnchorElement
const result = getByTestId(container, 'result-container')
- expect(link).toBeTruthy()
- expect(result).toBeTruthy()
+ expect(link).toBeVisible()
+ expect(result).toBeVisible()
expect(link.compareDocumentPosition(result)).toStrictEqual(link.DOCUMENT_POSITION_FOLLOWING)
})
})
diff --git a/client/web/src/user/settings/research/ProductResearch.test.tsx b/client/web/src/user/settings/research/ProductResearch.test.tsx
new file mode 100644
index 000000000000..b2abef4284fb
--- /dev/null
+++ b/client/web/src/user/settings/research/ProductResearch.test.tsx
@@ -0,0 +1,28 @@
+import React from 'react'
+import { render, RenderResult } from '@testing-library/react'
+import * as sinon from 'sinon'
+import { ProductResearchPage } from './ProductResearch'
+import { AuthenticatedUser } from '../../../auth'
+import { TelemetryService } from '../../../../../shared/src/telemetry/telemetryService'
+
+describe('ProductResearchPage', () => {
+ let queries: RenderResult
+ const mockTelemetryService = { logViewEvent: sinon.spy(), log: sinon.spy() } as TelemetryService
+ const mockAuthenticatedUser = { email: 'test@sourcegraph.com' } as AuthenticatedUser
+
+ beforeEach(() => {
+ queries = render(
+
+ )
+ })
+
+ test('Renders page correctly', () => {
+ expect(queries.getByText('Product research and feedback')).toBeVisible()
+ })
+
+ test('renders sign up now link correctly', () => {
+ expect(queries.getByText('Sign up now').closest('a')?.href).toMatchInlineSnapshot(
+ '"https://share.hsforms.com/1tkScUc65Tm-Yu98zUZcLGw1n7ku?email=test@sourcegraph.com"'
+ )
+ })
+})
diff --git a/client/web/src/user/settings/research/ProductResearch.tsx b/client/web/src/user/settings/research/ProductResearch.tsx
index 3670f3f28bfe..618015731baf 100644
--- a/client/web/src/user/settings/research/ProductResearch.tsx
+++ b/client/web/src/user/settings/research/ProductResearch.tsx
@@ -1,13 +1,19 @@
import React, { useEffect } from 'react'
-import { TelemetryProps } from '../../../../../shared/src/telemetry/telemetryService'
import OpenInNew from 'mdi-react/OpenInNewIcon'
+import { TelemetryService } from '../../../../../shared/src/telemetry/telemetryService'
+import { AuthenticatedUser } from '../../../auth'
-interface Props extends TelemetryProps {}
+interface Props {
+ telemetryService: TelemetryService
+ authenticatedUser: AuthenticatedUser
+}
+
+const PRODUCT_RESEARCH_SIGNUP_FORM = 'https://share.hsforms.com/1tkScUc65Tm-Yu98zUZcLGw1n7ku'
-export const ProductResearchPage: React.FunctionComponent = props => {
+export const ProductResearchPage: React.FunctionComponent = ({ telemetryService, authenticatedUser }) => {
useEffect(() => {
- props.telemetryService.logViewEvent('UserSettingsProductResearch')
- }, [props.telemetryService])
+ telemetryService.logViewEvent('UserSettingsProductResearch')
+ }, [telemetryService])
return (
<>
@@ -17,7 +23,12 @@ export const ProductResearchPage: React.FunctionComponent = props => {
feedback about upcoming ideas. Sign up to participate in our research and help us shape the future of
our product!
-
+
Sign up now
>
diff --git a/jest.config.base.js b/jest.config.base.js
index 05694c1271e6..817b904698f9 100644
--- a/jest.config.base.js
+++ b/jest.config.base.js
@@ -59,7 +59,11 @@ const config = {
// Enzyme setup file
path.join(__dirname, 'client/shared/dev/enzymeSetup.js'),
],
- setupFilesAfterEnv: [require.resolve('core-js/stable'), require.resolve('regenerator-runtime/runtime')],
+ setupFilesAfterEnv: [
+ require.resolve('core-js/stable'),
+ require.resolve('regenerator-runtime/runtime'),
+ require.resolve('@testing-library/jest-dom'),
+ ],
globalSetup: path.join(__dirname, 'client/shared/dev/jestGlobalSetup.js'),
snapshotSerializers: [path.join(__dirname, 'client/shared/dev/enzymeSerializer.js')],
}
diff --git a/package.json b/package.json
index bc5c9e9d01b2..4f436b09ee25 100644
--- a/package.json
+++ b/package.json
@@ -109,6 +109,7 @@
"@storybook/core": "^6.1.11",
"@storybook/react": "^6.1.11",
"@storybook/theming": "^6.1.11",
+ "@testing-library/jest-dom": "^5.11.9",
"@testing-library/react": "^10.4.8",
"@testing-library/react-hooks": "^3.4.1",
"@types/babel__core": "7.1.12",
@@ -164,6 +165,7 @@
"@types/sinon": "9.0.4",
"@types/socket.io": "2.1.10",
"@types/socket.io-client": "1.4.33",
+ "@types/testing-library__jest-dom": "^5.9.5",
"@types/textarea-caret": "3.0.0",
"@types/uuid": "8.0.1",
"@types/webpack": "4.41.25",
diff --git a/yarn.lock b/yarn.lock
index 6fc86ff3a015..8e478fdf6e65 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3235,6 +3235,20 @@
dom-accessibility-api "^0.4.5"
pretty-format "^25.5.0"
+"@testing-library/jest-dom@^5.11.9":
+ version "5.11.9"
+ resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.9.tgz#e6b3cd687021f89f261bd53cbe367041fbd3e975"
+ integrity sha512-Mn2gnA9d1wStlAIT2NU8J15LNob0YFBVjs2aEQ3j8rsfRQo+lAs7/ui1i2TGaJjapLmuNPLTsrm+nPjmZDwpcQ==
+ dependencies:
+ "@babel/runtime" "^7.9.2"
+ "@types/testing-library__jest-dom" "^5.9.1"
+ aria-query "^4.2.2"
+ chalk "^3.0.0"
+ css "^3.0.0"
+ css.escape "^1.5.1"
+ lodash "^4.17.15"
+ redent "^3.0.0"
+
"@testing-library/react-hooks@^3.4.1":
version "3.4.1"
resolved "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-3.4.1.tgz#1f8ccd21208086ec228d9743fe40b69d0efcd7e5"
@@ -4124,6 +4138,13 @@
resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74"
integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==
+"@types/testing-library__jest-dom@^5.9.1", "@types/testing-library__jest-dom@^5.9.5":
+ version "5.9.5"
+ resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz#5bf25c91ad2d7b38f264b12275e5c92a66d849b0"
+ integrity sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ==
+ dependencies:
+ "@types/jest" "*"
+
"@types/testing-library__react-hooks@^3.3.0":
version "3.4.0"
resolved "https://registry.npmjs.org/@types/testing-library__react-hooks/-/testing-library__react-hooks-3.4.0.tgz#be148b7fa7d19cd3349c4ef9d9534486bc582fcc"
@@ -5355,7 +5376,7 @@ atob-lite@^2.0.0:
resolved "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696"
integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=
-atob@^2.1.1:
+atob@^2.1.1, atob@^2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
@@ -7826,6 +7847,20 @@ css.escape@1.5.0:
resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.0.tgz#95984d7887ce4ca90684e813966f42d1ef87ecea"
integrity sha1-lZhNeIfOTKkGhOgTlm9C0e+H7Oo=
+css.escape@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
+ integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=
+
+css@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d"
+ integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==
+ dependencies:
+ inherits "^2.0.4"
+ source-map "^0.6.1"
+ source-map-resolve "^0.6.0"
+
cssesc@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
@@ -19728,6 +19763,14 @@ source-map-resolve@^0.5.0:
source-map-url "^0.4.0"
urix "^0.1.0"
+source-map-resolve@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2"
+ integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+
source-map-support@0.5.16:
version "0.5.16"
resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
From d25f9be9c167ba39ad2bc195a14991c901feb12a Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Fri, 5 Feb 2021 13:22:13 +0000
Subject: [PATCH 07/12] Gate correctly
---
CHANGELOG.md | 1 +
client/web/src/integration/jscontext.ts | 1 +
client/web/src/jscontext.ts | 3 ++-
client/web/src/user/settings/routes.tsx | 4 +---
client/web/src/user/settings/sidebaritems.ts | 4 +---
cmd/frontend/internal/app/jscontext/jscontext.go | 2 ++
internal/conf/computed.go | 7 +++++++
schema/site.schema.json | 4 ++--
schema/site_stringdata.go | 4 ++--
9 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a1b5e942d21d..b66eaa8940aa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,7 @@ All notable changes to Sourcegraph are documented in this file.
- New site config option `"log": { "sentry": { "backendDSN": "" } }` to use a separate Sentry project for backend errors. [#17363](https://github.com/sourcegraph/sourcegraph/pull/17363)
- Structural search now supports searching indexed branches other than default. [#17726](https://github.com/sourcegraph/sourcegraph/pull/17726)
+- A product research sign-up page is now enabled by default, this can be accessed by all users in their user settings. A new site configuration property `productResearchPage.enabled` can be used to disable access to this page.
### Changed
diff --git a/client/web/src/integration/jscontext.ts b/client/web/src/integration/jscontext.ts
index 95095630d281..793ca538e326 100644
--- a/client/web/src/integration/jscontext.ts
+++ b/client/web/src/integration/jscontext.ts
@@ -19,6 +19,7 @@ export const createJsContext = ({ sourcegraphBaseUrl }: { sourcegraphBaseUrl: st
campaignsEnabled: true,
codeIntelAutoIndexingEnabled: true,
externalServicesUserModeEnabled: false,
+ productResearchPageEnabled: true,
csrfToken: 'test-csrf-token',
assetsRoot: new URL('/.assets', sourcegraphBaseUrl).href,
deployType: 'dev',
diff --git a/client/web/src/jscontext.ts b/client/web/src/jscontext.ts
index 547eccb11f1e..c9924e7843fa 100644
--- a/client/web/src/jscontext.ts
+++ b/client/web/src/jscontext.ts
@@ -113,7 +113,8 @@ export interface SourcegraphContext extends Pick, 'e
brandName: string
}
- productResearchPageEnabled?: boolean
+ /** Whether the product research sign-up page is enabled on the site. */
+ productResearchPageEnabled: boolean
/** The publishable key for the billing service (Stripe). */
billingPublishableKey?: string
diff --git a/client/web/src/user/settings/routes.tsx b/client/web/src/user/settings/routes.tsx
index be630069c8ef..440b92ccfaa2 100644
--- a/client/web/src/user/settings/routes.tsx
+++ b/client/web/src/user/settings/routes.tsx
@@ -139,8 +139,6 @@ export const userSettingsAreaRoutes: readonly UserSettingsAreaRoute[] = [
path: '/product-research',
exact: true,
render: lazyComponent(() => import('./research/ProductResearch'), 'ProductResearchPage'),
- condition: () =>
- // TODO: Gate correctly and allow admins to disable
- true,
+ condition: () => window.context.productResearchPageEnabled,
},
]
diff --git a/client/web/src/user/settings/sidebaritems.ts b/client/web/src/user/settings/sidebaritems.ts
index c8d7b9ec1291..03ce9adfa11e 100644
--- a/client/web/src/user/settings/sidebaritems.ts
+++ b/client/web/src/user/settings/sidebaritems.ts
@@ -50,9 +50,7 @@ export const userSettingsSideBarItems: UserSettingsSidebarItems = {
{
label: 'Product research',
to: '/product-research',
- condition: () =>
- // TODO: Gate correctly and allow admins to disable
- true,
+ condition: () => window.context.productResearchPageEnabled,
},
],
}
diff --git a/cmd/frontend/internal/app/jscontext/jscontext.go b/cmd/frontend/internal/app/jscontext/jscontext.go
index 2095ca337dd9..a16d3e83b599 100644
--- a/cmd/frontend/internal/app/jscontext/jscontext.go
+++ b/cmd/frontend/internal/app/jscontext/jscontext.go
@@ -192,6 +192,8 @@ func NewJSContextFromRequest(req *http.Request) JSContext {
CodeIntelAutoIndexingEnabled: conf.CodeIntelAutoIndexingEnabled(),
+ ProductResearchPageEnabled: conf.ProductResearchPageEnabled()
+
ExperimentalFeatures: conf.ExperimentalFeatures(),
}
}
diff --git a/internal/conf/computed.go b/internal/conf/computed.go
index b0df51376eea..71dff4f06dca 100644
--- a/internal/conf/computed.go
+++ b/internal/conf/computed.go
@@ -233,6 +233,13 @@ func CodeIntelAutoIndexingEnabled() bool {
return false
}
+func ProductResearchPageEnabled() bool {
+ if enabled := Get().ProductResearchPageEnabled; enabled != nil {
+ return *enabled
+ }
+ return true
+}
+
func ExternalURL() string {
return Get().ExternalURL
}
diff --git a/schema/site.schema.json b/schema/site.schema.json
index 653b7318bb61..2a13f18ecb87 100644
--- a/schema/site.schema.json
+++ b/schema/site.schema.json
@@ -890,8 +890,8 @@
"description": "Enables users access to the product research page in their settings.",
"type": "boolean",
"!go": { "pointer": true },
- "default": true,
- "group": "Misc."
+ "group": "Misc.",
+ "default": true
}
},
"definitions": {
diff --git a/schema/site_stringdata.go b/schema/site_stringdata.go
index 8d0e5442c20d..fcd6d44cc7f0 100644
--- a/schema/site_stringdata.go
+++ b/schema/site_stringdata.go
@@ -895,8 +895,8 @@ const SiteSchemaJSON = `{
"description": "Enables users access to the product research page in their settings.",
"type": "boolean",
"!go": { "pointer": true },
- "default": true,
- "group": "Misc."
+ "group": "Misc.",
+ "default": true
}
},
"definitions": {
From cd23795826af08fafe6f925304cf8ce240789dac Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Fri, 5 Feb 2021 13:27:46 +0000
Subject: [PATCH 08/12] Fix compiler error
---
cmd/frontend/internal/app/jscontext/jscontext.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cmd/frontend/internal/app/jscontext/jscontext.go b/cmd/frontend/internal/app/jscontext/jscontext.go
index a16d3e83b599..93afcbb45fa0 100644
--- a/cmd/frontend/internal/app/jscontext/jscontext.go
+++ b/cmd/frontend/internal/app/jscontext/jscontext.go
@@ -192,8 +192,8 @@ func NewJSContextFromRequest(req *http.Request) JSContext {
CodeIntelAutoIndexingEnabled: conf.CodeIntelAutoIndexingEnabled(),
- ProductResearchPageEnabled: conf.ProductResearchPageEnabled()
-
+ ProductResearchPageEnabled: conf.ProductResearchPageEnabled(),
+,
ExperimentalFeatures: conf.ExperimentalFeatures(),
}
}
From 055504905c785f990d5b1ee4e7da49d56cc40faf Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Fri, 5 Feb 2021 13:49:02 +0000
Subject: [PATCH 09/12] Fix typo
---
cmd/frontend/internal/app/jscontext/jscontext.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmd/frontend/internal/app/jscontext/jscontext.go b/cmd/frontend/internal/app/jscontext/jscontext.go
index 93afcbb45fa0..800985c50097 100644
--- a/cmd/frontend/internal/app/jscontext/jscontext.go
+++ b/cmd/frontend/internal/app/jscontext/jscontext.go
@@ -193,7 +193,7 @@ func NewJSContextFromRequest(req *http.Request) JSContext {
CodeIntelAutoIndexingEnabled: conf.CodeIntelAutoIndexingEnabled(),
ProductResearchPageEnabled: conf.ProductResearchPageEnabled(),
-,
+
ExperimentalFeatures: conf.ExperimentalFeatures(),
}
}
From 1d026ed37fbf3a339cab5fa23d113ebe326263ee Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Fri, 5 Feb 2021 13:59:03 +0000
Subject: [PATCH 10/12] Removed testing library types that are already bundled
in
---
package.json | 1 -
yarn.lock | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 4f436b09ee25..611b0ebd6661 100644
--- a/package.json
+++ b/package.json
@@ -165,7 +165,6 @@
"@types/sinon": "9.0.4",
"@types/socket.io": "2.1.10",
"@types/socket.io-client": "1.4.33",
- "@types/testing-library__jest-dom": "^5.9.5",
"@types/textarea-caret": "3.0.0",
"@types/uuid": "8.0.1",
"@types/webpack": "4.41.25",
diff --git a/yarn.lock b/yarn.lock
index 8e478fdf6e65..b397a096234d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4138,7 +4138,7 @@
resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74"
integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==
-"@types/testing-library__jest-dom@^5.9.1", "@types/testing-library__jest-dom@^5.9.5":
+"@types/testing-library__jest-dom@^5.9.1":
version "5.9.5"
resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz#5bf25c91ad2d7b38f264b12275e5c92a66d849b0"
integrity sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ==
From 449cd893c8077c72dd543dd935fefbbc9b7229cd Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Mon, 8 Feb 2021 11:01:36 +0000
Subject: [PATCH 11/12] Update naming, semantics and tests
---
CHANGELOG.md | 4 ++--
client/web/src/integration/jscontext.ts | 2 +-
client/web/src/jscontext.ts | 4 ++--
.../research/ProductResearch.test.tsx | 17 +++++++-------
.../settings/research/ProductResearch.tsx | 23 ++++++++-----------
client/web/src/user/settings/routes.tsx | 4 ++--
client/web/src/user/settings/sidebaritems.ts | 2 +-
.../internal/app/jscontext/jscontext.go | 4 ++--
internal/conf/computed.go | 4 ++--
schema/schema.go | 4 ++--
schema/site.schema.json | 4 ++--
schema/site_stringdata.go | 4 ++--
12 files changed, 36 insertions(+), 40 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b371f88cbb8..a8f0b1d30197 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,8 +19,8 @@ All notable changes to Sourcegraph are documented in this file.
- Structural search now supports searching indexed branches other than default. [#17726](https://github.com/sourcegraph/sourcegraph/pull/17726)
- Structural search now supports searching unindexed revisions. [#17967](https://github.com/sourcegraph/sourcegraph/pull/17967)
- New site config option `"allowSignup"` for SAML authentication to determine if automatically create new users is allowed. [#17989](https://github.com/sourcegraph/sourcegraph/pull/17989)
-- New product research sign-up page. This can be accessed by all users in their user settings. [#17945](https://github.com/sourcegraph/sourcegraph/pull/17945)
-- New site config option `productResearchPage.enabled` to disable access to the product research sign-up page. [#17945](https://github.com/sourcegraph/sourcegraph/pull/17945)
+- New product research sign-up area. This can be accessed by all users in their user settings. [#17945](https://github.com/sourcegraph/sourcegraph/pull/17945)
+- New site config option `productResearchArea.enabled` to disable access to the product research sign-up area. [#17945](https://github.com/sourcegraph/sourcegraph/pull/17945)
### Changed
diff --git a/client/web/src/integration/jscontext.ts b/client/web/src/integration/jscontext.ts
index 793ca538e326..b8ccc8fb8052 100644
--- a/client/web/src/integration/jscontext.ts
+++ b/client/web/src/integration/jscontext.ts
@@ -19,7 +19,7 @@ export const createJsContext = ({ sourcegraphBaseUrl }: { sourcegraphBaseUrl: st
campaignsEnabled: true,
codeIntelAutoIndexingEnabled: true,
externalServicesUserModeEnabled: false,
- productResearchPageEnabled: true,
+ productResearchAreaEnabled: true,
csrfToken: 'test-csrf-token',
assetsRoot: new URL('/.assets', sourcegraphBaseUrl).href,
deployType: 'dev',
diff --git a/client/web/src/jscontext.ts b/client/web/src/jscontext.ts
index c9924e7843fa..254afcc25117 100644
--- a/client/web/src/jscontext.ts
+++ b/client/web/src/jscontext.ts
@@ -113,8 +113,8 @@ export interface SourcegraphContext extends Pick, 'e
brandName: string
}
- /** Whether the product research sign-up page is enabled on the site. */
- productResearchPageEnabled: boolean
+ /** Whether the product research sign-up area is enabled on the site. */
+ productResearchAreaEnabled: boolean
/** The publishable key for the billing service (Stripe). */
billingPublishableKey?: string
diff --git a/client/web/src/user/settings/research/ProductResearch.test.tsx b/client/web/src/user/settings/research/ProductResearch.test.tsx
index b2abef4284fb..5a79727f1b6e 100644
--- a/client/web/src/user/settings/research/ProductResearch.test.tsx
+++ b/client/web/src/user/settings/research/ProductResearch.test.tsx
@@ -1,18 +1,17 @@
import React from 'react'
import { render, RenderResult } from '@testing-library/react'
-import * as sinon from 'sinon'
-import { ProductResearchPage } from './ProductResearch'
-import { AuthenticatedUser } from '../../../auth'
-import { TelemetryService } from '../../../../../shared/src/telemetry/telemetryService'
+import { ProductResearchArea } from './ProductResearch'
+import { NOOP_TELEMETRY_SERVICE } from '../../../../../shared/src/telemetry/telemetryService'
-describe('ProductResearchPage', () => {
+describe('ProductResearchArea', () => {
let queries: RenderResult
- const mockTelemetryService = { logViewEvent: sinon.spy(), log: sinon.spy() } as TelemetryService
- const mockAuthenticatedUser = { email: 'test@sourcegraph.com' } as AuthenticatedUser
beforeEach(() => {
queries = render(
-
+
)
})
@@ -22,7 +21,7 @@ describe('ProductResearchPage', () => {
test('renders sign up now link correctly', () => {
expect(queries.getByText('Sign up now').closest('a')?.href).toMatchInlineSnapshot(
- '"https://share.hsforms.com/1tkScUc65Tm-Yu98zUZcLGw1n7ku?email=test@sourcegraph.com"'
+ '"https://share.hsforms.com/1tkScUc65Tm-Yu98zUZcLGw1n7ku?email=test%40sourcegraph.com"'
)
})
})
diff --git a/client/web/src/user/settings/research/ProductResearch.tsx b/client/web/src/user/settings/research/ProductResearch.tsx
index 618015731baf..983ef72cf83e 100644
--- a/client/web/src/user/settings/research/ProductResearch.tsx
+++ b/client/web/src/user/settings/research/ProductResearch.tsx
@@ -1,35 +1,32 @@
import React, { useEffect } from 'react'
-import OpenInNew from 'mdi-react/OpenInNewIcon'
+import OpenInNewIcon from 'mdi-react/OpenInNewIcon'
import { TelemetryService } from '../../../../../shared/src/telemetry/telemetryService'
import { AuthenticatedUser } from '../../../auth'
interface Props {
telemetryService: TelemetryService
- authenticatedUser: AuthenticatedUser
+ authenticatedUser: Pick
}
-const PRODUCT_RESEARCH_SIGNUP_FORM = 'https://share.hsforms.com/1tkScUc65Tm-Yu98zUZcLGw1n7ku'
+const signUpForm = new URL('https://share.hsforms.com/1tkScUc65Tm-Yu98zUZcLGw1n7ku')
-export const ProductResearchPage: React.FunctionComponent = ({ telemetryService, authenticatedUser }) => {
+export const ProductResearchArea: React.FunctionComponent = ({ telemetryService, authenticatedUser }) => {
useEffect(() => {
telemetryService.logViewEvent('UserSettingsProductResearch')
}, [telemetryService])
+ signUpForm.searchParams.set('email', authenticatedUser.email)
+
return (
<>
Product research and feedback
-
+
Our product team conducts occasional research to learn about how you use Sourcegraph and ask for
feedback about upcoming ideas. Sign up to participate in our research and help us shape the future of
our product!
-
-
- Sign up now
+
+
+ Sign up now
>
)
diff --git a/client/web/src/user/settings/routes.tsx b/client/web/src/user/settings/routes.tsx
index 72e6f732b2d1..78d20abfe21e 100644
--- a/client/web/src/user/settings/routes.tsx
+++ b/client/web/src/user/settings/routes.tsx
@@ -136,7 +136,7 @@ export const userSettingsAreaRoutes: readonly UserSettingsAreaRoute[] = [
{
path: '/product-research',
exact: true,
- render: lazyComponent(() => import('./research/ProductResearch'), 'ProductResearchPage'),
- condition: () => window.context.productResearchPageEnabled,
+ render: lazyComponent(() => import('./research/ProductResearch'), 'ProductResearchArea'),
+ condition: () => window.context.productResearchAreaEnabled,
},
]
diff --git a/client/web/src/user/settings/sidebaritems.ts b/client/web/src/user/settings/sidebaritems.ts
index 35bacacdef28..2b69c1a77bfa 100644
--- a/client/web/src/user/settings/sidebaritems.ts
+++ b/client/web/src/user/settings/sidebaritems.ts
@@ -50,7 +50,7 @@ export const userSettingsSideBarItems: UserSettingsSidebarItems = {
{
label: 'Product research',
to: '/product-research',
- condition: () => window.context.productResearchPageEnabled,
+ condition: () => window.context.productResearchAreaEnabled,
},
],
}
diff --git a/cmd/frontend/internal/app/jscontext/jscontext.go b/cmd/frontend/internal/app/jscontext/jscontext.go
index 800985c50097..8cb1b8fa9d13 100644
--- a/cmd/frontend/internal/app/jscontext/jscontext.go
+++ b/cmd/frontend/internal/app/jscontext/jscontext.go
@@ -88,7 +88,7 @@ type JSContext struct {
CodeIntelAutoIndexingEnabled bool `json:"codeIntelAutoIndexingEnabled"`
- ProductResearchPageEnabled bool `json:"productResearchPageEnabled"`
+ ProductResearchAreaEnabled bool `json:"productResearchAreaEnabled"`
ExperimentalFeatures schema.ExperimentalFeatures `json:"experimentalFeatures"`
}
@@ -192,7 +192,7 @@ func NewJSContextFromRequest(req *http.Request) JSContext {
CodeIntelAutoIndexingEnabled: conf.CodeIntelAutoIndexingEnabled(),
- ProductResearchPageEnabled: conf.ProductResearchPageEnabled(),
+ ProductResearchAreaEnabled: conf.ProductResearchAreaEnabled(),
ExperimentalFeatures: conf.ExperimentalFeatures(),
}
diff --git a/internal/conf/computed.go b/internal/conf/computed.go
index 71dff4f06dca..e05c8454d437 100644
--- a/internal/conf/computed.go
+++ b/internal/conf/computed.go
@@ -233,8 +233,8 @@ func CodeIntelAutoIndexingEnabled() bool {
return false
}
-func ProductResearchPageEnabled() bool {
- if enabled := Get().ProductResearchPageEnabled; enabled != nil {
+func ProductResearchAreaEnabled() bool {
+ if enabled := Get().ProductResearchAreaEnabled; enabled != nil {
return *enabled
}
return true
diff --git a/schema/schema.go b/schema/schema.go
index fdcc5d8aef79..e49100c97cba 100644
--- a/schema/schema.go
+++ b/schema/schema.go
@@ -1307,8 +1307,8 @@ type SiteConfiguration struct {
ParentSourcegraph *ParentSourcegraph `json:"parentSourcegraph,omitempty"`
// PermissionsUserMapping description: Settings for Sourcegraph permissions, which allow the site admin to explicitly manage repository permissions via the GraphQL API. This setting cannot be enabled if repository permissions for any specific external service are enabled (i.e., when the external service's `authorization` field is set).
PermissionsUserMapping *PermissionsUserMapping `json:"permissions.userMapping,omitempty"`
- // ProductResearchPageEnabled description: Enables users access to the product research page in their settings.
- ProductResearchPageEnabled *bool `json:"productResearchPage.enabled,omitempty"`
+ // ProductResearchAreaEnabled description: Enables users access to the product research area in their settings.
+ ProductResearchAreaEnabled *bool `json:"productResearchArea.enabled,omitempty"`
// RepoConcurrentExternalServiceSyncers description: The number of concurrent external service syncers that can run.
RepoConcurrentExternalServiceSyncers int `json:"repoConcurrentExternalServiceSyncers,omitempty"`
// RepoListUpdateInterval description: Interval (in minutes) for checking code hosts (such as GitHub, Gitolite, etc.) for new repositories.
diff --git a/schema/site.schema.json b/schema/site.schema.json
index 82eadf85e4cb..b003bb6bdb8c 100644
--- a/schema/site.schema.json
+++ b/schema/site.schema.json
@@ -886,8 +886,8 @@
"default": 2000,
"group": "Misc."
},
- "productResearchPage.enabled": {
- "description": "Enables users access to the product research page in their settings.",
+ "productResearchArea.enabled": {
+ "description": "Enables users access to the product research area in their settings.",
"type": "boolean",
"!go": { "pointer": true },
"group": "Misc.",
diff --git a/schema/site_stringdata.go b/schema/site_stringdata.go
index 50bdceb791ac..b16b275b766b 100644
--- a/schema/site_stringdata.go
+++ b/schema/site_stringdata.go
@@ -891,8 +891,8 @@ const SiteSchemaJSON = `{
"default": 2000,
"group": "Misc."
},
- "productResearchPage.enabled": {
- "description": "Enables users access to the product research page in their settings.",
+ "productResearchArea.enabled": {
+ "description": "Enables users access to the product research area in their settings.",
"type": "boolean",
"!go": { "pointer": true },
"group": "Misc.",
From f3cc0b0a5ad0f019206def218e54966b2b1a324d Mon Sep 17 00:00:00 2001
From: Tom Ross
Date: Tue, 9 Feb 2021 15:13:19 +0000
Subject: [PATCH 12/12] Naming
---
CHANGELOG.md | 4 ++--
client/web/src/integration/jscontext.ts | 2 +-
client/web/src/jscontext.ts | 4 ++--
.../web/src/user/settings/research/ProductResearch.test.tsx | 6 +++---
client/web/src/user/settings/research/ProductResearch.tsx | 2 +-
client/web/src/user/settings/routes.tsx | 4 ++--
client/web/src/user/settings/sidebaritems.ts | 2 +-
cmd/frontend/internal/app/jscontext/jscontext.go | 4 ++--
internal/conf/computed.go | 4 ++--
schema/schema.go | 4 ++--
schema/site.schema.json | 4 ++--
schema/site_stringdata.go | 4 ++--
12 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ac2a1dab5b6..c4715eb40c9c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,9 +19,9 @@ All notable changes to Sourcegraph are documented in this file.
- Structural search now supports searching indexed branches other than default. [#17726](https://github.com/sourcegraph/sourcegraph/pull/17726)
- Structural search now supports searching unindexed revisions. [#17967](https://github.com/sourcegraph/sourcegraph/pull/17967)
- New site config option `"allowSignup"` for SAML authentication to determine if automatically create new users is allowed. [#17989](https://github.com/sourcegraph/sourcegraph/pull/17989)
-- New product research sign-up area. This can be accessed by all users in their user settings. [#17945](https://github.com/sourcegraph/sourcegraph/pull/17945)
-- New site config option `productResearchArea.enabled` to disable access to the product research sign-up area. [#17945](https://github.com/sourcegraph/sourcegraph/pull/17945)
- Experimental: The webapp can now stream search results to the client, improving search performance. To enable it, add `{ "experimentalFeatures": { "searchStreaming": true } }` in user settings. [#16097](https://github.com/sourcegraph/sourcegraph/pull/16097)
+- New product research sign-up page. This can be accessed by all users in their user settings. [#17945](https://github.com/sourcegraph/sourcegraph/pull/17945)
+- New site config option `productResearchPage.enabled` to disable access to the product research sign-up page. [#17945](https://github.com/sourcegraph/sourcegraph/pull/17945)
### Changed
diff --git a/client/web/src/integration/jscontext.ts b/client/web/src/integration/jscontext.ts
index b8ccc8fb8052..793ca538e326 100644
--- a/client/web/src/integration/jscontext.ts
+++ b/client/web/src/integration/jscontext.ts
@@ -19,7 +19,7 @@ export const createJsContext = ({ sourcegraphBaseUrl }: { sourcegraphBaseUrl: st
campaignsEnabled: true,
codeIntelAutoIndexingEnabled: true,
externalServicesUserModeEnabled: false,
- productResearchAreaEnabled: true,
+ productResearchPageEnabled: true,
csrfToken: 'test-csrf-token',
assetsRoot: new URL('/.assets', sourcegraphBaseUrl).href,
deployType: 'dev',
diff --git a/client/web/src/jscontext.ts b/client/web/src/jscontext.ts
index 254afcc25117..c9924e7843fa 100644
--- a/client/web/src/jscontext.ts
+++ b/client/web/src/jscontext.ts
@@ -113,8 +113,8 @@ export interface SourcegraphContext extends Pick, 'e
brandName: string
}
- /** Whether the product research sign-up area is enabled on the site. */
- productResearchAreaEnabled: boolean
+ /** Whether the product research sign-up page is enabled on the site. */
+ productResearchPageEnabled: boolean
/** The publishable key for the billing service (Stripe). */
billingPublishableKey?: string
diff --git a/client/web/src/user/settings/research/ProductResearch.test.tsx b/client/web/src/user/settings/research/ProductResearch.test.tsx
index 5a79727f1b6e..65da5e9e75eb 100644
--- a/client/web/src/user/settings/research/ProductResearch.test.tsx
+++ b/client/web/src/user/settings/research/ProductResearch.test.tsx
@@ -1,14 +1,14 @@
import React from 'react'
import { render, RenderResult } from '@testing-library/react'
-import { ProductResearchArea } from './ProductResearch'
+import { ProductResearchPage } from './ProductResearch'
import { NOOP_TELEMETRY_SERVICE } from '../../../../../shared/src/telemetry/telemetryService'
-describe('ProductResearchArea', () => {
+describe('ProductResearchPage', () => {
let queries: RenderResult
beforeEach(() => {
queries = render(
-
diff --git a/client/web/src/user/settings/research/ProductResearch.tsx b/client/web/src/user/settings/research/ProductResearch.tsx
index 983ef72cf83e..b4ac81ace4ad 100644
--- a/client/web/src/user/settings/research/ProductResearch.tsx
+++ b/client/web/src/user/settings/research/ProductResearch.tsx
@@ -10,7 +10,7 @@ interface Props {
const signUpForm = new URL('https://share.hsforms.com/1tkScUc65Tm-Yu98zUZcLGw1n7ku')
-export const ProductResearchArea: React.FunctionComponent = ({ telemetryService, authenticatedUser }) => {
+export const ProductResearchPage: React.FunctionComponent = ({ telemetryService, authenticatedUser }) => {
useEffect(() => {
telemetryService.logViewEvent('UserSettingsProductResearch')
}, [telemetryService])
diff --git a/client/web/src/user/settings/routes.tsx b/client/web/src/user/settings/routes.tsx
index 78d20abfe21e..72e6f732b2d1 100644
--- a/client/web/src/user/settings/routes.tsx
+++ b/client/web/src/user/settings/routes.tsx
@@ -136,7 +136,7 @@ export const userSettingsAreaRoutes: readonly UserSettingsAreaRoute[] = [
{
path: '/product-research',
exact: true,
- render: lazyComponent(() => import('./research/ProductResearch'), 'ProductResearchArea'),
- condition: () => window.context.productResearchAreaEnabled,
+ render: lazyComponent(() => import('./research/ProductResearch'), 'ProductResearchPage'),
+ condition: () => window.context.productResearchPageEnabled,
},
]
diff --git a/client/web/src/user/settings/sidebaritems.ts b/client/web/src/user/settings/sidebaritems.ts
index 2b69c1a77bfa..35bacacdef28 100644
--- a/client/web/src/user/settings/sidebaritems.ts
+++ b/client/web/src/user/settings/sidebaritems.ts
@@ -50,7 +50,7 @@ export const userSettingsSideBarItems: UserSettingsSidebarItems = {
{
label: 'Product research',
to: '/product-research',
- condition: () => window.context.productResearchAreaEnabled,
+ condition: () => window.context.productResearchPageEnabled,
},
],
}
diff --git a/cmd/frontend/internal/app/jscontext/jscontext.go b/cmd/frontend/internal/app/jscontext/jscontext.go
index 8cb1b8fa9d13..800985c50097 100644
--- a/cmd/frontend/internal/app/jscontext/jscontext.go
+++ b/cmd/frontend/internal/app/jscontext/jscontext.go
@@ -88,7 +88,7 @@ type JSContext struct {
CodeIntelAutoIndexingEnabled bool `json:"codeIntelAutoIndexingEnabled"`
- ProductResearchAreaEnabled bool `json:"productResearchAreaEnabled"`
+ ProductResearchPageEnabled bool `json:"productResearchPageEnabled"`
ExperimentalFeatures schema.ExperimentalFeatures `json:"experimentalFeatures"`
}
@@ -192,7 +192,7 @@ func NewJSContextFromRequest(req *http.Request) JSContext {
CodeIntelAutoIndexingEnabled: conf.CodeIntelAutoIndexingEnabled(),
- ProductResearchAreaEnabled: conf.ProductResearchAreaEnabled(),
+ ProductResearchPageEnabled: conf.ProductResearchPageEnabled(),
ExperimentalFeatures: conf.ExperimentalFeatures(),
}
diff --git a/internal/conf/computed.go b/internal/conf/computed.go
index e05c8454d437..71dff4f06dca 100644
--- a/internal/conf/computed.go
+++ b/internal/conf/computed.go
@@ -233,8 +233,8 @@ func CodeIntelAutoIndexingEnabled() bool {
return false
}
-func ProductResearchAreaEnabled() bool {
- if enabled := Get().ProductResearchAreaEnabled; enabled != nil {
+func ProductResearchPageEnabled() bool {
+ if enabled := Get().ProductResearchPageEnabled; enabled != nil {
return *enabled
}
return true
diff --git a/schema/schema.go b/schema/schema.go
index e49100c97cba..fdcc5d8aef79 100644
--- a/schema/schema.go
+++ b/schema/schema.go
@@ -1307,8 +1307,8 @@ type SiteConfiguration struct {
ParentSourcegraph *ParentSourcegraph `json:"parentSourcegraph,omitempty"`
// PermissionsUserMapping description: Settings for Sourcegraph permissions, which allow the site admin to explicitly manage repository permissions via the GraphQL API. This setting cannot be enabled if repository permissions for any specific external service are enabled (i.e., when the external service's `authorization` field is set).
PermissionsUserMapping *PermissionsUserMapping `json:"permissions.userMapping,omitempty"`
- // ProductResearchAreaEnabled description: Enables users access to the product research area in their settings.
- ProductResearchAreaEnabled *bool `json:"productResearchArea.enabled,omitempty"`
+ // ProductResearchPageEnabled description: Enables users access to the product research page in their settings.
+ ProductResearchPageEnabled *bool `json:"productResearchPage.enabled,omitempty"`
// RepoConcurrentExternalServiceSyncers description: The number of concurrent external service syncers that can run.
RepoConcurrentExternalServiceSyncers int `json:"repoConcurrentExternalServiceSyncers,omitempty"`
// RepoListUpdateInterval description: Interval (in minutes) for checking code hosts (such as GitHub, Gitolite, etc.) for new repositories.
diff --git a/schema/site.schema.json b/schema/site.schema.json
index b003bb6bdb8c..82eadf85e4cb 100644
--- a/schema/site.schema.json
+++ b/schema/site.schema.json
@@ -886,8 +886,8 @@
"default": 2000,
"group": "Misc."
},
- "productResearchArea.enabled": {
- "description": "Enables users access to the product research area in their settings.",
+ "productResearchPage.enabled": {
+ "description": "Enables users access to the product research page in their settings.",
"type": "boolean",
"!go": { "pointer": true },
"group": "Misc.",
diff --git a/schema/site_stringdata.go b/schema/site_stringdata.go
index b16b275b766b..50bdceb791ac 100644
--- a/schema/site_stringdata.go
+++ b/schema/site_stringdata.go
@@ -891,8 +891,8 @@ const SiteSchemaJSON = `{
"default": 2000,
"group": "Misc."
},
- "productResearchArea.enabled": {
- "description": "Enables users access to the product research area in their settings.",
+ "productResearchPage.enabled": {
+ "description": "Enables users access to the product research page in their settings.",
"type": "boolean",
"!go": { "pointer": true },
"group": "Misc.",