diff --git a/Makefile b/Makefile
index be40c4535f47f42898b06fcd34a33ef361223216..7253a961ee7298e7f693e46375f01bc8814cf479 100644
--- a/Makefile
+++ b/Makefile
@@ -5,24 +5,25 @@ list:
 	@echo ""
 	@echo "Useful targets:"
 	@echo ""
-	@echo "  rebuild          > rebuild all images and start containers for dev only"
-	@echo "  start            > start containers"
-	@echo "  restart          > restart containers"
-	@echo "  stop             > stop and kill running containers"
-	@echo "  status           > display stack containers status"
-	@echo "  logs             > display containers logs"
-	@echo "  install_client   > install client dependencies"
-	@echo "  shell_client     > shell into angular client container"
-	@echo "  build_client     > generate the angular client dist application (html, css, js)"
-	@echo "  test_client      > Starts the angular client unit tests"
-	@echo "  client_coverage  > Run nginx web server test client coverage"
-	@echo "  install_server   > install server dependencies"
-	@echo "  shell_server     > shell into php server container"
+	@echo "  rebuild          > Rebuild all images and start containers for dev only"
+	@echo "  start            > Start containers"
+	@echo "  restart          > Restart containers"
+	@echo "  stop             > Stop and kill running containers"
+	@echo "  status           > Display stack containers status"
+	@echo "  logs             > Display containers logs"
+	@echo "  install_client   > Install client dependencies"
+	@echo "  shell_client     > Shell into angular client container"
+	@echo "  build_client     > Generate the angular client dist application (html, css, js)"
+	@echo "  test_client      > Run the angular client unit tests and generate code coverage report"
+	@echo "  test_client-live > Run the angular client unit tests on every file change"
+	@echo "  open-coverage    > Open the client code coverage report in a browser (only available for Linux)"
+	@echo "  install_server   > Install server dependencies"
+	@echo "  shell_server     > Shell into php server container"
 	@echo "  test_server      > Starts the server php unit tests"
-	@echo "  phpcs            > run php code sniffer test suite"
-	@echo "  shell_services   > shell into python services"
-	@echo "  create-db        > create a database for dev only (need token_enabled=0)"
-	@echo "  remove-pgdata    > remove the anis-next database"
+	@echo "  phpcs            > Run php code sniffer test suite"
+	@echo "  shell_services   > Shell into python services"
+	@echo "  create-db        > Create a database for dev only (need token_enabled=0)"
+	@echo "  remove-pgdata    > Remove the anis-next database"
 	@echo ""
 
 rebuild:
@@ -55,10 +56,13 @@ build_client:
 	@docker-compose exec client ng build
 
 test_client:
-	@docker-compose exec client npx jest
+	@docker-compose exec client npx jest --coverage --collectCoverageFrom='src/**/*.ts'
 
-client_coverage:
-	@docker run --name anis-client-code-coverage -d -p 8888:80 -v $(CURDIR)/client/coverage/anis-client:/usr/share/nginx/html:ro nginx
+test_client_live:
+	@docker-compose exec client npx jest --watchAll --coverage
+
+open_coverage_report:
+	xdg-open client/coverage/anis-client/index.html
 
 install_server:
 	@docker run --init -it --rm --user $(UID):$(GID) \
