Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

333 строки
10 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. function get_dialog_with_gender_link() {
  27. return cy.dialog({
  28. title: "Link",
  29. fields: [
  30. {
  31. 'label': 'Select Gender',
  32. 'fieldname': 'link',
  33. 'fieldtype': 'Link',
  34. 'options': 'Gender',
  35. }
  36. ]
  37. });
  38. }
  39. it("should set the valid value", () => {
  40. get_dialog_with_link().as("dialog");
  41. cy.insert_doc("Property Setter", {
  42. "doctype": "Property Setter",
  43. "doc_type": "ToDo",
  44. "property": "show_title_field_in_link",
  45. "property_type": "Check",
  46. "doctype_or_field": "DocType",
  47. "value": "0"
  48. }, true);
  49. cy.intercept("POST", "/api/method/frappe.desk.search.search_link").as("search_link");
  50. cy.get(".frappe-control[data-fieldname=link] input").focus().as("input");
  51. cy.wait("@search_link");
  52. cy.get("@input").type("todo for link", { delay: 200 });
  53. cy.wait("@search_link");
  54. cy.get(".frappe-control[data-fieldname=link]").findByRole("listbox").should("be.visible");
  55. cy.get(".frappe-control[data-fieldname=link] input").type("{enter}", { delay: 100 });
  56. cy.get(".frappe-control[data-fieldname=link] input").blur();
  57. cy.get("@dialog").then((dialog) => {
  58. cy.get("@todos").then((todos) => {
  59. let value = dialog.get_value("link");
  60. expect(value).to.eq(todos[0]);
  61. });
  62. });
  63. });
  64. it("should unset invalid value", () => {
  65. get_dialog_with_link().as("dialog");
  66. cy.intercept("POST", "/api/method/frappe.client.validate_link").as("validate_link");
  67. cy.get(".frappe-control[data-fieldname=link] input")
  68. .type("invalid value", { delay: 100 })
  69. .blur();
  70. cy.wait("@validate_link");
  71. cy.get(".frappe-control[data-fieldname=link] input").should("have.value", "");
  72. });
  73. it("should be possible set empty value explicitly", () => {
  74. get_dialog_with_link().as("dialog");
  75. cy.intercept("POST", "/api/method/frappe.client.validate_link").as("validate_link");
  76. cy.get(".frappe-control[data-fieldname=link] input").type(" ", { delay: 100 }).blur();
  77. cy.wait("@validate_link");
  78. cy.get(".frappe-control[data-fieldname=link] input").should("have.value", "");
  79. cy.window()
  80. .its("cur_dialog")
  81. .then((dialog) => {
  82. expect(dialog.get_value("link")).to.equal("");
  83. });
  84. });
  85. it("should route to form on arrow click", () => {
  86. get_dialog_with_link().as("dialog");
  87. cy.intercept("POST", "/api/method/frappe.client.validate_link").as("validate_link");
  88. cy.intercept("POST", "/api/method/frappe.desk.search.search_link").as("search_link");
  89. cy.get("@todos").then((todos) => {
  90. cy.get(".frappe-control[data-fieldname=link] input").as("input");
  91. cy.get("@input").focus();
  92. cy.wait("@search_link");
  93. cy.get("@input").type(todos[0]).blur();
  94. cy.wait("@validate_link");
  95. cy.get("@input").focus();
  96. cy.wait(500); // wait for arrow to show
  97. cy.get(".frappe-control[data-fieldname=link] .btn-open").should("be.visible").click();
  98. cy.location("pathname").should("eq", `/app/todo/${todos[0]}`);
  99. });
  100. });
  101. it('show title field in link', () => {
  102. cy.insert_doc("Property Setter", {
  103. "doctype": "Property Setter",
  104. "doc_type": "ToDo",
  105. "property": "show_title_field_in_link",
  106. "property_type": "Check",
  107. "doctype_or_field": "DocType",
  108. "value": "1"
  109. }, true);
  110. cy.clear_cache();
  111. cy.wait(500);
  112. get_dialog_with_link().as("dialog");
  113. cy.window()
  114. .its("frappe")
  115. .then((frappe) => {
  116. if (!frappe.boot) {
  117. frappe.boot = {
  118. link_title_doctypes: ["ToDo"],
  119. };
  120. } else {
  121. frappe.boot.link_title_doctypes = ["ToDo"];
  122. }
  123. });
  124. cy.intercept("POST", "/api/method/frappe.desk.search.search_link").as("search_link");
  125. cy.get(".frappe-control[data-fieldname=link] input").focus().as("input");
  126. cy.wait("@search_link");
  127. cy.get("@input").type("todo for link");
  128. cy.wait("@search_link");
  129. cy.get(".frappe-control[data-fieldname=link] ul").should("be.visible");
  130. cy.get(".frappe-control[data-fieldname=link] input").type("{enter}", { delay: 100 });
  131. cy.get(".frappe-control[data-fieldname=link] input").blur();
  132. cy.get("@dialog").then((dialog) => {
  133. cy.get("@todos").then((todos) => {
  134. let field = dialog.get_field("link");
  135. let value = field.get_value();
  136. let label = field.get_label_value();
  137. expect(value).to.eq(todos[0]);
  138. expect(label).to.eq("this is a test todo for link");
  139. });
  140. });
  141. });
  142. it("should update dependant fields (via fetch_from)", () => {
  143. cy.get("@todos").then((todos) => {
  144. cy.visit(`/app/todo/${todos[0]}`);
  145. cy.intercept("POST", "/api/method/frappe.desk.search.search_link").as("search_link");
  146. cy.intercept("POST", "/api/method/frappe.client.validate_link").as("validate_link");
  147. cy.get(".frappe-control[data-fieldname=assigned_by] input").focus().as("input");
  148. cy.get("@input").type("Administrator", { delay: 100 }).blur();
  149. cy.wait("@validate_link");
  150. cy.get(".frappe-control[data-fieldname=assigned_by_full_name] .control-value").should(
  151. "contain",
  152. "Administrator"
  153. );
  154. cy.window().its("cur_frm.doc.assigned_by").should("eq", "Administrator");
  155. // invalid input
  156. cy.get("@input").clear().type("invalid input", { delay: 100 }).blur();
  157. cy.get(".frappe-control[data-fieldname=assigned_by_full_name] .control-value").should(
  158. "contain",
  159. ""
  160. );
  161. cy.window().its("cur_frm.doc.assigned_by").should("eq", null);
  162. // set valid value again
  163. cy.get("@input").clear().focus();
  164. cy.wait("@search_link");
  165. cy.get("@input").type("Administrator", { delay: 100 }).blur();
  166. cy.wait("@validate_link");
  167. cy.window().its("cur_frm.doc.assigned_by").should("eq", "Administrator");
  168. // clear input
  169. cy.get("@input").clear().blur();
  170. cy.get(".frappe-control[data-fieldname=assigned_by_full_name] .control-value").should(
  171. "contain",
  172. ""
  173. );
  174. cy.window().its("cur_frm.doc.assigned_by").should("eq", "");
  175. });
  176. });
  177. it("should set default values", () => {
  178. cy.insert_doc(
  179. "Property Setter",
  180. {
  181. doctype_or_field: "DocField",
  182. doc_type: "ToDo",
  183. field_name: "assigned_by",
  184. property: "default",
  185. property_type: "Text",
  186. value: "Administrator",
  187. },
  188. true
  189. );
  190. cy.reload();
  191. cy.new_form("ToDo");
  192. cy.fill_field("description", "new", "Text Editor");
  193. cy.intercept("POST", "/api/method/frappe.desk.form.save.savedocs").as("save_form");
  194. cy.findByRole("button", { name: "Save" }).click();
  195. cy.wait("@save_form");
  196. cy.get(".frappe-control[data-fieldname=assigned_by_full_name] .control-value").should(
  197. "contain",
  198. "Administrator"
  199. );
  200. // if user clears default value explicitly, system should not reset default again
  201. cy.get_field("assigned_by").clear().blur();
  202. cy.intercept("POST", "/api/method/frappe.desk.form.save.savedocs").as("save_form");
  203. cy.findByRole("button", { name: "Save" }).click();
  204. cy.wait("@save_form");
  205. cy.get_field("assigned_by").should("have.value", "");
  206. cy.get(".frappe-control[data-fieldname=assigned_by_full_name] .control-value").should(
  207. "contain",
  208. ""
  209. );
  210. });
  211. it('show translated text for Gender link field with language de with input in de', () => {
  212. cy.call('frappe.tests.ui_test_helpers.insert_translations').then(() => {
  213. cy.window().its('frappe').then(frappe => {
  214. cy.set_value('User', frappe.user.name, {language: 'de'});
  215. });
  216. cy.clear_cache();
  217. cy.wait(500);
  218. get_dialog_with_gender_link().as('dialog');
  219. cy.intercept('POST', '/api/method/frappe.desk.search.search_link').as('search_link');
  220. cy.get('.frappe-control[data-fieldname=link] input').focus().as('input');
  221. cy.wait('@search_link');
  222. cy.get('@input').type('Sonstiges', { delay: 100 });
  223. cy.wait('@search_link');
  224. cy.get('.frappe-control[data-fieldname=link] ul').should('be.visible');
  225. cy.get('.frappe-control[data-fieldname=link] input').type('{enter}', { delay: 100 });
  226. cy.get('.frappe-control[data-fieldname=link] input').blur();
  227. cy.get('@dialog').then(dialog => {
  228. let field = dialog.get_field('link');
  229. let value = field.get_value();
  230. let label = field.get_label_value();
  231. expect(value).to.eq('Other');
  232. expect(label).to.eq('Sonstiges');
  233. });
  234. });
  235. });
  236. it('show translated text for Gender link field with language de with input in en', () => {
  237. cy.call('frappe.tests.ui_test_helpers.insert_translations').then(() => {
  238. cy.window().its('frappe').then(frappe => {
  239. cy.set_value('User', frappe.user.name, {language: 'de'});
  240. });
  241. cy.clear_cache();
  242. cy.wait(500);
  243. get_dialog_with_gender_link().as('dialog');
  244. cy.intercept('POST', '/api/method/frappe.desk.search.search_link').as('search_link');
  245. cy.get('.frappe-control[data-fieldname=link] input').focus().as('input');
  246. cy.wait('@search_link');
  247. cy.get('@input').type('Other', { delay: 100 });
  248. cy.wait('@search_link');
  249. cy.get('.frappe-control[data-fieldname=link] ul').should('be.visible');
  250. cy.get('.frappe-control[data-fieldname=link] input').type('{enter}', { delay: 100 });
  251. cy.get('.frappe-control[data-fieldname=link] input').blur();
  252. cy.get('@dialog').then(dialog => {
  253. let field = dialog.get_field('link');
  254. let value = field.get_value();
  255. let label = field.get_label_value();
  256. expect(value).to.eq('Other');
  257. expect(label).to.eq('Sonstiges');
  258. });
  259. });
  260. });
  261. it('show text for Gender link field with language en', () => {
  262. cy.window().its('frappe').then(frappe => {
  263. cy.set_value('User', frappe.user.name, {language: 'en'});
  264. });
  265. cy.clear_cache();
  266. cy.wait(500);
  267. get_dialog_with_gender_link().as('dialog');
  268. cy.intercept('POST', '/api/method/frappe.desk.search.search_link').as('search_link');
  269. cy.get('.frappe-control[data-fieldname=link] input').focus().as('input');
  270. cy.wait('@search_link');
  271. cy.get('@input').type('Non-Conforming', { delay: 100 });
  272. cy.wait('@search_link');
  273. cy.get('.frappe-control[data-fieldname=link] ul').should('be.visible');
  274. cy.get('.frappe-control[data-fieldname=link] input').type('{enter}', { delay: 100 });
  275. cy.get('.frappe-control[data-fieldname=link] input').blur();
  276. cy.get('@dialog').then(dialog => {
  277. let field = dialog.get_field('link');
  278. let value = field.get_value();
  279. let label = field.get_label_value();
  280. expect(value).to.eq('Non-Conforming');
  281. expect(label).to.eq('Non-Conforming');
  282. });
  283. });
  284. });