LaptopCardPom.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. namespace Tests.E2e.PageObjectModels;
  2. using Microsoft.Playwright;
  3. public class LaptopCardPom(IPage page)
  4. {
  5. // -------------------------------------------------
  6. // Root + Navigation
  7. // -------------------------------------------------
  8. public ILocator LaptopItem(string name)
  9. => page.GetByTestId($"laptop-item-{Sanitize(name)}");
  10. public ILocator OpenLaptopLink(string name)
  11. => page.GetByTestId($"laptop-item-{Sanitize(name)}-link");
  12. public async Task OpenLaptopAsync(string name)
  13. {
  14. await OpenLaptopLink(name).ClickAsync();
  15. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  16. }
  17. // -------------------------------------------------
  18. // Header actions
  19. // -------------------------------------------------
  20. public ILocator RenameButton(string name)
  21. => LaptopItem(name).GetByTestId("rename-laptop-button");
  22. public ILocator CloneButton(string name)
  23. => LaptopItem(name).GetByTestId("clone-laptop-button");
  24. public ILocator DeleteButton(string name)
  25. => LaptopItem(name).GetByTestId("delete-laptop-button");
  26. public ILocator ModelBadge(string name)
  27. => LaptopItem(name).GetByTestId("laptop-model-badge");
  28. // -------------------------------------------------
  29. // CPU section
  30. // -------------------------------------------------
  31. public ILocator CpuSection(string name)
  32. => LaptopItem(name).GetByTestId("laptop-cpu-section");
  33. public ILocator AddCpuButton(string name)
  34. => LaptopItem(name).GetByTestId("add-cpu-button");
  35. public ILocator EditCpuButton(string name, string cpuToString)
  36. => LaptopItem(name).GetByTestId($"edit-cpu-{Sanitize(cpuToString)}");
  37. // -------------------------------------------------
  38. // RAM section
  39. // -------------------------------------------------
  40. public ILocator RamSection(string name)
  41. => LaptopItem(name).GetByTestId("laptop-ram-section");
  42. public ILocator EditRamButton(string name)
  43. => LaptopItem(name).GetByTestId("edit-ram-button");
  44. public ILocator RamValueButton(string name)
  45. => LaptopItem(name).GetByTestId("ram-value-button");
  46. // -------------------------------------------------
  47. // Drive section
  48. // -------------------------------------------------
  49. public ILocator DriveSection(string name)
  50. => LaptopItem(name).GetByTestId("laptop-drive-section");
  51. public ILocator AddDriveButton(string name)
  52. => LaptopItem(name).GetByTestId("add-drive-button");
  53. public ILocator EditDriveButton(string name, string type, int size)
  54. => LaptopItem(name).GetByTestId($"edit-drive-{type}-{size}");
  55. // -------------------------------------------------
  56. // NIC section
  57. // -------------------------------------------------
  58. public ILocator NicSection(string name)
  59. => LaptopItem(name).GetByTestId("laptop-nic-section");
  60. public ILocator AddNicButton(string name)
  61. => LaptopItem(name).GetByTestId("add-nic-button");
  62. public ILocator EditNicButton(string name, string type, double speed)
  63. => LaptopItem(name).GetByTestId($"edit-nic-{type}-{speed}");
  64. // -------------------------------------------------
  65. // GPU section
  66. // -------------------------------------------------
  67. public ILocator GpuSection(string name)
  68. => LaptopItem(name).GetByTestId("laptop-gpu-section");
  69. public ILocator AddGpuButton(string name)
  70. => LaptopItem(name).GetByTestId("add-gpu-button");
  71. public ILocator EditGpuButton(string name, string model, int vram)
  72. => LaptopItem(name).GetByTestId($"edit-gpu-{model}-{vram}");
  73. // -------------------------------------------------
  74. // Notes (MarkdownViewer/MarkdownEditor use prefixes)
  75. // -------------------------------------------------
  76. public ILocator NotesSection(string name)
  77. => LaptopItem(name).GetByTestId("laptop-notes-section");
  78. // MarkdownViewer (TestIdPrefix="laptop-notes-viewer")
  79. public ILocator NotesViewerRoot(string name)
  80. => LaptopItem(name).GetByTestId("laptop-notes-viewer-markdown-viewer");
  81. public ILocator NotesViewerEditButton(string name)
  82. => LaptopItem(name).GetByTestId("laptop-notes-viewer-markdown-viewer-edit-button");
  83. // MarkdownEditor (TestIdPrefix="laptop-notes-editor")
  84. public ILocator NotesEditorRoot(string name)
  85. => LaptopItem(name).GetByTestId("laptop-notes-editor-markdown-editor");
  86. public ILocator NotesEditorTextarea(string name)
  87. => LaptopItem(name).GetByTestId("laptop-notes-editor-markdown-editor-textarea");
  88. public ILocator NotesEditorSave(string name)
  89. => LaptopItem(name).GetByTestId("laptop-notes-editor-markdown-editor-save");
  90. public ILocator NotesEditorCancel(string name)
  91. => LaptopItem(name).GetByTestId("laptop-notes-editor-markdown-editor-cancel");
  92. // -------------------------------------------------
  93. // Modals
  94. // -------------------------------------------------
  95. // ConfirmModal TestIdPrefix="Laptop" => "Laptop-confirm-modal-*"
  96. public ILocator DeleteConfirmModal => page.GetByTestId("Laptop-confirm-modal");
  97. public ILocator DeleteConfirmButton => page.GetByTestId("Laptop-confirm-modal-confirm");
  98. public ILocator DeleteCancelButton => page.GetByTestId("Laptop-confirm-modal-cancel");
  99. // StringValueModal prefixes you set:
  100. // laptop-rename => "laptop-rename-string-value-modal-*"
  101. public ILocator RenameModal => page.GetByTestId("laptop-rename-string-value-modal");
  102. public ILocator RenameModalInput => page.GetByTestId("laptop-rename-string-value-modal-input");
  103. public ILocator RenameModalAccept => page.GetByTestId("laptop-rename-string-value-modal-submit");
  104. public ILocator RenameModalCancel => page.GetByTestId("laptop-rename-string-value-modal-cancel");
  105. // laptop-clone => "laptop-clone-string-value-modal-*"
  106. public ILocator CloneModal => page.GetByTestId("laptop-clone-string-value-modal");
  107. public ILocator CloneModalInput => page.GetByTestId("laptop-clone-string-value-modal-input");
  108. public ILocator CloneModalAccept => page.GetByTestId("laptop-clone-string-value-modal-submit");
  109. public ILocator CloneModalCancel => page.GetByTestId("laptop-clone-string-value-modal-cancel");
  110. // -------------------------------------------------
  111. // Actions helpers
  112. // -------------------------------------------------
  113. public async Task DeleteLaptopAsync(string name)
  114. {
  115. await DeleteButton(name).ClickAsync();
  116. await Assertions.Expect(DeleteConfirmModal).ToBeVisibleAsync();
  117. await DeleteConfirmButton.ClickAsync();
  118. await Assertions.Expect(LaptopItem(name)).Not.ToBeVisibleAsync();
  119. }
  120. public async Task RenameLaptopAsync(string currentName, string newName)
  121. {
  122. await RenameButton(currentName).ClickAsync();
  123. await Assertions.Expect(RenameModal).ToBeVisibleAsync();
  124. await RenameModalInput.FillAsync(newName);
  125. await RenameModalAccept.ClickAsync();
  126. await page.WaitForURLAsync($"**/resources/hardware/{newName}");
  127. }
  128. public async Task CloneLaptopAsync(string currentName, string cloneName)
  129. {
  130. await CloneButton(currentName).ClickAsync();
  131. await Assertions.Expect(CloneModal).ToBeVisibleAsync();
  132. await CloneModalInput.FillAsync(cloneName);
  133. await CloneModalAccept.ClickAsync();
  134. await page.WaitForURLAsync($"**/resources/hardware/{cloneName}");
  135. }
  136. private static string Sanitize(string value)
  137. => value.Replace(" ", "-");
  138. }