diff --git a/client/jest.config.js b/client/jest.config.js
index d23d9551d318b95afc421fc394c4f3acb970d8f6..d9e9f428c8c77bd4c8bc0ebe3557db4a8a0c2361 100644
--- a/client/jest.config.js
+++ b/client/jest.config.js
@@ -5,8 +5,6 @@ module.exports = {
     preset: 'jest-preset-angular',
     testMatch: ['**/+(*.)+(spec).+(ts|js)'],
     setupFilesAfterEnv: ['<rootDir>/src/test.ts'],
-    collectCoverage: false,
-    collectCoverageFrom: ['src/**/*.ts'],
     coverageReporters: ['html'],
     coverageDirectory: 'coverage/anis-client',
     moduleDirectories: ["node_modules", "./"],
diff --git a/client/src/app/instance/documentation/components/__snapshots__/dataset-card-doc.component.spec.ts.snap b/client/src/app/instance/documentation/components/__snapshots__/dataset-card-doc.component.spec.ts.snap
new file mode 100644
index 0000000000000000000000000000000000000000..9e6985f149d02a9548c3c1520c06adb38bba2fc5
--- /dev/null
+++ b/client/src/app/instance/documentation/components/__snapshots__/dataset-card-doc.component.spec.ts.snap
@@ -0,0 +1,70 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`DatasetCardDocComponent should display information in HTML file 1`] = `
+<app-dataset-card-doc
+  dataset={[Function Object]}
+  instanceSelected={[Function String]}
+  router={[Function Router]}
+  survey={[Function Object]}
+>
+  <div
+    class="card border-0"
+  >
+    <div
+      class="card-body py-2"
+    >
+      <div
+        class="row"
+      >
+        <div
+          class="col"
+        >
+          <div
+            class="row"
+          >
+            <p
+              class="lead m-0 d-inline"
+            >
+               my dataset 
+            </p>
+          </div>
+          <div
+            class="row"
+          >
+            <p
+              class="my-3"
+            >
+              This is my dataset
+            </p>
+          </div>
+          <div
+            class="row"
+          >
+            <button
+              class="btn btn-link p-0"
+              placement="bottom"
+              triggers="mouseenter:mouseleave"
+            >
+              <small>
+                 More about my Survey survey 
+                <span
+                  class="fas fa-question-circle"
+                />
+              </small>
+            </button>
+          </div>
+        </div>
+        <div
+          class="col-auto"
+        >
+          <button
+            class="btn btn-outline-secondary"
+          >
+             Select 
+          </button>
+        </div>
+      </div>
+    </div>
+  </div>
+</app-dataset-card-doc>
+`;
diff --git a/client/src/app/instance/documentation/components/__snapshots__/output-list.component.spec.ts.snap b/client/src/app/instance/documentation/components/__snapshots__/output-list.component.spec.ts.snap
new file mode 100644
index 0000000000000000000000000000000000000000..c2501b4af9165dccfd37f35349784bbf5668f41e
--- /dev/null
+++ b/client/src/app/instance/documentation/components/__snapshots__/output-list.component.spec.ts.snap
@@ -0,0 +1,40 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`OutputListComponent should display information in HTML file 1`] = `
+<app-output-list
+  attributeList={[Function Array]}
+  datasetSelected={[Function String]}
+>
+  <h4>
+    Available outputs for myTestDataset
+  </h4><table
+    class="attributes-table p-0"
+    id="table"
+  >
+    <tr>
+      <th>
+        id
+      </th>
+      <th>
+        attribute
+      </th>
+    </tr>
+    <tr>
+      <td>
+        2
+      </td>
+      <td>
+        name_two
+      </td>
+    </tr>
+    <tr>
+      <td>
+        1
+      </td>
+      <td>
+        name_one
+      </td>
+    </tr>
+  </table>
+</app-output-list>
+`;
diff --git a/client/src/app/instance/documentation/components/dataset-by-family.component.spec.ts b/client/src/app/instance/documentation/components/dataset-by-family.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..823eca11f37fc14bef55b5be2ba7208ef9e84840
--- /dev/null
+++ b/client/src/app/instance/documentation/components/dataset-by-family.component.spec.ts
@@ -0,0 +1,178 @@
+import { TestBed, waitForAsync, ComponentFixture  } from '@angular/core/testing';
+import { Component, Input } from '@angular/core';
+
+import { AccordionModule } from 'ngx-bootstrap/accordion';
+
+import { DatasetByFamilyComponent } from './dataset-by-family.component';
+import { sharedPipes } from 'src/app/shared/pipes'
+import { Dataset, DatasetFamily, Survey } from '../../../metamodel/models';
+
+const DATASET_LIST: Dataset[] = [
+    {
+        name: 'myDataset1',
+        table_ref: 'table1',
+        label: 'my dataset one',
+        description: 'This is my dataset one',
+        display: 1,
+        data_path: 'path1',
+        survey_name: 'mySurvey',
+        id_dataset_family: 1,
+        public: true,
+        config: {
+            images: ['image1'],
+            cone_search: {
+                cone_search_enabled: true,
+                cone_search_opened: true,
+                cone_search_column_ra: 1,
+                cone_search_column_dec: 2,
+                cone_search_plot_enabled: true,
+                cone_search_sdss_enabled: true,
+                cone_search_sdss_display: 1,
+                cone_search_background: [{ id: 1, enabled: true, display: 1 }]
+            },
+            download: {
+                download_enabled: true,
+                download_opened: true,
+                download_csv: true,
+                download_ascii: true,
+                download_vo: true,
+                download_archive: true
+            },
+            summary: {
+                summary_enabled: true,
+                summary_opened: true
+            },
+            server_link: {
+                server_link_enabled: true,
+                server_link_opened: true
+            },
+            samp: {
+                samp_enabled: true,
+                samp_opened: true
+            },
+            datatable: {
+                datatable_enabled: true,
+                datatable_opened: true,
+                datatable_selectable_rows: true
+            }
+        }
+    },
+    {
+        name: 'myDataset2',
+        table_ref: 'table2',
+        label: 'my dataset two',
+        description: 'This is my dataset two',
+        display: 2,
+        data_path: 'path2',
+        survey_name: 'mySurvey',
+        id_dataset_family: 1,
+        public: true,
+        config: {
+            images: ['image1'],
+            cone_search: {
+                cone_search_enabled: true,
+                cone_search_opened: true,
+                cone_search_column_ra: 1,
+                cone_search_column_dec: 2,
+                cone_search_plot_enabled: true,
+                cone_search_sdss_enabled: true,
+                cone_search_sdss_display: 1,
+                cone_search_background: [{ id: 1, enabled: true, display: 1 }]
+            },
+            download: {
+                download_enabled: true,
+                download_opened: true,
+                download_csv: true,
+                download_ascii: true,
+                download_vo: true,
+                download_archive: true
+            },
+            summary: {
+                summary_enabled: true,
+                summary_opened: true
+            },
+            server_link: {
+                server_link_enabled: true,
+                server_link_opened: true
+            },
+            samp: {
+                samp_enabled: true,
+                samp_opened: true
+            },
+            datatable: {
+                datatable_enabled: true,
+                datatable_opened: true,
+                datatable_selectable_rows: true
+            }
+        }
+    }
+];
+const DATASET_FAMILY_LIST: DatasetFamily[] = [
+    {
+        id: 1,
+        label: 'datasetFamily1',
+        display: 1,
+        opened: true
+    },
+    {
+        id: 2,
+        label: 'datasetFamily2',
+        display: 2,
+        opened: true
+    }
+];
+const SURVEY_LIST: Survey[] = [
+    {
+        name: 'survey1',
+        label: 'Survey one',
+        description: 'This is survey one',
+        link: 'http://survey1.com',
+        manager: 'me',
+        id_database: 1,
+        nb_datasets: 2
+    },
+    {
+        name: 'survey2',
+        label: 'Survey two',
+        description: 'This is survey two',
+        link: 'http://survey2.com',
+        manager: 'me',
+        id_database: 1,
+        nb_datasets: 2
+    }
+];
+
+describe('DatasetByFamilyComponent', () => {
+    @Component({ selector: '<app-dataset-card-doc', template: '' })
+    class DatasetCardDocStubComponent {
+        @Input() survey: Survey;
+        @Input() dataset: Dataset;
+        @Input() instanceSelected: string;
+    }
+
+    let component: DatasetByFamilyComponent;
+    let fixture: ComponentFixture<DatasetByFamilyComponent>;
+
+    beforeEach(waitForAsync(() => {
+        TestBed.configureTestingModule({
+            imports: [AccordionModule.forRoot()],
+            declarations: [
+                DatasetByFamilyComponent,
+                DatasetCardDocStubComponent,
+                sharedPipes
+            ]
+
+        }).compileComponents();
+        fixture = TestBed.createComponent(DatasetByFamilyComponent);
+        component = fixture.componentInstance;
+
+        component.datasetList = DATASET_LIST;
+        component.datasetFamilyList = DATASET_FAMILY_LIST;
+        component.surveyList = SURVEY_LIST;
+        component.instanceSelected = 'myInstance';
+    }));
+
+    it('should create the component', () => {
+        expect(component).toBeDefined();
+    });
+});
diff --git a/client/src/app/instance/documentation/components/dataset-card-doc.component.spec.ts b/client/src/app/instance/documentation/components/dataset-card-doc.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7911b704f2e874d514ddb9d1873f003ac379160a
--- /dev/null
+++ b/client/src/app/instance/documentation/components/dataset-card-doc.component.spec.ts
@@ -0,0 +1,106 @@
+import { TestBed, waitForAsync, ComponentFixture  } from '@angular/core/testing';
+import { RouterTestingModule } from '@angular/router/testing';
+
+import { PopoverModule } from 'ngx-bootstrap/popover';
+
+import { DatasetCardDocComponent } from './dataset-card-doc.component';
+import { Dataset, Survey } from '../../../metamodel/models';
+
+const SURVEY: Survey = {
+    name: 'mySurvey',
+    label: 'my Survey',
+    description: 'This is my survey',
+    link: 'http://my-survey.com',
+    manager: 'me',
+    id_database: 1,
+    nb_datasets: 2
+};
+const DATASET: Dataset = {
+    name: 'myDataset',
+    table_ref: 'table',
+    label: 'my dataset',
+    description: 'This is my dataset',
+    display: 1,
+    data_path: 'path',
+    survey_name: 'mySurvey',
+    id_dataset_family: 1,
+    public: true,
+    config: {
+        images: ['image1'],
+        cone_search: {
+            cone_search_enabled: true,
+            cone_search_opened: true,
+            cone_search_column_ra: 1,
+            cone_search_column_dec: 2,
+            cone_search_plot_enabled: true,
+            cone_search_sdss_enabled: true,
+            cone_search_sdss_display: 1,
+            cone_search_background: [{ id: 1, enabled: true, display: 1 }]
+        },
+        download: {
+            download_enabled: true,
+            download_opened: true,
+            download_csv: true,
+            download_ascii: true,
+            download_vo: true,
+            download_archive: true
+        },
+        summary: {
+            summary_enabled: true,
+            summary_opened: true
+        },
+        server_link: {
+            server_link_enabled: true,
+            server_link_opened: true
+        },
+        samp: {
+            samp_enabled: true,
+            samp_opened: true
+        },
+        datatable: {
+            datatable_enabled: true,
+            datatable_opened: true,
+            datatable_selectable_rows: true
+        }
+    }
+};
+
+describe('DatasetCardDocComponent', () => {
+    let component: DatasetCardDocComponent;
+    let fixture: ComponentFixture<DatasetCardDocComponent>;
+    let router: RouterTestingModule;
+
+    beforeEach(waitForAsync(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                RouterTestingModule,
+                PopoverModule.forRoot()
+            ],
+            declarations: [DatasetCardDocComponent],
+
+        }).compileComponents();
+        fixture = TestBed.createComponent(DatasetCardDocComponent);
+        component = fixture.componentInstance;
+        router = TestBed.inject(RouterTestingModule);
+
+        component.survey = SURVEY;
+        component.dataset = DATASET;
+        component.instanceSelected = 'myInstance';
+    }));
+
+    it('should create the component', () => {
+        expect(component).toBeDefined();
+    });
+
+    // it('#selectDataset() should navigate to the right page', () => {
+    //     const spy = jest.spyOn(router, 'navigate');
+    //     component.selectDataset('myDataset');
+    //     expect(spy).toHaveBeenCalledTimes(1);
+    //     expect(spy).toHaveBeenCalledWith(['/instance/myInstance/documentation/myDataset']);
+    // });
+
+    it('should display information in HTML file', () => {
+        fixture.detectChanges();
+        expect(fixture).toMatchSnapshot();
+    });
+});
diff --git a/client/src/app/instance/documentation/components/dataset-card-doc.component.ts b/client/src/app/instance/documentation/components/dataset-card-doc.component.ts
index adcfcf400fa4169fb562d3f332f39c049352b3ec..58b4592f754e27105da63dc70f7822a0ba5f49a5 100644
--- a/client/src/app/instance/documentation/components/dataset-card-doc.component.ts
+++ b/client/src/app/instance/documentation/components/dataset-card-doc.component.ts
@@ -28,7 +28,12 @@ export class DatasetCardDocComponent {
 
     constructor(private router: Router) { }
 
-    selectDataset(datasetName: string) {
+    /**
+     * Navigates to the documentation page for the given dataset.
+     *
+     * @param  {string} datasetName - The dataset name.
+     */
+    selectDataset(datasetName: string): void {
         this.router.routeReuseStrategy.shouldReuseRoute = () => false;
         this.router.navigate([`/instance/${this.instanceSelected}/documentation/${datasetName}`]);
     }
diff --git a/client/src/app/instance/documentation/components/index.ts b/client/src/app/instance/documentation/components/index.ts
index a4c97d3abd4d83a23b0ce9ee7365150ae024cc47..ca134f30d03016f8ca7c06345237cbc1ee854075 100644
--- a/client/src/app/instance/documentation/components/index.ts
+++ b/client/src/app/instance/documentation/components/index.ts
@@ -1,6 +1,6 @@
 import { DatasetByFamilyComponent } from './dataset-by-family.component';
 import { DatasetCardDocComponent } from './dataset-card-doc.component';
-import { OutputListComponent } from "./output-list.component";
+import { OutputListComponent } from './output-list.component';
 
 export const dummiesComponents = [
     DatasetByFamilyComponent,
diff --git a/client/src/app/instance/documentation/components/output-list.component.spec.ts b/client/src/app/instance/documentation/components/output-list.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..967a841d48719f819259fd36fff2c43bafdeae8d
--- /dev/null
+++ b/client/src/app/instance/documentation/components/output-list.component.spec.ts
@@ -0,0 +1,61 @@
+import { TestBed, waitForAsync, ComponentFixture  } from '@angular/core/testing';
+import { RouterTestingModule } from '@angular/router/testing';
+
+import { OutputListComponent } from './output-list.component';
+import { Attribute } from '../../../metamodel/models';
+
+const ATTRIBUTE_LIST: Attribute[] = [
+    {
+        id: 2,
+        name: 'name_two',
+        label: 'label_two',
+        form_label: 'form_label_two',
+        description : 'description_two',
+        output_display: 1,
+        criteria_display: 1,
+        search_flag : 'SPECTRUM_1D',
+        search_type : 'field',
+        operator : '=',
+        type: '',
+        display_detail: 1
+    },
+    {
+        id: 1,
+        name: 'name_one',
+        label: 'label_one',
+        form_label: 'form_label_one',
+        description: 'description_one',
+        output_display: 2,
+        criteria_display: 2,
+        search_flag: 'ID',
+        search_type: 'field',
+        operator: '=',
+        type: 'integer',
+        display_detail: 2
+    }
+];
+
+describe('OutputListComponent', () => {
+    let component: OutputListComponent;
+    let fixture: ComponentFixture<OutputListComponent>;
+
+    beforeEach(waitForAsync(() => {
+        TestBed.configureTestingModule({
+            imports: [RouterTestingModule],
+            declarations: [OutputListComponent]
+        }).compileComponents();
+        fixture = TestBed.createComponent(OutputListComponent);
+        component = fixture.componentInstance;
+    }));
+
+    it('should create the component', () => {
+        expect(component).toBeDefined();
+    });
+
+    it('should display information in HTML file', () => {
+        component.datasetSelected = 'myTestDataset';
+        component.attributeList = ATTRIBUTE_LIST;
+        fixture.detectChanges();
+        expect(fixture).toMatchSnapshot();
+    });
+});
diff --git a/client/src/app/instance/documentation/containers/dataset-list.component.spec.ts b/client/src/app/instance/documentation/containers/dataset-list.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..afa4d9f4fa8c66e50600573598cbcf7e0cdea490
--- /dev/null
+++ b/client/src/app/instance/documentation/containers/dataset-list.component.spec.ts
@@ -0,0 +1,57 @@
+import { Component, Input } from '@angular/core';
+import { TestBed, waitForAsync, ComponentFixture  } from '@angular/core/testing';
+import { RouterTestingModule } from '@angular/router/testing';
+
+import { provideMockStore, MockStore } from '@ngrx/store/testing';
+
+import { DatasetListComponent } from './dataset-list.component';
+import { AppConfigService } from 'src/app/app-config.service';
+import { Dataset, DatasetFamily, Survey } from '../../../metamodel/models';
+import * as datasetActions from '../../../metamodel/actions/dataset.actions';
+
+describe('DatasetListComponent', () => {
+    @Component({ selector: 'app-spinner', template: '' })
+    class SpinnerStubComponent { }
+
+    @Component({ selector: '<app-dataset-by-family', template: '' })
+    class DatasetByFamilyStubComponent {
+        @Input() datasetList: Dataset[];
+        @Input() datasetFamilyList: DatasetFamily[];
+        @Input() surveyList: Survey[];
+        @Input() instanceSelected: string;
+    }
+
+    let component: DatasetListComponent;
+    let fixture: ComponentFixture<DatasetListComponent>;
+    let store: MockStore;
+    let appConfigServiceStub = new AppConfigService();
+
+    beforeEach(waitForAsync(() => {
+        TestBed.configureTestingModule({
+            imports: [RouterTestingModule],
+            declarations: [
+                DatasetListComponent,
+                SpinnerStubComponent,
+                DatasetByFamilyStubComponent,
+            ],
+            providers: [
+                provideMockStore({ }),
+                { provide: AppConfigService, useValue: appConfigServiceStub },
+            ]
+        }).compileComponents();
+        fixture = TestBed.createComponent(DatasetListComponent);
+        component = fixture.componentInstance;
+        store = TestBed.inject(MockStore);
+    }));
+
+    it('should create the component', () => {
+        expect(component).toBeDefined();
+    });
+
+    it('should execute ngOnInit lifecycle', () => {
+        const spy = jest.spyOn(store, 'dispatch');
+        component.ngOnInit();
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith(datasetActions.loadDatasetList());
+    });
+});
diff --git a/client/src/app/instance/documentation/containers/dataset-list.component.ts b/client/src/app/instance/documentation/containers/dataset-list.component.ts
index 3fd7ad31add6cc2663f4649e3020b78fd4ae350d..2b045c3a14cc6497294bc4cf9a3e639806ca87de 100644
--- a/client/src/app/instance/documentation/containers/dataset-list.component.ts
+++ b/client/src/app/instance/documentation/containers/dataset-list.component.ts
@@ -7,17 +7,18 @@
  * file that was distributed with this source code.
  */
 
-import { Component } from '@angular/core';
+import { Component, OnInit } from '@angular/core';
 
 import { Store } from '@ngrx/store';
 import { Observable } from 'rxjs';
 
+import * as datasetActions from 'src/app/metamodel/actions/dataset.actions';
 import * as datasetFamilySelector from 'src/app/metamodel/selectors/dataset-family.selector';
 import * as datasetSelector from 'src/app/metamodel/selectors/dataset.selector';
 import { Dataset, DatasetFamily, Survey } from 'src/app/metamodel/models';
-import * as authSelector from "../../../auth/auth.selector";
-import * as instanceSelector from "../../../metamodel/selectors/instance.selector";
-import * as surveySelector from "../../../metamodel/selectors/survey.selector";
+import * as authSelector from '../../../auth/auth.selector';
+import * as instanceSelector from '../../../metamodel/selectors/instance.selector';
+import * as surveySelector from '../../../metamodel/selectors/survey.selector';
 
 @Component({
     selector: 'app-dataset-list',
@@ -30,7 +31,7 @@ import * as surveySelector from "../../../metamodel/selectors/survey.selector";
  *
  * @implements OnInit
  */
-export class DatasetListComponent {
+export class DatasetListComponent implements OnInit {
     public instanceSelected: Observable<string>;
     public isAuthenticated: Observable<boolean>;
     public datasetFamilyListIsLoading: Observable<boolean>;
@@ -56,4 +57,8 @@ export class DatasetListComponent {
         this.datasetListIsLoaded = store.select(datasetSelector.selectDatasetListIsLoaded);
         this.datasetList = store.select(datasetSelector.selectAllDatasets);
     }
+
+    ngOnInit() {
+        this.store.dispatch(datasetActions.loadDatasetList());
+    }
 }
diff --git a/client/src/app/instance/documentation/containers/documentation.component.spec.ts b/client/src/app/instance/documentation/containers/documentation.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6bcf457b35645e6f72c85ba298ccaf36c9f8f59c
--- /dev/null
+++ b/client/src/app/instance/documentation/containers/documentation.component.spec.ts
@@ -0,0 +1,62 @@
+import { Component, Input } from '@angular/core';
+import { TestBed, waitForAsync, ComponentFixture  } from '@angular/core/testing';
+import { RouterTestingModule } from '@angular/router/testing';
+
+import { provideMockStore, MockStore } from '@ngrx/store/testing';
+
+import { DocumentationComponent } from './documentation.component';
+import { AppConfigService } from 'src/app/app-config.service';
+import { Attribute } from '../../../metamodel/models';
+import * as attributeActions from '../../../metamodel/actions/attribute.actions';
+
+describe('DocumentationComponent', () => {
+    @Component({ selector: 'app-spinner', template: '' })
+    class SpinnerStubComponent { }
+
+    @Component({ selector: '<app-output-list', template: '' })
+    class OutputListStubComponent {
+        @Input() datasetSelected: string;
+        @Input() attributeList: Attribute[];
+    }
+
+    let component: DocumentationComponent;
+    let fixture: ComponentFixture<DocumentationComponent>;
+    let store: MockStore;
+    let appConfigServiceStub = new AppConfigService();
+
+    beforeEach(waitForAsync(() => {
+        TestBed.configureTestingModule({
+            imports: [RouterTestingModule],
+            declarations: [
+                DocumentationComponent,
+                SpinnerStubComponent,
+                OutputListStubComponent,
+            ],
+            providers: [
+                provideMockStore({ }),
+                { provide: AppConfigService, useValue: appConfigServiceStub },
+            ]
+        }).compileComponents();
+        fixture = TestBed.createComponent(DocumentationComponent);
+        component = fixture.componentInstance;
+        store = TestBed.inject(MockStore);
+    }));
+
+    it('should create the component', () => {
+        expect(component).toBeDefined();
+    });
+
+    it('should execute ngOnInit lifecycle', () => {
+        const spy = jest.spyOn(store, 'dispatch');
+        component.ngOnInit();
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith(attributeActions.loadAttributeList());
+    });
+
+    it('#getUrlServer() should return server URL address', () => {
+        appConfigServiceStub.apiUrl = 'http://test.com';
+        expect(component.getUrlServer()).toBe('http://test.com');
+        appConfigServiceStub.apiUrl = '/testing';
+        expect(component.getUrlServer()).toBe('http://localhost/testing');
+    });
+});
diff --git a/client/src/app/instance/documentation/containers/documentation.component.ts b/client/src/app/instance/documentation/containers/documentation.component.ts
index 49d8b251223ae12942034bb37a68211a5f4318e7..f3e732d7d9ac7008fee50173ba465dbbd017682d 100644
--- a/client/src/app/instance/documentation/containers/documentation.component.ts
+++ b/client/src/app/instance/documentation/containers/documentation.component.ts
@@ -16,8 +16,8 @@ import * as attributeActions from 'src/app/metamodel/actions/attribute.actions';
 import * as datasetSelector from 'src/app/metamodel/selectors/dataset.selector';
 import { AppConfigService } from 'src/app/app-config.service';
 import { Attribute } from 'src/app/metamodel/models';
-import * as instanceSelector from "../../../metamodel/selectors/instance.selector";
-import * as attributeSelector from "../../../metamodel/selectors/attribute.selector";
+import * as instanceSelector from '../../../metamodel/selectors/instance.selector';
+import * as attributeSelector from '../../../metamodel/selectors/attribute.selector';
 
 @Component({
     selector: 'app-documentation',
diff --git a/client/src/app/instance/documentation/documentation-routing.module.ts b/client/src/app/instance/documentation/documentation-routing.module.ts
index 285ad9f802ab495dd3bccd3e83d959d44f0d6757..e4e0b4da1ae8f5d8af008b23e71a53f419ed2fbd 100644
--- a/client/src/app/instance/documentation/documentation-routing.module.ts
+++ b/client/src/app/instance/documentation/documentation-routing.module.ts
@@ -10,14 +10,18 @@
 import { NgModule } from '@angular/core';
 import { Routes, RouterModule } from '@angular/router';
 
-import { DatasetListComponent } from "./containers/dataset-list.component";
-import { DocumentationComponent } from "./containers/documentation.component";
+import { DatasetListComponent } from './containers/dataset-list.component';
+import { DocumentationComponent } from './containers/documentation.component';
 
 const routes: Routes = [
     { path: '', component: DatasetListComponent },
     { path: ':dname', component: DocumentationComponent },
 ];
 
+/**
+ * @class
+ * @classdesc Documentation routing module.
+ */
 @NgModule({
     imports: [RouterModule.forChild(routes)],
     exports: [RouterModule]
diff --git a/client/src/app/instance/documentation/documentation.module.ts b/client/src/app/instance/documentation/documentation.module.ts
index f1505519d6c296391630729e362f0b3de08c8480..c00d4b42b3570484f1f705c8515f4b79881d774e 100644
--- a/client/src/app/instance/documentation/documentation.module.ts
+++ b/client/src/app/instance/documentation/documentation.module.ts
@@ -13,6 +13,10 @@ import { SharedModule } from 'src/app/shared/shared.module';
 import { DocumentationRoutingModule, routedComponents } from './documentation-routing.module';
 import { dummiesComponents } from './components';
 
+/**
+ * @class
+ * @classdesc Documentation module.
+ */
 @NgModule({
     imports: [
         SharedModule,