LaptopCardPom.cs 8.4 KB

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