diff --git a/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.html b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.html
new file mode 100644
index 00000000000..65002103e44
--- /dev/null
+++ b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.html
@@ -0,0 +1,31 @@
+@if (licenses.length > 0 || uris.length > 0) {
+
+ @if ((hasCcLicenseName$ | async) && (hasCcLicenseUri$ | async)) {
+
+ } @else {
+
+ @if (licenses.length === uris.length) {
+ @for (license of licenses; track license; let last=$last; let i=$index) {
+ {{ license }}
+ @if (!last) {
+
+ }
+ }
+ } @else {
+ @for (license of licenses; track license; let last=$last) {
+ {{ license }}
+ @if (!last || uris.length > 0) {
+
+ }
+ }
+ @for (uri of uris; track uri; let last=$last) {
+ {{ uri }}
+ @if (!last) {
+
+ }
+ }
+ }
+
+ }
+
+}
diff --git a/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.spec.ts b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.spec.ts
new file mode 100644
index 00000000000..7e34aa7255d
--- /dev/null
+++ b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.spec.ts
@@ -0,0 +1,299 @@
+import {
+ ChangeDetectionStrategy,
+ NO_ERRORS_SCHEMA,
+} from '@angular/core';
+import {
+ ComponentFixture,
+ TestBed,
+ waitForAsync,
+} from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+import { APP_CONFIG } from '@dspace/config/app-config.interface';
+import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service';
+import { ConfigurationProperty } from '@dspace/core/shared/configuration-property.model';
+import { Item } from '@dspace/core/shared/item.model';
+import {
+ MetadataMap,
+ MetadataValue,
+} from '@dspace/core/shared/metadata.models';
+import { ConfigurationDataServiceStub } from '@dspace/core/testing/configuration-data.service.stub';
+import { TranslateLoaderMock } from '@dspace/core/testing/translate-loader.mock';
+import { createPaginatedList } from '@dspace/core/testing/utils.test';
+import { createSuccessfulRemoteDataObject$ } from '@dspace/core/utilities/remote-data.utils';
+import {
+ TranslateLoader,
+ TranslateModule,
+} from '@ngx-translate/core';
+
+import { environment } from '../../../../../../environments/environment';
+import { ItemPageLicenseFieldComponent } from './item-page-license-field.component';
+
+
+interface TestInstance {
+ metadata: any;
+}
+
+
+interface TestCase {
+ testInstance: TestInstance;
+ expected: {
+ render: boolean,
+ textElements: string[],
+ linkElements: string[],
+ };
+}
+
+
+const licenseNameMock = 'LICENSE NAME';
+const exampleUriMock = 'http://example.com';
+const ccUriMock = 'https://creativecommons.org/licenses/by/4.0';
+
+
+const testCases: TestCase[] = [
+ {
+ testInstance: {
+ metadata: { 'dc.rights': undefined, 'dc.rights.uri': undefined },
+ },
+ expected: {
+ render: false,
+ textElements: [],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': [ undefined, undefined ], 'dc.rights.uri': undefined },
+ },
+ expected: {
+ render: false,
+ textElements: [],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights.license': undefined, 'dc.rights.uri': undefined },
+ },
+ expected: {
+ render: false,
+ textElements: [],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': undefined, 'dc.rights.license': undefined, 'dc.rights.uri': [ undefined, undefined ] },
+ },
+ expected: {
+ render: false,
+ textElements: [],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': null, 'dc.rights.license': null, 'dc.rights.uri': null },
+ },
+ expected: {
+ render: false,
+ textElements: [],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': null, 'dc.rights.license': null, 'dc.rights.uri': [ null, null ] },
+ },
+ expected: {
+ render: false,
+ textElements: [],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights.uri': exampleUriMock },
+ },
+ expected: {
+ render: true,
+ textElements: [exampleUriMock],
+ linkElements: [exampleUriMock],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': null, 'dc.rights.license': null, 'dc.rights.uri': exampleUriMock },
+ },
+ expected: {
+ render: true,
+ textElements: [exampleUriMock],
+ linkElements: [exampleUriMock],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights.uri': ccUriMock },
+ },
+ expected: {
+ render: true,
+ textElements: [ccUriMock],
+ linkElements: [ccUriMock],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': null, 'dc.rights.license': licenseNameMock, 'dc.rights.uri': null },
+ },
+ expected: {
+ render: true,
+ textElements: [licenseNameMock],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': licenseNameMock, 'dc.rights.uri': ccUriMock },
+ },
+ expected: {
+ render: true,
+ // This test case is delegated to ItemPageCcLicenseFieldComponent
+ textElements: [],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': licenseNameMock, 'dc.rights.license': licenseNameMock, 'dc.rights.uri': ccUriMock },
+ },
+ expected: {
+ render: true,
+ // This test case meets the CC criteria too (since it has 'dc.rights', and 'dc.rights.uri'
+ // points to a CC license). Thus, it is delegated to ItemPageCcLicenseFieldComponent.
+ textElements: [],
+ linkElements: [],
+ },
+ },
+ {
+ testInstance: {
+ metadata: { 'dc.rights': licenseNameMock, 'dc.rights.license': licenseNameMock, 'dc.rights.uri': exampleUriMock },
+ },
+ expected: {
+ render: true,
+ textElements: [licenseNameMock, licenseNameMock, exampleUriMock],
+ linkElements: [exampleUriMock],
+ },
+ },
+];
+
+
+// Updates the component fixture with parameters from the test instance
+function configureFixture(
+ fixture: ComponentFixture