# Link

## Принцип действия&#x20;

После выбора вызываемого узла, **Link** узел предоставляет возможность переопределить значения его переменных. **Link** узел вызывает исполнение другого узла, передавая ему заданные пользователем переменные. После выполнения, динамические переменные вызванного узла, устанавливаются как динамические переменные родительской группы **Link** узла. Таким образом результат выполнения доступен из любого соседствующего узла **Link**.

#### Из Link узла можно сослаться на:

* [RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узел
* [Folder](https://docs-ru.testmace.com/node-types/folder) узел

#### Нельзя сослаться на:

* Другой **Link** узел (в том числе на самого себя)
* На любого предка **Link** узла (т.к. это вызовет при запуске бесконечный цикл)

{% hint style="info" %}
&#x20;Link узел предоставляет возможность переопределить значения переменных узла родителя.
{% endhint %}

{% hint style="warning" %}
При удалении узла, на который ссылается Link узел, ссылка будет считаться потерянной и запуск будет невозможен пока не будет указана корректная ссылка.
{% endhint %}

## Узел родитель

Создайте узел родитель, на который нужно ссылаться, и задайте ему необходимые [статически определяемые переменные](https://docs-ru.testmace.com/variables/user-variables/static-variables), например `postID`. Значение переменной можно не указывать.

![Создание переменных для узла родителя](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMqrBlEUY-qUdSNMR2%2F-LiMrUP_I2wt8JRAOTIo%2Fl_1.jpg?alt=media\&token=0ddded72-bae2-44e2-ace5-54b585876324)

## Узел Link

Создайте **Link** узел и укажите родителя, после этого отобразятся все созданные переменные родителя. В качестве переопределяемого значения можно использовать любые переменные или статическое значение.&#x20;

![Создание Link узла и выбор родителя](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMqrBlEUY-qUdSNMR2%2F-LiMrYUzKPma0ErHXhNj%2Fl_2.gif?alt=media\&token=23bd3e83-5b06-4164-8ab1-509f065511fc)

## Пример сценария

Рассмотрим пример, в котором, в качестве **Link** узла будем вызывать [RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узел для удаления записи.

### Создание узла родителя

1. Создайте [RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узел с именем **deletePost**
2. Тип запроса DELETE
3. В качестве URL используйте[ https://testmace-stage.herokuapp.com/posts/${id}](https://testmace-stage.herokuapp.com/posts/$%7Bid%7D)
4. Создайте для этого узла [статически определяемую переменную](https://docs-ru.testmace.com/variables/user-variables/static-variables) `id` с пустым значением

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMqrBlEUY-qUdSNMR2%2F-LiMrbQNUc1uEfXxWXb-%2Fl_3.gif?alt=media\&token=ac7a97bf-ebec-446b-9572-9ed1fc258634)

### Создание сценария

* Создайте [Folder](https://docs-ru.testmace.com/node-types/folder) узел с именем **scenario**
* Добавьте в scenario[ RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узел с именем **createPost**:&#x20;
  * тип запроса: POST
  * URL: [https://testmace-stage.herokuapp.com/posts/](https://testmace-stage.herokuapp.com/posts/$%7Bid%7D)
  * body запрос JSON `{"title":"will delete with link node"}`
  * Выполняем запрос и присваиваем `id` созданной записи [динамической переменной](https://docs-ru.testmace.com/variables/user-variables/dynamic-variables) postId для узла **Scenario**.

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMqrBlEUY-qUdSNMR2%2F-LiMrcoO2XM6ONc0CZsH%2Fl_4.gif?alt=media\&token=fd36a09f-0266-4ecf-9707-1031a711d9af)

* Далее создаем **Link** узел с именем **deleteLink**
  * В качества родителя указываем узел **project/deletePost**
  * Для переменной `id` родителя **deletePost** в Link узле указываем Overridden Value `${$dynamicVar.postId}`
* Создадим [RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узел **checkIfExists** для проверки удаления записи
  * Тип запроса: GET
  * URL: [https://testmace-stage.herokuapp.com/posts/${$dynamicVar.postId}](https://testmace-stage.herokuapp.com/posts/$%7B$dynamicVar.postId%7D)
  * Ожидаемый ответ сервера 404.

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMqrBlEUY-qUdSNMR2%2F-LiMrduTdT4bc9kgalMN%2Fl_5.gif?alt=media\&token=3120d7e1-b3b8-4f45-be2a-520e55e855f9)

## Пример проект для импорта [через URL](https://docs-ru.testmace.com/other/import/shared)

{% file src="<https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMqrBlEUY-qUdSNMR2%2F-LiMr55F1c6QspuvzbcH%2Flink-node-demo.txt?alt=media&token=49b9e1f7-3f63-4105-9464-3d41e4ce75ea>" %}

### Файловое представление

**Link** узел представляет из себя папку с названием узла, внутри которой содержится файл index.yml, имеющий следующий формат.

```javascript
{
  "type": "object",
  "properties": {
    "type": {
      "description": "Type of Link node",
      "const": "Link",
      "type": "string"
    },
    "linkedNode": {
      "$ref": "#/definitions/NodeReference",
      "description": "Link to node"
    },
    "children": {
      "description": "List of children names",
      "type": "array",
      "items": {
        "type": "string"
      },
      "default": []
    },
    "variables": {
      "$ref": "#/definitions/NodeVariables",
      "description": "Node variables dictionary"
    },
    "name": {
      "description": "Node name",
      "type": "string"
    }
  },
  "required": [
    "children",
    "linkedNode",
    "name",
    "type",
    "variables"
  ],
  "definitions": {
    "NodeReference": {
      "type": "object",
      "properties": {
        "refNodePath": {
          "description": "Absolute path to node",
          "type": "string"
        },
        "type": {
          "description": "Marker of reference entity",
          "const": "reference",
          "type": "string",
          "default": "reference"
        }
      },
      "required": [
        "refNodePath",
        "type"
      ]
    },
    "NodeVariables": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
```
