Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

218 righe
6.5 KiB

  1. context('Control Link', () => {
  2. before(() => {
  3. cy.login();
  4. cy.visit('/app/website');
  5. });
  6. beforeEach(() => {
  7. cy.visit('/app/website');
  8. cy.create_records({
  9. doctype: 'ToDo',
  10. description: 'this is a test todo for link'
  11. }).as('todos');
  12. });
  13. function get_dialog_with_link() {
  14. return cy.dialog({
  15. title: 'Link',
  16. fields: [
  17. {
  18. 'label': 'Select ToDo',
  19. 'fieldname': 'link',
  20. 'fieldtype': 'Link',
  21. 'options': 'ToDo'
  22. }
  23. ]
  24. });
  25. }
  26. it('should set the valid value', () => {
  27. get_dialog_with_link().as('dialog');
  28. cy.intercept('POST', '/api/method/frappe.desk.search.search_link').as('search_link');
  29. cy.get('.frappe-control[data-fieldname=link] input').focus().as('input');
  30. cy.wait('@search_link');
  31. cy.get('@input').type('todo for link', { delay: 200 });
  32. cy.wait('@search_link');
  33. cy.get('.frappe-control[data-fieldname=link]').findByRole('listbox').should('be.visible');
  34. cy.get('.frappe-control[data-fieldname=link] input').type('{enter}', { delay: 100 });
  35. cy.get('.frappe-control[data-fieldname=link] input').blur();
  36. cy.get('@dialog').then(dialog => {
  37. cy.get('@todos').then(todos => {
  38. let value = dialog.get_value('link');
  39. expect(value).to.eq(todos[0]);
  40. });
  41. });
  42. });
  43. it('should unset invalid value', () => {
  44. get_dialog_with_link().as('dialog');
  45. cy.intercept('POST', '/api/method/frappe.client.validate_link').as('validate_link');
  46. cy.get('.frappe-control[data-fieldname=link] input')
  47. .type('invalid value', { delay: 100 })
  48. .blur();
  49. cy.wait('@validate_link');
  50. cy.get('.frappe-control[data-fieldname=link] input').should('have.value', '');
  51. });
  52. it("should be possible set empty value explicitly", () => {
  53. get_dialog_with_link().as("dialog");
  54. cy.intercept("POST", "/api/method/frappe.client.validate_link").as("validate_link");
  55. cy.get(".frappe-control[data-fieldname=link] input")
  56. .type(" ", { delay: 100 })
  57. .blur();
  58. cy.wait("@validate_link");
  59. cy.get(".frappe-control[data-fieldname=link] input").should("have.value", "");
  60. cy.window()
  61. .its("cur_dialog")
  62. .then((dialog) => {
  63. expect(dialog.get_value("link")).to.equal('');
  64. });
  65. });
  66. it('should route to form on arrow click', () => {
  67. get_dialog_with_link().as('dialog');
  68. cy.intercept('POST', '/api/method/frappe.client.validate_link').as('validate_link');
  69. cy.intercept('POST', '/api/method/frappe.desk.search.search_link').as('search_link');
  70. cy.get('@todos').then(todos => {
  71. cy.get('.frappe-control[data-fieldname=link] input').as('input');
  72. cy.get('@input').focus();
  73. cy.wait('@search_link');
  74. cy.get('@input').type(todos[0]).blur();
  75. cy.wait('@validate_link');
  76. cy.get('@input').focus();
  77. cy.findByTitle('Open Link')
  78. .should('be.visible')
  79. .click();
  80. cy.location('pathname').should('eq', `/app/todo/${todos[0]}`);
  81. });
  82. });
  83. it('show title field in link', () => {
  84. get_dialog_with_link().as('dialog');
  85. cy.insert_doc("Property Setter", {
  86. "doctype": "Property Setter",
  87. "doc_type": "ToDo",
  88. "property": "show_title_field_in_link",
  89. "property_type": "Check",
  90. "doctype_or_field": "DocType",
  91. "value": "1"
  92. }, true);
  93. cy.window().its('frappe').then(frappe => {
  94. if (!frappe.boot) {
  95. frappe.boot = {
  96. link_title_doctypes: ['ToDo']
  97. };
  98. } else {
  99. frappe.boot.link_title_doctypes = ['ToDo'];
  100. }
  101. });
  102. cy.intercept('POST', '/api/method/frappe.desk.search.search_link').as('search_link');
  103. cy.get('.frappe-control[data-fieldname=link] input').focus().as('input');
  104. cy.wait('@search_link');
  105. cy.get('@input').type('todo for link');
  106. cy.wait('@search_link');
  107. cy.get('.frappe-control[data-fieldname=link] ul').should('be.visible');
  108. cy.get('.frappe-control[data-fieldname=link] input').type('{enter}', { delay: 100 });
  109. cy.get('.frappe-control[data-fieldname=link] input').blur();
  110. cy.get('@dialog').then(dialog => {
  111. cy.get('@todos').then(todos => {
  112. let field = dialog.get_field('link');
  113. let value = field.get_value();
  114. let label = field.get_label_value();
  115. expect(value).to.eq(todos[0]);
  116. expect(label).to.eq('this is a test todo for link');
  117. cy.remove_doc("Property Setter", "ToDo-main-show_title_field_in_link");
  118. });
  119. });
  120. });
  121. it('should update dependant fields (via fetch_from)', () => {
  122. cy.get('@todos').then(todos => {
  123. cy.visit(`/app/todo/${todos[0]}`);
  124. cy.intercept('POST', '/api/method/frappe.client.validate_link').as('validate_link');
  125. cy.get('.frappe-control[data-fieldname=assigned_by] input').focus().as('input');
  126. cy.get('@input').type('Administrator', {delay: 100}).blur();
  127. cy.wait('@validate_link');
  128. cy.get('.frappe-control[data-fieldname=assigned_by_full_name] .control-value').should(
  129. 'contain', 'Administrator'
  130. );
  131. cy.window()
  132. .its("cur_frm.doc.assigned_by")
  133. .should("eq", "Administrator");
  134. // invalid input
  135. cy.get('@input').clear().type('invalid input', {delay: 100}).blur();
  136. cy.get('.frappe-control[data-fieldname=assigned_by_full_name] .control-value').should(
  137. 'contain', ''
  138. );
  139. cy.window()
  140. .its("cur_frm.doc.assigned_by")
  141. .should("eq", null);
  142. // set valid value again
  143. cy.get('@input').clear().type('Administrator', {delay: 100}).blur();
  144. cy.wait('@validate_link');
  145. cy.window()
  146. .its("cur_frm.doc.assigned_by")
  147. .should("eq", "Administrator");
  148. // clear input
  149. cy.get('@input').clear().blur();
  150. cy.get('.frappe-control[data-fieldname=assigned_by_full_name] .control-value').should(
  151. 'contain', ''
  152. );
  153. cy.window()
  154. .its("cur_frm.doc.assigned_by")
  155. .should("eq", "");
  156. });
  157. });
  158. it("should set default values", () => {
  159. cy.insert_doc("Property Setter", {
  160. "doctype_or_field": "DocField",
  161. "doc_type": "ToDo",
  162. "field_name": "assigned_by",
  163. "property": "default",
  164. "property_type": "Text",
  165. "value": "Administrator"
  166. }, true);
  167. cy.reload();
  168. cy.new_form("ToDo");
  169. cy.fill_field("description", "new", "Text Editor");
  170. cy.intercept("POST", "/api/method/frappe.desk.form.save.savedocs").as("save_form");
  171. cy.findByRole("button", {name: "Save"}).click();
  172. cy.wait("@save_form");
  173. cy.get(".frappe-control[data-fieldname=assigned_by_full_name] .control-value").should(
  174. "contain", "Administrator"
  175. );
  176. // if user clears default value explicitly, system should not reset default again
  177. cy.get_field("assigned_by").clear().blur();
  178. cy.intercept("POST", "/api/method/frappe.desk.form.save.savedocs").as("save_form");
  179. cy.findByRole("button", {name: "Save"}).click();
  180. cy.wait("@save_form");
  181. cy.get_field("assigned_by").should("have.value", "");
  182. cy.get(".frappe-control[data-fieldname=assigned_by_full_name] .control-value").should(
  183. "contain", ""
  184. );
  185. });
  186. });