Skip to content

Commit b303dc2

Browse files
committed
Сделал так, чтобы Button можно было использовать для HtmlButton из react (не react-ui)
1 parent 0cb0536 commit b303dc2

File tree

12 files changed

+238
-137
lines changed

12 files changed

+238
-137
lines changed

src/Controls.Extensions/Controls.Extensions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<Title>Playwright.ReactUI.Controls.Extensions</Title>
2424
<AssemblyVersion>1.0.0.0</AssemblyVersion>
2525
<FileVersion>1.0.0</FileVersion>
26-
<Version>3.0.0</Version>
26+
<Version>3.1.0</Version>
2727
<Authors>Evgeniy Ivanov</Authors>
2828
<Product>Playwright.ReactUI.Controls.Extensions</Product>
2929
<PackageReadmeFile>README-Controls.Extensions.md</PackageReadmeFile>

src/Controls/Button.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,17 @@
88

99
namespace Playwright.ReactUI.Controls;
1010

11+
/// <summary>
12+
/// Button можно использовать как для @skbkontur/react-ui, так и для react
13+
/// Но часть функциональности (проверка на Error / Warning) не будет работать с button из react
14+
/// </summary>
1115
public class Button : ControlBase, IFocusable
1216
{
1317
public Button(ILocator rootLocator)
1418
: base(rootLocator)
1519
{
16-
ButtonLocator = rootLocator.Locator("button");
20+
// Or(rootLocator).Last сделан для кнопки из react (не react-ui)
21+
ButtonLocator = rootLocator.Locator("button").Or(rootLocator).Last;
1722
}
1823

1924
public ILocator ButtonLocator { get; }

src/Controls/Controls.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<Title>Playwright.ReactUI.Controls</Title>
2525
<AssemblyVersion>1.0.0.0</AssemblyVersion>
2626
<FileVersion>1.0.0</FileVersion>
27-
<Version>3.0.0</Version>
27+
<Version>3.1.0</Version>
2828
<Authors>Evgeniy Ivanov</Authors>
2929
<Product>Playwright.ReactUI.Controls</Product>
3030
<PackageReadmeFile>README-Controls.md</PackageReadmeFile>

src/Controls/HtmlButton.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
namespace Playwright.ReactUI.Controls;
1010

11+
/// <summary>
12+
/// Кнопка для react (а не @skbkontur/react-ui)
13+
/// </summary>
1114
public class HtmlButton : ControlBase, IFocusable
1215
{
1316
public HtmlButton(ILocator rootLocator)

src/Playwright.ReactUI.sln.DotSettings

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,10 @@
322322
<s:Boolean x:Key="/Default/UserDictionary/Words/=fxinput/@EntryIndexedValue">True</s:Boolean>
323323
<s:Boolean x:Key="/Default/UserDictionary/Words/=pagescount/@EntryIndexedValue">True</s:Boolean>
324324
<s:Boolean x:Key="/Default/UserDictionary/Words/=radiogroup/@EntryIndexedValue">True</s:Boolean>
325+
<s:Boolean x:Key="/Default/UserDictionary/Words/=skbkontur/@EntryIndexedValue">True</s:Boolean>
325326
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0412_043E_0437_043C_043E_0436_043D_043E/@EntryIndexedValue">True</s:Boolean>
326327
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0418_0441_043F_043E_043B_044C_0437_0443_0439/@EntryIndexedValue">True</s:Boolean>
328+
<s:Boolean x:Key="/Default/UserDictionary/Words/=_041A_043D_043E_043F_043A_0430/@EntryIndexedValue">True</s:Boolean>
327329
<s:Boolean x:Key="/Default/UserDictionary/Words/=_041D_0435_0432_043E_0437_043C_043E_0436_043D_043E/@EntryIndexedValue">True</s:Boolean>
328330
<s:Boolean x:Key="/Default/UserDictionary/Words/=_041D_0435_043B_044C_0437_044F/@EntryIndexedValue">True</s:Boolean>
329331
<s:Boolean x:Key="/Default/UserDictionary/Words/=_041D_0438_0447_0435_0433_043E/@EntryIndexedValue">True</s:Boolean>
@@ -367,6 +369,7 @@
367369
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0438_043D_0430_0447_0435/@EntryIndexedValue">True</s:Boolean>
368370
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0438_0441_043F_043E_043B_044C_0437_043E_0432_0430_0442_044C/@EntryIndexedValue">True</s:Boolean>
369371
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0438_0441_043F_043E_043B_044C_0437_0443_0435_0442_0435/@EntryIndexedValue">True</s:Boolean>
372+
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043A_043D_043E_043F_043A_0438/@EntryIndexedValue">True</s:Boolean>
370373
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043A_043E_0433_0434_0430/@EntryIndexedValue">True</s:Boolean>
371374
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043A_043E_0434_0435/@EntryIndexedValue">True</s:Boolean>
372375
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043A_043E_043B_0438_0447_0435_0441_0442_0432_0430/@EntryIndexedValue">True</s:Boolean>
@@ -405,10 +408,12 @@
405408
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043F_043E_0441_043B_0435_0434_043D_0435_0439/@EntryIndexedValue">True</s:Boolean>
406409
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043F_043E_0441_043B_0435_0434_043D_044F_044F/@EntryIndexedValue">True</s:Boolean>
407410
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043F_0440_0435_0434_0438_043A_0430_0442_0443/@EntryIndexedValue">True</s:Boolean>
411+
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0440_0430_0431_043E_0442_0430_0442_044C/@EntryIndexedValue">True</s:Boolean>
408412
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0440_0430_0431_043E_0442_044B/@EntryIndexedValue">True</s:Boolean>
409413
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0440_0430_0432_0435_043D/@EntryIndexedValue">True</s:Boolean>
410414
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0440_0430_0432_043D_043E/@EntryIndexedValue">True</s:Boolean>
411415
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0440_0430_0437_0434_0435_043B_044F_0435_0442/@EntryIndexedValue">True</s:Boolean>
416+
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0434_0435_043B_0430_043D/@EntryIndexedValue">True</s:Boolean>
412417
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_043B_0435_0434_0443_044E_0449_0438_0445/@EntryIndexedValue">True</s:Boolean>
413418
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_043B_0435_0434_0443_044E_0449_0443_044E/@EntryIndexedValue">True</s:Boolean>
414419
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_043B_0443_0447_0430_044F_0445/@EntryIndexedValue">True</s:Boolean>
@@ -437,6 +442,8 @@
437442
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0444_043B_0430_0433/@EntryIndexedValue">True</s:Boolean>
438443
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0444_043B_0430_0433_0430/@EntryIndexedValue">True</s:Boolean>
439444
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0444_0440_043E_043D_0442_043E_0432_043E_043C/@EntryIndexedValue">True</s:Boolean>
445+
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0444_0443_043D_043A_0446_0438_043E_043D_0430_043B_044C_043D_043E_0441_0442_0438/@EntryIndexedValue">True</s:Boolean>
446+
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0447_0430_0441_0442_044C/@EntryIndexedValue">True</s:Boolean>
440447
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0447_0442_043E_0431_044B/@EntryIndexedValue">True</s:Boolean>
441448
<s:Boolean x:Key="/Default/UserDictionary/Words/=_044D_043B_0435_043C_0435_043D_0442_0430/@EntryIndexedValue">True</s:Boolean>
442449
<s:Boolean x:Key="/Default/UserDictionary/Words/=_044D_043B_0435_043C_0435_043D_0442_043E_0432/@EntryIndexedValue">True</s:Boolean>
Lines changed: 65 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Text.RegularExpressions;
1+
using System.Collections.Generic;
2+
using System.Text.RegularExpressions;
23
using System.Threading.Tasks;
34
using NUnit.Framework;
45
using Playwright.ReactUI.Controls;
@@ -8,152 +9,176 @@ namespace Playwright.ReactUI.Tests.Assertions;
89

910
public class ButtonAssertionsV2Tests : TestsBase
1011
{
12+
private static IEnumerable<TestCaseData> ButtonCases()
13+
{
14+
yield return new TestCaseData("button");
15+
// ReSharper disable once StringLiteralTypo
16+
yield return new TestCaseData("htmlbutton");
17+
}
18+
1119
[Test]
12-
public async Task ToBeVisible()
20+
[TestCaseSource(nameof(ButtonCases))]
21+
public async Task ToBeVisible(string buttonType)
1322
{
14-
var button = await GetButtonAsync("default").ConfigureAwait(false);
23+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
1524
await button.ExpectV2().ToBeVisibleAsync().ConfigureAwait(false);
1625
}
1726

1827
[Test]
19-
public async Task ToBeHidden()
28+
[TestCaseSource(nameof(ButtonCases))]
29+
public async Task ToBeHidden(string buttonType)
2030
{
21-
var button = await GetButtonAsync("hidden").ConfigureAwait(false);
31+
var button = await GetButtonAsync($"{buttonType}--hidden").ConfigureAwait(false);
2232
await button.WaitForAsync().ConfigureAwait(false);
2333

2434
await button.ExpectV2().ToBeHiddenAsync().ConfigureAwait(false);
2535
}
2636

2737
[Test]
28-
public async Task ToBeEnabled()
38+
[TestCaseSource(nameof(ButtonCases))]
39+
public async Task ToBeEnabled(string buttonType)
2940
{
30-
var button = await GetButtonAsync("default").ConfigureAwait(false);
41+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
3142
await button.ExpectV2().ToBeEnabledAsync().ConfigureAwait(false);
3243
}
3344

3445
[Test]
35-
public async Task ToBeDisabled()
46+
[TestCaseSource(nameof(ButtonCases))]
47+
public async Task ToBeDisabled(string buttonType)
3648
{
37-
var button = await GetButtonAsync("disabled").ConfigureAwait(false);
49+
var button = await GetButtonAsync($"{buttonType}--disabled").ConfigureAwait(false);
3850
await button.ExpectV2().ToBeDisabledAsync().ConfigureAwait(false);
3951
}
4052

4153
[Test]
4254
public async Task ToHaveError()
4355
{
44-
var button = await GetButtonAsync("error").ConfigureAwait(false);
56+
var button = await GetButtonAsync("button--error").ConfigureAwait(false);
4557
await button.ExpectV2().ToHaveErrorAsync().ConfigureAwait(false);
4658
}
4759

4860
[Test]
4961
public async Task NotToHaveError()
5062
{
51-
var button = await GetButtonAsync("default").ConfigureAwait(false);
63+
var button = await GetButtonAsync("button--default").ConfigureAwait(false);
5264
await button.ExpectV2().NotToHaveErrorAsync().ConfigureAwait(false);
5365
}
5466

5567
[Test]
5668
public async Task ToHaveWarning()
5769
{
58-
var button = await GetButtonAsync("warning").ConfigureAwait(false);
70+
var button = await GetButtonAsync("button--warning").ConfigureAwait(false);
5971
await button.ExpectV2().ToHaveWarningAsync().ConfigureAwait(false);
6072
}
6173

6274
[Test]
6375
public async Task NotToHaveWarning()
6476
{
65-
var button = await GetButtonAsync("default").ConfigureAwait(false);
77+
var button = await GetButtonAsync("button--default").ConfigureAwait(false);
6678
await button.ExpectV2().NotToHaveWarningAsync().ConfigureAwait(false);
6779
}
6880

6981
[Test]
70-
public async Task ToHaveAttribute_With_Attribute_Value()
82+
[TestCaseSource(nameof(ButtonCases))]
83+
public async Task ToHaveAttribute_With_Attribute_Value(string buttonType)
7184
{
72-
var button = await GetButtonAsync("default").ConfigureAwait(false);
85+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
7386
await button.ExpectV2().ToHaveAttributeAsync("data-tid", "ButtonId").ConfigureAwait(false);
7487
}
7588

7689
[Test]
77-
public async Task ToHaveAttribute_Without_Attribute_Value()
90+
[TestCaseSource(nameof(ButtonCases))]
91+
public async Task ToHaveAttribute_Without_Attribute_Value(string buttonType)
7892
{
79-
var button = await GetButtonAsync("default").ConfigureAwait(false);
93+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
8094
await button.ExpectV2().ToHaveAttributeAsync("data-tid").ConfigureAwait(false);
8195
}
8296

8397
[Test]
84-
public async Task NotToHaveAttribute_With_Attribute_Value()
98+
[TestCaseSource(nameof(ButtonCases))]
99+
public async Task NotToHaveAttribute_With_Attribute_Value(string buttonType)
85100
{
86-
var button = await GetButtonAsync("default").ConfigureAwait(false);
101+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
87102
await button.ExpectV2().NotToHaveAttributeAsync("data-tid", "WrongValue").ConfigureAwait(false);
88103
}
89104

90105
[Test]
91-
public async Task NotToHaveAttribute_Without_Attribute_Value()
106+
[TestCaseSource(nameof(ButtonCases))]
107+
public async Task NotToHaveAttribute_Without_Attribute_Value(string buttonType)
92108
{
93-
var button = await GetButtonAsync("default").ConfigureAwait(false);
109+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
94110
await button.ExpectV2().NotToHaveAttributeAsync("data-tid-2").ConfigureAwait(false);
95111
}
96112

97113
[Test]
98-
public async Task ToHaveText()
114+
[TestCaseSource(nameof(ButtonCases))]
115+
public async Task ToHaveText(string buttonType)
99116
{
100-
var button = await GetButtonAsync("default").ConfigureAwait(false);
117+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
101118
await button.ExpectV2().ToHaveTextAsync("TODO").ConfigureAwait(false);
102119
}
103120

104121
[Test]
105-
public async Task ToHaveText_With_Regex()
122+
[TestCaseSource(nameof(ButtonCases))]
123+
public async Task ToHaveText_With_Regex(string buttonType)
106124
{
107-
var button = await GetButtonAsync("default").ConfigureAwait(false);
125+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
108126
await button.ExpectV2().ToHaveTextAsync(new Regex("^TO.*")).ConfigureAwait(false);
109127
}
110128

111129
[Test]
112-
public async Task NotToHaveText()
130+
[TestCaseSource(nameof(ButtonCases))]
131+
public async Task NotToHaveText(string buttonType)
113132
{
114-
var button = await GetButtonAsync("default").ConfigureAwait(false);
133+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
115134
await button.ExpectV2().NotToHaveTextAsync("TODO777").ConfigureAwait(false);
116135
}
117136

118137
[Test]
119-
public async Task NotToHaveText_With_Regex()
138+
[TestCaseSource(nameof(ButtonCases))]
139+
public async Task NotToHaveText_With_Regex(string buttonType)
120140
{
121-
var button = await GetButtonAsync("default").ConfigureAwait(false);
141+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
122142
await button.ExpectV2().NotToHaveTextAsync(new Regex("^TOD1.*")).ConfigureAwait(false);
123143
}
124144

125145
[Test]
126-
public async Task ToContainText()
146+
[TestCaseSource(nameof(ButtonCases))]
147+
public async Task ToContainText(string buttonType)
127148
{
128-
var button = await GetButtonAsync("default").ConfigureAwait(false);
149+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
129150
await button.ExpectV2().ToContainTextAsync("TO").ConfigureAwait(false);
130151
}
131152

132153
[Test]
133-
public async Task ToContainText_With_Regex()
154+
[TestCaseSource(nameof(ButtonCases))]
155+
public async Task ToContainText_With_Regex(string buttonType)
134156
{
135-
var button = await GetButtonAsync("default").ConfigureAwait(false);
157+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
136158
await button.ExpectV2().ToContainTextAsync(new Regex("^T.*")).ConfigureAwait(false);
137159
}
138160

139161
[Test]
140-
public async Task NotToContainText()
162+
[TestCaseSource(nameof(ButtonCases))]
163+
public async Task NotToContainText(string buttonType)
141164
{
142-
var button = await GetButtonAsync("default").ConfigureAwait(false);
165+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
143166
await button.ExpectV2().NotToContainTextAsync("777").ConfigureAwait(false);
144167
}
145168

146169
[Test]
147-
public async Task NotToContainText_With_Regex()
170+
[TestCaseSource(nameof(ButtonCases))]
171+
public async Task NotToContainText_With_Regex(string buttonType)
148172
{
149-
var button = await GetButtonAsync("default").ConfigureAwait(false);
173+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
150174
await button.ExpectV2().NotToContainTextAsync(new Regex("^7.*")).ConfigureAwait(false);
151175
}
152176

153177
[Test]
154-
public async Task ToBeFocused_And_NotToBeFocused()
178+
[TestCaseSource(nameof(ButtonCases))]
179+
public async Task ToBeFocused_And_NotToBeFocused(string buttonType)
155180
{
156-
var button = await GetButtonAsync("default").ConfigureAwait(false);
181+
var button = await GetButtonAsync($"{buttonType}--default").ConfigureAwait(false);
157182

158183
await button.ExpectV2().NotToBeFocusedAsync().ConfigureAwait(false);
159184

@@ -163,7 +188,7 @@ public async Task ToBeFocused_And_NotToBeFocused()
163188

164189
private async Task<Button> GetButtonAsync(string storyName)
165190
{
166-
await Page.GotoAsync(StorybookUrl.Get($"button--{storyName}")).ConfigureAwait(false);
191+
await Page.GotoAsync(StorybookUrl.Get(storyName)).ConfigureAwait(false);
167192
return new Button(Page.GetByTestId("ButtonId"));
168193
}
169194
}

src/Tests/Assertions/HtmlButtonAssertionsV2Tests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public async Task ToBeDisabled()
4242
public async Task ToHaveAttribute_With_Attribute_Value()
4343
{
4444
var htmlButton = await GetHtmlButtonAsync("default").ConfigureAwait(false);
45-
await htmlButton.ExpectV2().ToHaveAttributeAsync("data-tid", "HtmlButtonId").ConfigureAwait(false);
45+
await htmlButton.ExpectV2().ToHaveAttributeAsync("data-tid", "ButtonId").ConfigureAwait(false);
4646
}
4747

4848
[Test]
@@ -137,6 +137,6 @@ private async Task<HtmlButton> GetHtmlButtonAsync(string storyName)
137137
{
138138
// ReSharper disable once StringLiteralTypo
139139
await Page.GotoAsync(StorybookUrl.Get($"htmlbutton--{storyName}")).ConfigureAwait(false);
140-
return new HtmlButton(Page.GetByTestId("HtmlButtonId"));
140+
return new HtmlButton(Page.GetByTestId("ButtonId"));
141141
}
142142
}

0 commit comments

Comments
 (0)