diff --git a/Makefile b/Makefile
index 993b6e2b78b97b8deea0c5bdc64e393bdf9612f5..d4fb97bc85d38a9d3bc20038fc43ad40fe35e291 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
-UID := 1000
-GID := 1000
+UID := 9898
+GID := 4000
 
 
 list:
diff --git a/client/src/app/admin/instance/dataset/components/attribute/criteria/option-list.component.spec.ts b/client/src/app/admin/instance/dataset/components/attribute/criteria/option-list.component.spec.ts
index 91cfaffb1b39095d8abd7d6e77be9a7c49dd34a4..375925abb6d2049d7e6b841e6e080c5e1ad7f4e8 100644
--- a/client/src/app/admin/instance/dataset/components/attribute/criteria/option-list.component.spec.ts
+++ b/client/src/app/admin/instance/dataset/components/attribute/criteria/option-list.component.spec.ts
@@ -7,10 +7,21 @@
  * file that was distributed with this source code.
  */
 
+import { Component } from '@angular/core';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule, UntypedFormArray, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { OptionListComponent } from './option-list.component';
+@Component({
+    selector: 'app-option-form',
+})
+class OptionFormComponent {
+    form: UntypedFormGroup = new UntypedFormGroup({});
+}
+@Component({
+    selector: 'app-generate-option-list',
+})
+export class GenerateOptionListComponent {}
 
 describe('[admin][instance][dataset][components][attribute][criteria] OptionListComponent', () => {
     let component: OptionListComponent;
@@ -24,7 +35,9 @@ describe('[admin][instance][dataset][components][attribute][criteria] OptionList
     beforeEach(() => {
         TestBed.configureTestingModule({
             declarations: [
-                OptionListComponent
+                OptionListComponent,
+                OptionFormComponent,
+                GenerateOptionListComponent
             ],
             imports: [
                 BrowserAnimationsModule,
diff --git a/client/src/app/admin/instance/dataset/components/attribute/general/tr-general.component.spec.ts b/client/src/app/admin/instance/dataset/components/attribute/general/tr-general.component.spec.ts
index dbf19c1e8536716505bf99a2730c83224207362f..d62a63ba1daf4cc266f8cdd4872e1cccf8f6664f 100644
--- a/client/src/app/admin/instance/dataset/components/attribute/general/tr-general.component.spec.ts
+++ b/client/src/app/admin/instance/dataset/components/attribute/general/tr-general.component.spec.ts
@@ -16,7 +16,10 @@ import { TrGeneralComponent } from './tr-general.component';
 @Component({
     selector: 'app-delete-btn'
 })
-class DeleteBtnComponent { }
+class DeleteBtnComponent {
+    type = ''
+    label = ''
+}
 describe('[admin][instance][dataset][components][attribute][general] TrDetailComponent', () => {
     let component: TrGeneralComponent;
     let fixture: ComponentFixture<TrGeneralComponent>;
diff --git a/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config.component.spec.ts b/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config.component.spec.ts
index 6f965156e98e2812b8def777ba3d98943eced7a0..31d0a71d53637a8ce77650cc15ebdcee451ceadf 100644
--- a/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config.component.spec.ts
+++ b/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config.component.spec.ts
@@ -19,6 +19,8 @@ import { ConeSearchConfigComponent } from './cone-search-config.component';
 })
 class ConeSearchConfigFormComponent {
     form = new UntypedFormGroup({});
+    coneSearchConfig = null;
+    attributeList = []
 }
 describe('[admin][instance][dataset][components][cone-search-config] ConeSearchConfigComponent', () => {
     let component: ConeSearchConfigComponent;
diff --git a/client/src/app/admin/instance/dataset/components/criteria-family/criteria-family-list.component.spec.ts b/client/src/app/admin/instance/dataset/components/criteria-family/criteria-family-list.component.spec.ts
index 078565c133085c6fd46fbc33eb25aa0498402855..a0c52bd4ee5d5678a110bae22433d4820f1c6408 100644
--- a/client/src/app/admin/instance/dataset/components/criteria-family/criteria-family-list.component.spec.ts
+++ b/client/src/app/admin/instance/dataset/components/criteria-family/criteria-family-list.component.spec.ts
@@ -14,9 +14,9 @@ import { CriteriaFamilyListComponent } from './criteria-family-list.component';
 
 @Component({
     selector: 'app-add-criteria-family',
+    templateUrl: 'add-criteria-family.component.html',
 })
-class AddCriteriaFamilyComponent {}
-
+class AddCriteriaFamilyComponent { }
 describe('[admin][instance][dataset][components][criteria-family] CriteriaFamilyListComponent', () => {
     let component: CriteriaFamilyListComponent;
     let fixture: ComponentFixture<CriteriaFamilyListComponent>;
@@ -24,6 +24,7 @@ describe('[admin][instance][dataset][components][criteria-family] CriteriaFamily
         TestBed.configureTestingModule({
             declarations: [
                 CriteriaFamilyListComponent,
+                AddCriteriaFamilyComponent
             ],
             imports: [
                 BrowserAnimationsModule,
diff --git a/client/src/app/admin/instance/dataset/components/dataset-family/dataset-family-card.component.spec.ts b/client/src/app/admin/instance/dataset/components/dataset-family/dataset-family-card.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4c8fe4826db81c8962791852d895e68102792091
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/dataset-family/dataset-family-card.component.spec.ts
@@ -0,0 +1,58 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+import { Pipe, PipeTransform } from '@angular/core';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ReactiveFormsModule } from '@angular/forms';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { Dataset } from 'src/app/metamodel/models';
+import { DatasetFamilyCardComponent } from './dataset-family-card.component';
+
+// mock datasetListByFamily
+
+@Pipe({ name: 'datasetListByFamily' })
+class DatasetListByFamilyPipe implements PipeTransform {
+    transform(datasetList: Dataset[], idDatasetFamily: number): Dataset[] {
+        return datasetList.filter(dataset => dataset.id_dataset_family === idDatasetFamily);
+    }
+}
+
+describe('[admin][instance][dataset][components][dataset-family] DatasetFamilyCardComponent', () => {
+    let component: DatasetFamilyCardComponent;
+    let fixture: ComponentFixture<DatasetFamilyCardComponent>;
+
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            declarations: [
+                DatasetFamilyCardComponent,
+                DatasetListByFamilyPipe
+            ],
+            imports: [
+                BrowserAnimationsModule,
+                ReactiveFormsModule
+            ],
+        });
+        fixture = TestBed.createComponent(DatasetFamilyCardComponent);
+        component = fixture.componentInstance;
+        let dataset: Dataset;
+        component.datasetList = [{ ...dataset, id_dataset_family: 1, label: 'test' }, { ...dataset, id_dataset_family: 2, label: 'test' }]
+        component.datasetFamily = { display: 10, id: 2, label: 'test', opened: false };
+    });
+
+    it('should create the component', () => {
+        expect(component).toBeTruthy();
+    });
+    it('nbDatasetsByDatasetFamily() should return 1', () => {
+
+        let result = component.nbDatasetsByDatasetFamily();
+        expect(result).toEqual(1);
+
+    })
+});
+
+
diff --git a/client/src/app/admin/instance/dataset/components/dataset-family/dataset-family-form.component.spec.ts b/client/src/app/admin/instance/dataset/components/dataset-family/dataset-family-form.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..35a2e02725d7f5014c7a2c5c9b444b1efbea2593
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/dataset-family/dataset-family-form.component.spec.ts
@@ -0,0 +1,53 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ReactiveFormsModule } from '@angular/forms';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { DatasetFamilyFormComponent } from './dataset-family-form.component';
+
+describe('[admin][instance][dataset][components][dataset-family] DatasetFamilyFormComponent', () => {
+    let component: DatasetFamilyFormComponent;
+    let fixture: ComponentFixture<DatasetFamilyFormComponent>;
+
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            declarations: [
+                DatasetFamilyFormComponent,
+            ],
+            imports: [
+                BrowserAnimationsModule,
+                ReactiveFormsModule
+            ],
+        });
+        fixture = TestBed.createComponent(DatasetFamilyFormComponent);
+        component = fixture.componentInstance;
+        component.datasetFamily = { display: 10, id: 1, label: 'test', opened: false };
+        fixture.detectChanges();
+    });
+
+    it('should create the component', () => {
+        expect(component).toBeTruthy();
+    });
+
+    it('submit() should emit databaseFamily and form.value', () => {
+        let spy = jest.spyOn(component.onSubmit, 'emit');
+        component.submit();
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith({ ...component.datasetFamily, ...component.form.value });
+    });
+    it('submit() should emitform.value only', () => {
+        let spy = jest.spyOn(component.onSubmit, 'emit');
+        component.datasetFamily = null;
+        component.submit();
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith({ ...component.form.value });
+    });
+});
+
+
diff --git a/client/src/app/admin/instance/dataset/components/dataset-family/edit-dataset-family.component.spec.ts b/client/src/app/admin/instance/dataset/components/dataset-family/edit-dataset-family.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d87347295087320f03d95a3068dad4fe94215775
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/dataset-family/edit-dataset-family.component.spec.ts
@@ -0,0 +1,57 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { TemplateRef } from '@angular/core';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ReactiveFormsModule } from '@angular/forms';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
+import { EditDatasetFamilyComponent } from './edit-dataset-family.component';
+
+
+describe('[admin][instance][dataset][components][dataset-family] EditDatasetFamilyComponent', () => {
+    let component: EditDatasetFamilyComponent;
+    let fixture: ComponentFixture<EditDatasetFamilyComponent>;
+    const modalServiceStub = {
+        show: jest.fn(),
+    };
+
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            declarations: [
+                EditDatasetFamilyComponent,
+            ],
+            providers: [
+                BsModalRef,
+                { provide: BsModalService, useValue: modalServiceStub }
+            ],
+            imports: [
+                BrowserAnimationsModule,
+                ReactiveFormsModule
+            ],
+        });
+        fixture = TestBed.createComponent(EditDatasetFamilyComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create the component', () => {
+        expect(component).toBeTruthy();
+    });
+
+    it('should call modalRef.show(template)', () => {
+        let template: TemplateRef<any> = null;
+        let spy = jest.spyOn(modalServiceStub, 'show');
+        component.openModal(template);
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith(template);
+    });
+
+});
+
diff --git a/client/src/app/admin/instance/dataset/components/dataset-family/index.spec.ts b/client/src/app/admin/instance/dataset/components/dataset-family/index.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..210d342cc55ba991ff4f34841d38f3d2664ce67c
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/dataset-family/index.spec.ts
@@ -0,0 +1,19 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { datasetFamilyComponents } from './index';
+
+describe('[admin][instance][dataset][components][dataset-family] index', () => {
+    it('should test dataset index components', () => {
+        expect(datasetFamilyComponents.length).toEqual(3);
+    });
+});
+
+
+
diff --git a/client/src/app/admin/instance/dataset/components/dataset/dataset-card.component.spec.ts b/client/src/app/admin/instance/dataset/components/dataset/dataset-card.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d17e43b9f5a1430a84d3c074c473adad8482285a
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/dataset/dataset-card.component.spec.ts
@@ -0,0 +1,40 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { Dataset, Instance } from 'src/app/metamodel/models';
+import { DatasetCardComponent } from './dataset-card.component';
+
+describe('[admin][instance][dataset][components][dataset] DatasetCardComponent', () => {
+    let component: DatasetCardComponent;
+    let fixture: ComponentFixture<DatasetCardComponent>;
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            declarations: [
+                DatasetCardComponent,
+            ],
+            imports: [
+                BrowserAnimationsModule
+            ],
+        });
+        fixture = TestBed.createComponent(DatasetCardComponent);
+        component = fixture.componentInstance;
+        let dataset: Dataset;
+        let instance: Instance;
+        component.dataset = { ...dataset, label: 'test' };
+        component.instance = { ...instance, name: 'test' }
+        fixture.detectChanges();
+    });
+
+    it('should create the component', () => {
+        expect(component).toBeTruthy();
+    });
+
+});
diff --git a/client/src/app/admin/instance/dataset/components/dataset/dataset-form.component.spec.ts b/client/src/app/admin/instance/dataset/components/dataset/dataset-form.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..590a3c2643ffe29c16c1621bf8903e8089987c25
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/dataset/dataset-form.component.spec.ts
@@ -0,0 +1,93 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ReactiveFormsModule } from '@angular/forms';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { DatasetFormComponent } from './dataset-form.component';
+import { AccordionModule } from 'ngx-bootstrap/accordion';
+import { Dataset, Instance } from 'src/app/metamodel/models';
+import { SimpleChange } from '@angular/core';
+
+describe('[admin][instance][dataset][components][dataset] DatasetFormComponent', () => {
+    let component: DatasetFormComponent;
+    let fixture: ComponentFixture<DatasetFormComponent>;
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            declarations: [
+                DatasetFormComponent,
+            ],
+            imports: [
+                BrowserAnimationsModule,
+                ReactiveFormsModule,
+                AccordionModule
+            ],
+        });
+        fixture = TestBed.createComponent(DatasetFormComponent);
+        component = fixture.componentInstance;
+        let dataset: Dataset;
+        let instance: Instance;
+        component.instance = { ...instance, data_path: 'test' };
+        component.dataset = { ...dataset, label: 'test' };
+        component.idDatasetFamily = 1;
+        fixture.detectChanges();
+    });
+
+    it('should create the component', () => {
+        expect(component).toBeTruthy();
+    });
+    it('submit() should emit dataset and form.getRawValue()', () => {
+        let spy = jest.spyOn(component.onSubmit, 'emit');
+        component.submit();
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith({ ...component.dataset, ...component.form.getRawValue() });
+    });
+
+    it('submit() should emit form.getRawValue() only', () => {
+        let spy = jest.spyOn(component.onSubmit, 'emit');
+        component.dataset = null;
+        component.submit();
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith({ ...component.form.getRawValue() });
+    })
+    it('onChangeDatabase() should call disable on form table_ref raw', () => {
+        let spy = jest.spyOn(component.form.controls.table_ref, 'disable');
+        component.onChangeDatabase();
+        expect(spy).toHaveBeenCalledTimes(1);
+    })
+    it('onChangeDatabase() should emit idDatabase', () => {
+        let spy = jest.spyOn(component.changeDatabase, 'emit');
+        component.form.controls.id_database.setValue(1);
+        component.onChangeDatabase();
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith(1);
+    })
+    it('onChangeDataPath(path: string) should emit the instance data_path property', () => {
+        let spy = jest.spyOn(component.loadRootDirectory, 'emit');
+        let path: string = 'test';
+        component.onChangeDataPath(path);
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(spy).toHaveBeenCalledWith(`${component.instance.data_path}${path}`);
+    })
+    it('checkDatatableDisablOpened() should call enable on  form datatable_selectable_rows', () => {
+        let spy = jest.spyOn(component.form.controls.datatable_selectable_rows, 'enable');
+        component.checkDatatableDisablOpened();
+        expect(spy).toHaveBeenCalledTimes(1);
+
+    });
+    it('checkDatatableDisablOpened() should call desable on  form datatable_selectable_rows and set it value to false', () => {
+        let spy = jest.spyOn(component.form.controls.datatable_selectable_rows, 'disable');
+        component.form.controls.datatable_enabled.setValue(false);
+        component.checkDatatableDisablOpened();
+        expect(spy).toHaveBeenCalledTimes(1);
+        expect(component.form.controls.datatable_selectable_rows.value).toEqual(false);
+
+    })
+
+});
diff --git a/client/src/app/admin/instance/dataset/components/dataset/index.spec.ts b/client/src/app/admin/instance/dataset/components/dataset/index.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..25adb236bbf598beca776b8bedf28002055855bf
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/dataset/index.spec.ts
@@ -0,0 +1,19 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { datasetComponents } from './index';
+
+describe('[admin][instance][dataset][components][dataset] index', () => {
+    it('should test dataset index components', () => {
+        expect(datasetComponents.length).toEqual(2);
+    });
+});
+
+
+