diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0b5b3f9d8c..d2e8b9fe5e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -53,6 +53,9 @@ jobs:
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
+ - name: Install the latest chromedriver compatible with the installed chrome version
+ run: yarn global add chromedriver --detect_chromedriver_version
+
- name: Install Yarn dependencies
run: yarn install --frozen-lockfile
@@ -94,7 +97,9 @@ jobs:
run: curl http://localhost:8080/server/api
- name: Run e2e tests (integration tests)
- run: yarn run e2e:ci
+ run: |
+ chromedriver --url-base='/wd/hub' --port=4444 &
+ yarn run e2e:ci
- name: Shutdown Docker containers
run: docker-compose -f ./docker/docker-compose-ci.yml down
diff --git a/e2e/protractor-ci.conf.js b/e2e/protractor-ci.conf.js
index 63173e44e3..0cfc1f9eaf 100644
--- a/e2e/protractor-ci.conf.js
+++ b/e2e/protractor-ci.conf.js
@@ -7,4 +7,8 @@ config.capabilities = {
}
};
+// don't use protractor's webdriver, as it may be incompatible with the installed chrome version
+config.directConnect = false;
+config.seleniumAddress = 'http://localhost:4444/wd/hub';
+
exports.config = config;
diff --git a/package.json b/package.json
index 4008bb0ac3..80af52e264 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"lint": "ng lint",
"lint-fix": "ng lint --fix=true",
"e2e": "ng e2e",
- "e2e:ci": "ng e2e --protractor-config=./e2e/protractor-ci.conf.js",
+ "e2e:ci": "ng e2e --webdriver-update=false --protractor-config=./e2e/protractor-ci.conf.js",
"compile:server": "webpack --config webpack.server.config.js --progress --color",
"serve:ssr": "node dist/server",
"clean:coverage": "rimraf coverage",
diff --git a/src/app/+home-page/home-news/home-news.component.html b/src/app/+home-page/home-news/home-news.component.html
index 812c38f798..6bee3cd76f 100644
--- a/src/app/+home-page/home-news/home-news.component.html
+++ b/src/app/+home-page/home-news/home-news.component.html
@@ -2,7 +2,7 @@
-
Welcome to the DSpace 7 Preview
+
DSpace 7
DSpace is the world leading open source repository platform that enables organisations to:
@@ -13,6 +13,8 @@
issue permanent urls and trustworthy identifiers, including optional integrations with handle.net and DataCite DOI
-
Join an international community of leading institutions using DSpace.
+
Join an international community of leading institutions using DSpace.
+
diff --git a/src/app/core/shared/operators.ts b/src/app/core/shared/operators.ts
index dd610b6ca7..3128538ea9 100644
--- a/src/app/core/shared/operators.ts
+++ b/src/app/core/shared/operators.ts
@@ -45,32 +45,32 @@ export const sendRequest = (requestService: RequestService) =>
(source: Observable): Observable =>
source.pipe(tap((request: RestRequest) => requestService.send(request)));
-export const getRemoteDataPayload = () =>
- (source: Observable>): Observable =>
+export const getRemoteDataPayload = () =>
+ (source: Observable>): Observable =>
source.pipe(map((remoteData: RemoteData) => remoteData.payload));
-export const getPaginatedListPayload = () =>
- (source: Observable>): Observable =>
+export const getPaginatedListPayload = () =>
+ (source: Observable>): Observable =>
source.pipe(map((list: PaginatedList) => list.page));
-export const getAllCompletedRemoteData = () =>
- (source: Observable>): Observable> =>
+export const getAllCompletedRemoteData = () =>
+ (source: Observable>): Observable> =>
source.pipe(filter((rd: RemoteData) => hasValue(rd) && rd.hasCompleted));
-export const getFirstCompletedRemoteData = () =>
- (source: Observable>): Observable> =>
+export const getFirstCompletedRemoteData = () =>
+ (source: Observable>): Observable> =>
source.pipe(getAllCompletedRemoteData(), take(1));
-export const takeUntilCompletedRemoteData = () =>
- (source: Observable>): Observable> =>
+export const takeUntilCompletedRemoteData = () =>
+ (source: Observable>): Observable> =>
source.pipe(takeWhile((rd: RemoteData) => hasNoValue(rd) || rd.isLoading, true));
-export const getFirstSucceededRemoteData = () =>
- (source: Observable>): Observable> =>
+export const getFirstSucceededRemoteData = () =>
+ (source: Observable>): Observable> =>
source.pipe(filter((rd: RemoteData) => rd.hasSucceeded), take(1));
-export const getFirstSucceededRemoteWithNotEmptyData = () =>
- (source: Observable>): Observable> =>
+export const getFirstSucceededRemoteWithNotEmptyData = () =>
+ (source: Observable>): Observable> =>
source.pipe(find((rd: RemoteData) => rd.hasSucceeded && isNotEmpty(rd.payload)));
/**
@@ -83,8 +83,8 @@ export const getFirstSucceededRemoteWithNotEmptyData = () =>
* These operators were created as a first step in refactoring
* out all the instances where this is used incorrectly.
*/
-export const getFirstSucceededRemoteDataPayload = () =>
- (source: Observable>): Observable =>
+export const getFirstSucceededRemoteDataPayload = () =>
+ (source: Observable>): Observable =>
source.pipe(
getFirstSucceededRemoteData(),
getRemoteDataPayload()
@@ -100,8 +100,8 @@ export const getFirstSucceededRemoteDataPayload = () =>
* These operators were created as a first step in refactoring
* out all the instances where this is used incorrectly.
*/
-export const getFirstSucceededRemoteDataWithNotEmptyPayload = () =>
- (source: Observable>): Observable =>
+export const getFirstSucceededRemoteDataWithNotEmptyPayload = () =>
+ (source: Observable>): Observable =>
source.pipe(
getFirstSucceededRemoteWithNotEmptyData(),
getRemoteDataPayload()
@@ -117,8 +117,8 @@ export const getFirstSucceededRemoteDataWithNotEmptyPayload = () =>
* These operators were created as a first step in refactoring
* out all the instances where this is used incorrectly.
*/
-export const getAllSucceededRemoteDataPayload = () =>
- (source: Observable>): Observable =>
+export const getAllSucceededRemoteDataPayload = () =>
+ (source: Observable>): Observable =>
source.pipe(
getAllSucceededRemoteData(),
getRemoteDataPayload()
@@ -138,8 +138,8 @@ export const getAllSucceededRemoteDataPayload = () =>
* These operators were created as a first step in refactoring
* out all the instances where this is used incorrectly.
*/
-export const getFirstSucceededRemoteListPayload = () =>
- (source: Observable>>): Observable =>
+export const getFirstSucceededRemoteListPayload = () =>
+ (source: Observable>>): Observable =>
source.pipe(
getFirstSucceededRemoteData(),
getRemoteDataPayload(),
@@ -160,8 +160,8 @@ export const getFirstSucceededRemoteListPayload = () =>
* These operators were created as a first step in refactoring
* out all the instances where this is used incorrectly.
*/
-export const getAllSucceededRemoteListPayload = () =>
- (source: Observable>>): Observable =>
+export const getAllSucceededRemoteListPayload = () =>
+ (source: Observable>>): Observable =>
source.pipe(
getAllSucceededRemoteData(),
getRemoteDataPayload(),
@@ -174,8 +174,8 @@ export const getAllSucceededRemoteListPayload = () =>
* @param router The router used to navigate to a new page
* @param authService Service to check if the user is authenticated
*/
-export const redirectOn4xx = (router: Router, authService: AuthService) =>
- (source: Observable>): Observable> =>
+export const redirectOn4xx = (router: Router, authService: AuthService) =>
+ (source: Observable>): Observable> =>
observableCombineLatest(source, authService.isAuthenticated()).pipe(
map(([rd, isAuthenticated]: [RemoteData, boolean]) => {
if (rd.hasFailed) {
@@ -229,16 +229,16 @@ export const returnEndUserAgreementUrlTreeOnFalse = (router: Router, redirect: s
return hasAgreed ? hasAgreed : router.createUrlTree([getEndUserAgreementPath()], { queryParams });
}));
-export const getFinishedRemoteData = () =>
- (source: Observable>): Observable> =>
+export const getFinishedRemoteData = () =>
+ (source: Observable>): Observable> =>
source.pipe(find((rd: RemoteData) => !rd.isLoading));
-export const getAllSucceededRemoteData = () =>
- (source: Observable>): Observable> =>
+export const getAllSucceededRemoteData = () =>
+ (source: Observable>): Observable> =>
source.pipe(filter((rd: RemoteData) => rd.hasSucceeded));
-export const toDSpaceObjectListRD = () =>
- (source: Observable>>>): Observable>> =>
+export const toDSpaceObjectListRD = () =>
+ (source: Observable>>>): Observable>> =>
source.pipe(
filter((rd: RemoteData>>) => rd.hasSucceeded),
map((rd: RemoteData>>) => {
diff --git a/src/app/footer/footer.component.html b/src/app/footer/footer.component.html
index 3756bce188..bc407c2a97 100644
--- a/src/app/footer/footer.component.html
+++ b/src/app/footer/footer.component.html
@@ -56,7 +56,7 @@
{{ 'footer.link.dspace' | translate}}
{{ 'footer.copyright' | translate:{year: dateObj | date:'y'} }}
- {{ 'footer.link.duraspace' | translate}}
+ {{ 'footer.link.lyrasis' | translate}}