@drownek/paper-e2e-runner 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/lib/expect.d.ts +36 -0
- package/dist/lib/expect.d.ts.map +1 -0
- package/dist/lib/expect.js +241 -0
- package/dist/lib/expect.js.map +1 -0
- package/dist/lib/wrappers.d.ts +56 -0
- package/dist/lib/wrappers.d.ts.map +1 -0
- package/dist/lib/wrappers.js +123 -0
- package/dist/lib/wrappers.js.map +1 -0
- package/dist/runner.d.ts +28 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +258 -0
- package/dist/runner.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# @drownek/paper-e2e-runner
|
|
2
|
+
|
|
3
|
+
End-to-end testing runner for Paper/Spigot Minecraft plugins.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @drownek/paper-e2e-runner
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
import { test, expect } from '@drownek/paper-e2e-runner';
|
|
15
|
+
|
|
16
|
+
test('player can join server', async ({ player }) => {
|
|
17
|
+
await player.chat('/help');
|
|
18
|
+
await expect(player).toHaveReceivedMessage('Available commands');
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Documentation
|
|
23
|
+
|
|
24
|
+
Full documentation is available in the [GitHub repository Wiki](https://github.com/yourusername/paper-e2e-test-framework/wiki).
|
|
25
|
+
|
|
26
|
+
## License
|
|
27
|
+
|
|
28
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;IACpC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare class Matchers<T = unknown> {
|
|
2
|
+
protected actual: T;
|
|
3
|
+
protected isNot: boolean;
|
|
4
|
+
constructor(actual: T, isNot?: boolean);
|
|
5
|
+
get not(): Matchers<T>;
|
|
6
|
+
protected _assert(condition: boolean, passMessage: string, failMessage: string): void;
|
|
7
|
+
toBe(expected: any): void;
|
|
8
|
+
toEqual(expected: any): void;
|
|
9
|
+
toBeTruthy(): void;
|
|
10
|
+
toBeFalsy(): void;
|
|
11
|
+
toBeNull(): void;
|
|
12
|
+
toBeUndefined(): void;
|
|
13
|
+
toBeDefined(): void;
|
|
14
|
+
toBeNaN(): void;
|
|
15
|
+
toBeGreaterThan(this: Matchers<number>, expected: number): void;
|
|
16
|
+
toBeGreaterThanOrEqual(this: Matchers<number>, expected: number): void;
|
|
17
|
+
toBeLessThan(this: Matchers<number>, expected: number): void;
|
|
18
|
+
toBeLessThanOrEqual(this: Matchers<number>, expected: number): void;
|
|
19
|
+
toBeCloseTo(this: Matchers<number>, expected: number, precision?: number): void;
|
|
20
|
+
toContain(item: any): void;
|
|
21
|
+
toContainEqual(item: any): void;
|
|
22
|
+
toHaveLength(expected: number): void;
|
|
23
|
+
toHaveProperty(keyPath: string | string[], value?: any): void;
|
|
24
|
+
toMatch(expected: string | RegExp): void;
|
|
25
|
+
toMatchObject(expected: any): void;
|
|
26
|
+
toThrow(expected?: string | RegExp | Function): void;
|
|
27
|
+
toThrowAsync(expected?: string | RegExp | Function): Promise<void>;
|
|
28
|
+
toBeInstanceOf(expected: Function): void;
|
|
29
|
+
protected _deepEqual(a: any, b: any): boolean;
|
|
30
|
+
protected _contains(container: any, item: any): boolean;
|
|
31
|
+
protected _hasProperty(obj: any, keyPath: string | string[]): boolean;
|
|
32
|
+
protected _getProperty(obj: any, keyPath: string | string[]): any;
|
|
33
|
+
protected _matchObject(actual: any, expected: any): boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function expect<T>(actual: T): Matchers<T>;
|
|
36
|
+
//# sourceMappingURL=expect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../../lib/expect.ts"],"names":[],"mappings":"AAOA,qBAAa,QAAQ,CAAC,CAAC,GAAG,OAAO;IAC7B,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACpB,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;gBAEb,MAAM,EAAE,CAAC,EAAE,KAAK,GAAE,OAAe;IAK7C,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAErB;IAED,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAOrF,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IASzB,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAS5B,UAAU,IAAI,IAAI;IAQlB,SAAS,IAAI,IAAI;IAQjB,QAAQ,IAAI,IAAI;IAQhB,aAAa,IAAI,IAAI;IAQrB,WAAW,IAAI,IAAI;IAQnB,OAAO,IAAI,IAAI;IAQf,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ/D,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQtE,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ5D,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQnE,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,IAAI;IASlF,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAS1B,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAa/B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASpC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IAmB7D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASxC,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IASlC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI;IA2C9C,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CxE,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAQxC,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO;IAuB7C,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO;IAgBvD,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAYrE,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG;IAUjE,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;CAiB9D;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAEhD"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
class AssertionError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'AssertionError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class Matchers {
|
|
8
|
+
constructor(actual, isNot = false) {
|
|
9
|
+
this.actual = actual;
|
|
10
|
+
this.isNot = isNot;
|
|
11
|
+
}
|
|
12
|
+
get not() {
|
|
13
|
+
return new this.constructor(this.actual, !this.isNot);
|
|
14
|
+
}
|
|
15
|
+
_assert(condition, passMessage, failMessage) {
|
|
16
|
+
const shouldPass = this.isNot ? !condition : condition;
|
|
17
|
+
if (!shouldPass) {
|
|
18
|
+
throw new AssertionError(this.isNot ? passMessage : failMessage);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
toBe(expected) {
|
|
22
|
+
const pass = Object.is(this.actual, expected);
|
|
23
|
+
this._assert(pass, `Expected value not to be ${expected}, but it was`, `Expected ${this.actual} to be ${expected}`);
|
|
24
|
+
}
|
|
25
|
+
toEqual(expected) {
|
|
26
|
+
const pass = this._deepEqual(this.actual, expected);
|
|
27
|
+
this._assert(pass, `Expected value not to equal ${JSON.stringify(expected)}, but it did`, `Expected ${JSON.stringify(this.actual)} to equal ${JSON.stringify(expected)}`);
|
|
28
|
+
}
|
|
29
|
+
toBeTruthy() {
|
|
30
|
+
this._assert(!!this.actual, `Expected value not to be truthy, but it was ${this.actual}`, `Expected ${this.actual} to be truthy`);
|
|
31
|
+
}
|
|
32
|
+
toBeFalsy() {
|
|
33
|
+
this._assert(!this.actual, `Expected value not to be falsy, but it was ${this.actual}`, `Expected ${this.actual} to be falsy`);
|
|
34
|
+
}
|
|
35
|
+
toBeNull() {
|
|
36
|
+
this._assert(this.actual === null, `Expected value not to be null, but it was`, `Expected ${this.actual} to be null`);
|
|
37
|
+
}
|
|
38
|
+
toBeUndefined() {
|
|
39
|
+
this._assert(this.actual === undefined, `Expected value not to be undefined, but it was`, `Expected ${this.actual} to be undefined`);
|
|
40
|
+
}
|
|
41
|
+
toBeDefined() {
|
|
42
|
+
this._assert(this.actual !== undefined, `Expected value to be undefined, but it was ${this.actual}`, `Expected value to be defined`);
|
|
43
|
+
}
|
|
44
|
+
toBeNaN() {
|
|
45
|
+
this._assert(Number.isNaN(this.actual), `Expected value not to be NaN, but it was`, `Expected ${this.actual} to be NaN`);
|
|
46
|
+
}
|
|
47
|
+
toBeGreaterThan(expected) {
|
|
48
|
+
this._assert(this.actual > expected, `Expected ${this.actual} not to be greater than ${expected}`, `Expected ${this.actual} to be greater than ${expected}`);
|
|
49
|
+
}
|
|
50
|
+
toBeGreaterThanOrEqual(expected) {
|
|
51
|
+
this._assert(this.actual >= expected, `Expected ${this.actual} not to be greater than or equal to ${expected}`, `Expected ${this.actual} to be greater than or equal to ${expected}`);
|
|
52
|
+
}
|
|
53
|
+
toBeLessThan(expected) {
|
|
54
|
+
this._assert(this.actual < expected, `Expected ${this.actual} not to be less than ${expected}`, `Expected ${this.actual} to be less than ${expected}`);
|
|
55
|
+
}
|
|
56
|
+
toBeLessThanOrEqual(expected) {
|
|
57
|
+
this._assert(this.actual <= expected, `Expected ${this.actual} not to be less than or equal to ${expected}`, `Expected ${this.actual} to be less than or equal to ${expected}`);
|
|
58
|
+
}
|
|
59
|
+
toBeCloseTo(expected, precision = 2) {
|
|
60
|
+
const pass = Math.abs(this.actual - expected) < Math.pow(10, -precision) / 2;
|
|
61
|
+
this._assert(pass, `Expected ${this.actual} not to be close to ${expected}`, `Expected ${this.actual} to be close to ${expected}`);
|
|
62
|
+
}
|
|
63
|
+
toContain(item) {
|
|
64
|
+
const pass = this._contains(this.actual, item);
|
|
65
|
+
this._assert(pass, `Expected ${JSON.stringify(this.actual)} not to contain ${JSON.stringify(item)}`, `Expected ${JSON.stringify(this.actual)} to contain ${JSON.stringify(item)}`);
|
|
66
|
+
}
|
|
67
|
+
toContainEqual(item) {
|
|
68
|
+
if (Array.isArray(this.actual)) {
|
|
69
|
+
const pass = this.actual.some((element) => this._deepEqual(element, item));
|
|
70
|
+
this._assert(pass, `Expected array not to contain equal value ${JSON.stringify(item)}`, `Expected array to contain equal value ${JSON.stringify(item)}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.toContain(item);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
toHaveLength(expected) {
|
|
77
|
+
const actualLength = this.actual?.length;
|
|
78
|
+
this._assert(actualLength === expected, `Expected length not to be ${expected}, but it was`, `Expected length to be ${expected}, but got ${actualLength}`);
|
|
79
|
+
}
|
|
80
|
+
toHaveProperty(keyPath, value) {
|
|
81
|
+
const hasProperty = this._hasProperty(this.actual, keyPath);
|
|
82
|
+
if (value !== undefined) {
|
|
83
|
+
const actualValue = this._getProperty(this.actual, keyPath);
|
|
84
|
+
const pass = hasProperty && this._deepEqual(actualValue, value);
|
|
85
|
+
this._assert(pass, `Expected not to have property ${keyPath} with value ${JSON.stringify(value)}`, `Expected to have property ${keyPath} with value ${JSON.stringify(value)}, but got ${JSON.stringify(actualValue)}`);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this._assert(hasProperty, `Expected not to have property ${keyPath}`, `Expected to have property ${keyPath}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
toMatch(expected) {
|
|
92
|
+
const regex = expected instanceof RegExp ? expected : new RegExp(expected);
|
|
93
|
+
this._assert(regex.test(this.actual), `Expected "${this.actual}" not to match ${regex}`, `Expected "${this.actual}" to match ${regex}`);
|
|
94
|
+
}
|
|
95
|
+
toMatchObject(expected) {
|
|
96
|
+
const pass = this._matchObject(this.actual, expected);
|
|
97
|
+
this._assert(pass, `Expected object not to match ${JSON.stringify(expected)}`, `Expected ${JSON.stringify(this.actual)} to match object ${JSON.stringify(expected)}`);
|
|
98
|
+
}
|
|
99
|
+
toThrow(expected) {
|
|
100
|
+
if (typeof this.actual !== 'function') {
|
|
101
|
+
throw new AssertionError('Expected value to be a function');
|
|
102
|
+
}
|
|
103
|
+
let didThrow = false;
|
|
104
|
+
let thrownError;
|
|
105
|
+
try {
|
|
106
|
+
this.actual();
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
didThrow = true;
|
|
110
|
+
thrownError = error;
|
|
111
|
+
}
|
|
112
|
+
if (!didThrow) {
|
|
113
|
+
this._assert(false, '', 'Expected function to throw an error, but it did not');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (expected === undefined) {
|
|
117
|
+
this._assert(didThrow, 'Expected function not to throw', '');
|
|
118
|
+
}
|
|
119
|
+
else if (typeof expected === 'string') {
|
|
120
|
+
this._assert(thrownError.message.includes(expected), `Expected error not to include "${expected}"`, `Expected error to include "${expected}", but got "${thrownError.message}"`);
|
|
121
|
+
}
|
|
122
|
+
else if (expected instanceof RegExp) {
|
|
123
|
+
this._assert(expected.test(thrownError.message), `Expected error not to match ${expected}`, `Expected error to match ${expected}, but got "${thrownError.message}"`);
|
|
124
|
+
}
|
|
125
|
+
else if (typeof expected === 'function') {
|
|
126
|
+
this._assert(thrownError instanceof expected, `Expected error not to be instance of ${expected.name}`, `Expected error to be instance of ${expected.name}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async toThrowAsync(expected) {
|
|
130
|
+
if (typeof this.actual !== 'function') {
|
|
131
|
+
throw new AssertionError('Expected value to be a function');
|
|
132
|
+
}
|
|
133
|
+
let didThrow = false;
|
|
134
|
+
let thrownError;
|
|
135
|
+
try {
|
|
136
|
+
await this.actual();
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
didThrow = true;
|
|
140
|
+
thrownError = error;
|
|
141
|
+
}
|
|
142
|
+
if (!didThrow) {
|
|
143
|
+
this._assert(false, '', 'Expected async function to throw an error, but it did not');
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (expected === undefined) {
|
|
147
|
+
this._assert(didThrow, 'Expected async function not to throw', '');
|
|
148
|
+
}
|
|
149
|
+
else if (typeof expected === 'string') {
|
|
150
|
+
this._assert(thrownError.message.includes(expected), `Expected error not to include "${expected}"`, `Expected error to include "${expected}", but got "${thrownError.message}"`);
|
|
151
|
+
}
|
|
152
|
+
else if (expected instanceof RegExp) {
|
|
153
|
+
this._assert(expected.test(thrownError.message), `Expected error not to match ${expected}`, `Expected error to match ${expected}, but got "${thrownError.message}"`);
|
|
154
|
+
}
|
|
155
|
+
else if (typeof expected === 'function') {
|
|
156
|
+
this._assert(thrownError instanceof expected, `Expected error not to be instance of ${expected.name}`, `Expected error to be instance of ${expected.name}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
toBeInstanceOf(expected) {
|
|
160
|
+
this._assert(this.actual instanceof expected, `Expected value not to be instance of ${expected.name}`, `Expected value to be instance of ${expected.name}`);
|
|
161
|
+
}
|
|
162
|
+
_deepEqual(a, b) {
|
|
163
|
+
if (a === b)
|
|
164
|
+
return true;
|
|
165
|
+
if (a == null || b == null)
|
|
166
|
+
return false;
|
|
167
|
+
if (a.constructor !== b.constructor)
|
|
168
|
+
return false;
|
|
169
|
+
if (a instanceof Date)
|
|
170
|
+
return a.getTime() === b.getTime();
|
|
171
|
+
if (a instanceof RegExp)
|
|
172
|
+
return a.toString() === b.toString();
|
|
173
|
+
if (Array.isArray(a)) {
|
|
174
|
+
if (a.length !== b.length)
|
|
175
|
+
return false;
|
|
176
|
+
return a.every((val, idx) => this._deepEqual(val, b[idx]));
|
|
177
|
+
}
|
|
178
|
+
if (typeof a === 'object') {
|
|
179
|
+
const keysA = Object.keys(a);
|
|
180
|
+
const keysB = Object.keys(b);
|
|
181
|
+
if (keysA.length !== keysB.length)
|
|
182
|
+
return false;
|
|
183
|
+
return keysA.every(key => this._deepEqual(a[key], b[key]));
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
_contains(container, item) {
|
|
188
|
+
if (typeof container === 'string') {
|
|
189
|
+
return container.includes(item);
|
|
190
|
+
}
|
|
191
|
+
if (Array.isArray(container)) {
|
|
192
|
+
return container.includes(item);
|
|
193
|
+
}
|
|
194
|
+
if (container instanceof Set || container instanceof Map) {
|
|
195
|
+
return container.has(item);
|
|
196
|
+
}
|
|
197
|
+
if (typeof container === 'object' && container !== null) {
|
|
198
|
+
return item in container;
|
|
199
|
+
}
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
_hasProperty(obj, keyPath) {
|
|
203
|
+
const keys = Array.isArray(keyPath) ? keyPath : keyPath.split('.');
|
|
204
|
+
let current = obj;
|
|
205
|
+
for (const key of keys) {
|
|
206
|
+
if (current == null || !(key in current)) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
current = current[key];
|
|
210
|
+
}
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
_getProperty(obj, keyPath) {
|
|
214
|
+
const keys = Array.isArray(keyPath) ? keyPath : keyPath.split('.');
|
|
215
|
+
let current = obj;
|
|
216
|
+
for (const key of keys) {
|
|
217
|
+
if (current == null)
|
|
218
|
+
return undefined;
|
|
219
|
+
current = current[key];
|
|
220
|
+
}
|
|
221
|
+
return current;
|
|
222
|
+
}
|
|
223
|
+
_matchObject(actual, expected) {
|
|
224
|
+
if (expected == null || typeof expected !== 'object') {
|
|
225
|
+
return this._deepEqual(actual, expected);
|
|
226
|
+
}
|
|
227
|
+
if (actual == null || typeof actual !== 'object') {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
for (const key in expected) {
|
|
231
|
+
if (!this._matchObject(actual[key], expected[key])) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
export function expect(actual) {
|
|
239
|
+
return new Matchers(actual);
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=expect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.js","sourceRoot":"","sources":["../../lib/expect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Bot } from 'mineflayer';
|
|
2
|
+
interface RawItem {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
slot: number;
|
|
6
|
+
count: number;
|
|
7
|
+
nbt?: {
|
|
8
|
+
value?: {
|
|
9
|
+
display?: {
|
|
10
|
+
value?: {
|
|
11
|
+
Name?: {
|
|
12
|
+
value: string;
|
|
13
|
+
};
|
|
14
|
+
Lore?: {
|
|
15
|
+
value: {
|
|
16
|
+
value: string[];
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
interface Window {
|
|
25
|
+
title: string;
|
|
26
|
+
type: string | number;
|
|
27
|
+
slots: (RawItem | null)[];
|
|
28
|
+
}
|
|
29
|
+
export declare class ItemWrapper {
|
|
30
|
+
raw: RawItem;
|
|
31
|
+
name: string;
|
|
32
|
+
slot: number;
|
|
33
|
+
count: number;
|
|
34
|
+
constructor(rawItem: RawItem);
|
|
35
|
+
static parseChat(raw: string): string;
|
|
36
|
+
getDisplayName(): string;
|
|
37
|
+
getLore(): string[];
|
|
38
|
+
hasLore(text: string): boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare class GuiWrapper {
|
|
41
|
+
bot: Bot;
|
|
42
|
+
window: Window;
|
|
43
|
+
title: string;
|
|
44
|
+
items: ItemWrapper[];
|
|
45
|
+
constructor(bot: Bot, window: Window);
|
|
46
|
+
getTitle(): string;
|
|
47
|
+
findItem(predicate: (item: ItemWrapper) => boolean): ItemWrapper | undefined;
|
|
48
|
+
findAllItems(predicate: (item: ItemWrapper) => boolean): ItemWrapper[];
|
|
49
|
+
getItems(): ItemWrapper[];
|
|
50
|
+
clickItem(predicate: (item: ItemWrapper) => boolean): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
export declare function createPlayerExtensions(bot: Bot): {
|
|
53
|
+
waitForGui(titleMatcher: string | RegExp | ((title: string) => boolean), timeout?: number): Promise<GuiWrapper>;
|
|
54
|
+
};
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=wrappers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers.d.ts","sourceRoot":"","sources":["../../lib/wrappers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,YAAY,CAAC;AAEpC,UAAU,OAAO;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE;QACF,KAAK,CAAC,EAAE;YACJ,OAAO,CAAC,EAAE;gBACN,KAAK,CAAC,EAAE;oBACJ,IAAI,CAAC,EAAE;wBAAE,KAAK,EAAE,MAAM,CAAA;qBAAE,CAAC;oBACzB,IAAI,CAAC,EAAE;wBAAE,KAAK,EAAE;4BAAE,KAAK,EAAE,MAAM,EAAE,CAAA;yBAAE,CAAA;qBAAE,CAAC;iBACzC,CAAA;aACJ,CAAA;SACJ,CAAA;KACJ,CAAC;CACL;AAED,UAAU,MAAM;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,KAAK,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;CAC7B;AAED,qBAAa,WAAW;IACpB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;gBAEF,OAAO,EAAE,OAAO;IAO5B,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAwBrC,cAAc,IAAI,MAAM;IAUxB,OAAO,IAAI,MAAM,EAAE;IAQnB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAKjC;AAED,qBAAa,UAAU;IACnB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;gBAET,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM;IASpC,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,GAAG,WAAW,GAAG,SAAS;IAI5E,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,GAAG,WAAW,EAAE;IAItE,QAAQ,IAAI,WAAW,EAAE;IAInB,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB5E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG;6BAER,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,YAAW,MAAM,GAAU,OAAO,CAAC,UAAU,CAAC;EAwClI"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export class ItemWrapper {
|
|
2
|
+
constructor(rawItem) {
|
|
3
|
+
this.raw = rawItem;
|
|
4
|
+
this.name = rawItem.name;
|
|
5
|
+
this.slot = rawItem.slot;
|
|
6
|
+
this.count = rawItem.count;
|
|
7
|
+
}
|
|
8
|
+
static parseChat(raw) {
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
if (typeof parsed !== 'object')
|
|
12
|
+
return parsed;
|
|
13
|
+
const extractText = (obj) => {
|
|
14
|
+
if (typeof obj === 'string')
|
|
15
|
+
return obj;
|
|
16
|
+
if (!obj || typeof obj !== 'object')
|
|
17
|
+
return '';
|
|
18
|
+
let result = obj.text || '';
|
|
19
|
+
if (Array.isArray(obj.extra)) {
|
|
20
|
+
result += obj.extra.map(extractText).join('');
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
};
|
|
24
|
+
return extractText(parsed);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
return raw;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
getDisplayName() {
|
|
31
|
+
const nbtName = this.raw.nbt?.value?.display?.value?.Name?.value;
|
|
32
|
+
if (nbtName) {
|
|
33
|
+
return ItemWrapper.parseChat(nbtName);
|
|
34
|
+
}
|
|
35
|
+
return this.raw.displayName || this.name;
|
|
36
|
+
}
|
|
37
|
+
getLore() {
|
|
38
|
+
const nbtLore = this.raw.nbt?.value?.display?.value?.Lore?.value?.value;
|
|
39
|
+
if (!nbtLore || !Array.isArray(nbtLore))
|
|
40
|
+
return [];
|
|
41
|
+
return nbtLore.map(line => ItemWrapper.parseChat(line));
|
|
42
|
+
}
|
|
43
|
+
hasLore(text) {
|
|
44
|
+
return this.getLore().some(line => line.toLowerCase().includes(text.toLowerCase()));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class GuiWrapper {
|
|
48
|
+
constructor(bot, window) {
|
|
49
|
+
this.bot = bot;
|
|
50
|
+
this.window = window;
|
|
51
|
+
this.title = ItemWrapper.parseChat(window.title);
|
|
52
|
+
this.items = window.slots
|
|
53
|
+
.filter((item) => item != null)
|
|
54
|
+
.map(item => new ItemWrapper(item));
|
|
55
|
+
}
|
|
56
|
+
getTitle() {
|
|
57
|
+
return this.title;
|
|
58
|
+
}
|
|
59
|
+
findItem(predicate) {
|
|
60
|
+
return this.items.find(predicate);
|
|
61
|
+
}
|
|
62
|
+
findAllItems(predicate) {
|
|
63
|
+
return this.items.filter(predicate);
|
|
64
|
+
}
|
|
65
|
+
getItems() {
|
|
66
|
+
return this.items;
|
|
67
|
+
}
|
|
68
|
+
async clickItem(predicate) {
|
|
69
|
+
const item = this.findItem(predicate);
|
|
70
|
+
if (!item) {
|
|
71
|
+
throw new Error(`[GUI] Failed to click: Item not found matching criteria in "${this.title}"`);
|
|
72
|
+
}
|
|
73
|
+
const lore = item.getLore();
|
|
74
|
+
console.log(`[GUI] Clicking item: ${item.getDisplayName()}`);
|
|
75
|
+
console.log(` Material: ${item.name}`);
|
|
76
|
+
console.log(` Slot: ${item.slot}`);
|
|
77
|
+
if (lore.length > 0) {
|
|
78
|
+
console.log(` Lore: ${lore.join(' | ')}`);
|
|
79
|
+
}
|
|
80
|
+
await this.bot.clickWindow(item.slot, 0, 0);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function createPlayerExtensions(bot) {
|
|
84
|
+
return {
|
|
85
|
+
async waitForGui(titleMatcher, timeout = 5000) {
|
|
86
|
+
const matches = (actual) => {
|
|
87
|
+
const parsed = ItemWrapper.parseChat(actual);
|
|
88
|
+
if (titleMatcher instanceof RegExp) {
|
|
89
|
+
return titleMatcher.test(parsed);
|
|
90
|
+
}
|
|
91
|
+
else if (titleMatcher instanceof Function) {
|
|
92
|
+
return titleMatcher(parsed);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return parsed.includes(titleMatcher);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
// If its currently open, return it immediately
|
|
99
|
+
if (bot.currentWindow && matches(bot.currentWindow.title)) {
|
|
100
|
+
const currentWindow = bot.currentWindow;
|
|
101
|
+
console.log(`[Player] GUI was already open: "${ItemWrapper.parseChat(currentWindow.title)}"`);
|
|
102
|
+
return new Promise(resolve => resolve(new GuiWrapper(bot, currentWindow)));
|
|
103
|
+
}
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
const timeoutId = setTimeout(() => {
|
|
106
|
+
bot.removeListener('windowOpen', handler);
|
|
107
|
+
reject(new Error(`[Player] Timeout waiting for GUI matching: ${titleMatcher} (${timeout}ms)`));
|
|
108
|
+
}, timeout);
|
|
109
|
+
const handler = (window) => {
|
|
110
|
+
const win = window;
|
|
111
|
+
if (matches(win.title)) {
|
|
112
|
+
clearTimeout(timeoutId);
|
|
113
|
+
bot.removeListener('windowOpen', handler);
|
|
114
|
+
console.log(`[Player] GUI Opened: "${ItemWrapper.parseChat(win.title)}"`);
|
|
115
|
+
resolve(new GuiWrapper(bot, win));
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
bot.on('windowOpen', handler);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=wrappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers.js","sourceRoot":"","sources":["../../lib/wrappers.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Bot } from 'mineflayer';
|
|
2
|
+
import { ItemWrapper, GuiWrapper } from './lib/wrappers.js';
|
|
3
|
+
import { Matchers } from "./lib/expect.js";
|
|
4
|
+
export { ItemWrapper, GuiWrapper };
|
|
5
|
+
export interface TestContext {
|
|
6
|
+
player: PlayerWrapper;
|
|
7
|
+
server: ServerWrapper;
|
|
8
|
+
}
|
|
9
|
+
export interface ServerWrapper {
|
|
10
|
+
execute: (cmd: string) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function test(name: string, fn: (context: TestContext) => Promise<void>): void;
|
|
13
|
+
declare class RunnerMatchers<T = unknown> extends Matchers<T> {
|
|
14
|
+
constructor(actual: T, isNot?: boolean);
|
|
15
|
+
toHaveReceivedMessage(this: RunnerMatchers<PlayerWrapper>, expectedMessage: string, strict?: boolean): Promise<void>;
|
|
16
|
+
toContainItem(this: RunnerMatchers<PlayerWrapper>, itemName: string): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare function expect<T>(target: T): RunnerMatchers<T>;
|
|
19
|
+
export declare class PlayerWrapper {
|
|
20
|
+
bot: Bot;
|
|
21
|
+
inventory: Bot['inventory'];
|
|
22
|
+
username: string;
|
|
23
|
+
waitForGui: (title: string | RegExp | ((title: string) => boolean), timeout?: number) => Promise<GuiWrapper>;
|
|
24
|
+
constructor(bot: Bot);
|
|
25
|
+
chat(message: string): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export declare function runTestSession(): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../runner.ts"],"names":[],"mappings":"AACA,OAAmB,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAK7C,OAAO,EAAE,WAAW,EAAE,UAAU,EAA0B,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAEnC,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAgBD,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEpF;AAsCD,cAAM,cAAc,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;gBACrC,MAAM,EAAE,CAAC,EAAE,KAAK,GAAE,OAAe;IAIvC,qBAAqB,CAAC,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3H,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa5F;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAEtD;AAED,qBAAa,aAAa;IACtB,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;gBAEjG,GAAG,EAAE,GAAG;IASd,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK7C;AA0CD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+KpD"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import mineflayer from 'mineflayer';
|
|
3
|
+
import { readdir } from 'fs/promises';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { pathToFileURL } from 'url';
|
|
7
|
+
import { ItemWrapper, GuiWrapper, createPlayerExtensions } from './lib/wrappers.js';
|
|
8
|
+
import { Matchers } from "./lib/expect.js";
|
|
9
|
+
export { ItemWrapper, GuiWrapper };
|
|
10
|
+
const testRegistry = [];
|
|
11
|
+
let currentPlayer = null;
|
|
12
|
+
let messageBuffer = [];
|
|
13
|
+
export function test(name, fn) {
|
|
14
|
+
testRegistry.push({ name, fn });
|
|
15
|
+
}
|
|
16
|
+
function waitFor(checkFn, emitter, eventName, predicateFn, timeoutMsg, timeoutMs = 5000) {
|
|
17
|
+
const result = checkFn();
|
|
18
|
+
if (result)
|
|
19
|
+
return Promise.resolve(result);
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
if (!emitter) {
|
|
22
|
+
reject(new Error('No event emitter available'));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
let handler;
|
|
26
|
+
const timeout = setTimeout(() => {
|
|
27
|
+
emitter.removeListener(eventName, handler);
|
|
28
|
+
reject(new Error(`Timeout: ${timeoutMsg}`));
|
|
29
|
+
}, timeoutMs);
|
|
30
|
+
handler = (...args) => {
|
|
31
|
+
const res = predicateFn(...args);
|
|
32
|
+
if (res) {
|
|
33
|
+
clearTimeout(timeout);
|
|
34
|
+
emitter.removeListener(eventName, handler);
|
|
35
|
+
resolve(res);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
emitter.on(eventName, handler);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
class RunnerMatchers extends Matchers {
|
|
42
|
+
constructor(actual, isNot = false) {
|
|
43
|
+
super(actual, isNot);
|
|
44
|
+
}
|
|
45
|
+
async toHaveReceivedMessage(expectedMessage, strict = false) {
|
|
46
|
+
const player = this.actual;
|
|
47
|
+
const bot = player.bot;
|
|
48
|
+
const isMatch = (msg) => strict ? msg === expectedMessage : msg.includes(expectedMessage);
|
|
49
|
+
const checkFn = () => messageBuffer.find(isMatch);
|
|
50
|
+
await waitFor(checkFn, bot, 'message', (jsonMsg) => {
|
|
51
|
+
const msgStr = String(jsonMsg);
|
|
52
|
+
return isMatch(msgStr) ? msgStr : undefined;
|
|
53
|
+
}, `Expected message "${expectedMessage}" not received`);
|
|
54
|
+
}
|
|
55
|
+
async toContainItem(itemName) {
|
|
56
|
+
const player = this.actual;
|
|
57
|
+
const bot = player.bot;
|
|
58
|
+
const checkFn = () => bot.inventory.items().some(item => item.name.includes(itemName));
|
|
59
|
+
await waitFor(checkFn, bot, 'windowUpdate', checkFn, `Expected item "${itemName}" not found in inventory`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function expect(target) {
|
|
63
|
+
return new RunnerMatchers(target);
|
|
64
|
+
}
|
|
65
|
+
export class PlayerWrapper {
|
|
66
|
+
constructor(bot) {
|
|
67
|
+
this.bot = bot;
|
|
68
|
+
this.inventory = bot.inventory;
|
|
69
|
+
this.username = bot.username;
|
|
70
|
+
const extensions = createPlayerExtensions(bot);
|
|
71
|
+
this.waitForGui = extensions.waitForGui.bind(this);
|
|
72
|
+
}
|
|
73
|
+
async chat(message) {
|
|
74
|
+
console.log(`[Bot] Chatting: ${message}`);
|
|
75
|
+
this.bot.chat(message);
|
|
76
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function waitForServerStart(serverProcess) {
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
const timeout = setTimeout(() => {
|
|
82
|
+
reject(new Error('Server failed to start within 120 seconds'));
|
|
83
|
+
}, 120000);
|
|
84
|
+
let outputBuffer = '';
|
|
85
|
+
const dataHandler = (data) => {
|
|
86
|
+
const output = data.toString();
|
|
87
|
+
outputBuffer += output;
|
|
88
|
+
console.log(output);
|
|
89
|
+
if (output.includes('Done (') ||
|
|
90
|
+
output.includes('DONE') ||
|
|
91
|
+
output.includes('For help, type "help"') ||
|
|
92
|
+
outputBuffer.includes('Done (')) {
|
|
93
|
+
clearTimeout(timeout);
|
|
94
|
+
console.log('\nServer ready detected\n');
|
|
95
|
+
serverProcess.stdout.removeListener('data', dataHandler);
|
|
96
|
+
setTimeout(resolve, 3000);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
serverProcess.stdout.on('data', dataHandler);
|
|
100
|
+
serverProcess.on('error', (err) => {
|
|
101
|
+
clearTimeout(timeout);
|
|
102
|
+
reject(new Error(`Failed to start server: ${err.message}`));
|
|
103
|
+
});
|
|
104
|
+
serverProcess.on('exit', (code) => {
|
|
105
|
+
if (code !== null && code !== 0) {
|
|
106
|
+
clearTimeout(timeout);
|
|
107
|
+
reject(new Error(`Server exited with code ${code} before becoming ready`));
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export async function runTestSession() {
|
|
113
|
+
const serverJar = process.env.SERVER_JAR;
|
|
114
|
+
const serverDir = process.env.SERVER_DIR;
|
|
115
|
+
const javaPath = process.env.JAVA_PATH;
|
|
116
|
+
const testFileFilter = process.env.TEST_FILES;
|
|
117
|
+
const testNameFilter = process.env.TEST_NAMES;
|
|
118
|
+
if (!serverJar || !serverDir) {
|
|
119
|
+
throw new Error('SERVER_JAR, JAVA_PATH and SERVER_DIR environment variables must be set');
|
|
120
|
+
}
|
|
121
|
+
console.log('\nStarting Paper server...');
|
|
122
|
+
const jvmArgsString = process.env.JVM_ARGS || '-Xmx2G -Dcom.mojang.eula.agree=true';
|
|
123
|
+
const jvmArgs = jvmArgsString.split(' ').filter(arg => arg.trim() !== '');
|
|
124
|
+
console.log(`JVM Arguments: ${jvmArgs.join(' ')}`);
|
|
125
|
+
const serverProcess = spawn(javaPath, [...jvmArgs, '-jar', serverJar, '--nogui'], {
|
|
126
|
+
cwd: serverDir,
|
|
127
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
128
|
+
});
|
|
129
|
+
try {
|
|
130
|
+
await waitForServerStart(serverProcess);
|
|
131
|
+
console.log('Server started successfully\n');
|
|
132
|
+
// Check if TypeScript was compiled (dist directory exists with spec files)
|
|
133
|
+
const distDir = join(process.cwd(), 'dist');
|
|
134
|
+
const hasCompiledTests = existsSync(distDir);
|
|
135
|
+
let testFiles = [];
|
|
136
|
+
if (hasCompiledTests) {
|
|
137
|
+
// Look for compiled .spec.js files in dist directory
|
|
138
|
+
const distFiles = (await readdir(distDir))
|
|
139
|
+
.filter(file => file.endsWith('.spec.js'))
|
|
140
|
+
.map(file => join('dist', file));
|
|
141
|
+
testFiles.push(...distFiles);
|
|
142
|
+
}
|
|
143
|
+
// Also look for .spec.js files in the root (for pure JavaScript tests)
|
|
144
|
+
const rootFiles = (await readdir(process.cwd()))
|
|
145
|
+
.filter(file => file.endsWith('.spec.js') && !file.startsWith('dist'));
|
|
146
|
+
testFiles.push(...rootFiles);
|
|
147
|
+
// Apply file filter if provided
|
|
148
|
+
if (testFileFilter) {
|
|
149
|
+
const patterns = testFileFilter.split(',').map(p => p.trim());
|
|
150
|
+
console.log(`Filtering test files with patterns: ${JSON.stringify(patterns)}\n`);
|
|
151
|
+
testFiles = testFiles.filter(file => patterns.some(pattern => {
|
|
152
|
+
const fileName = file.replace(/^dist[/\\]/, '').replace(/\.spec\.js$/, '');
|
|
153
|
+
const matches = fileName.includes(pattern) || file.includes(pattern);
|
|
154
|
+
console.log(` Testing ${file} (basename: ${fileName}) against pattern "${pattern}": ${matches}`);
|
|
155
|
+
return matches;
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
console.log(`Found ${testFiles.length} test file(s)${testFileFilter ? ` matching filter: ${testFileFilter}` : ''}\n`);
|
|
159
|
+
for (const file of testFiles) {
|
|
160
|
+
console.log(`\nRunning tests from: ${file}`);
|
|
161
|
+
testRegistry.length = 0;
|
|
162
|
+
await import(pathToFileURL(join(process.cwd(), file)).href);
|
|
163
|
+
for (const testCase of testRegistry) {
|
|
164
|
+
// Apply test name filter if provided
|
|
165
|
+
if (testNameFilter) {
|
|
166
|
+
const patterns = testNameFilter.split(',').map(p => p.trim());
|
|
167
|
+
const matches = patterns.some(pattern => testCase.name.includes(pattern));
|
|
168
|
+
if (!matches) {
|
|
169
|
+
console.log(` Test: ${testCase.name} - SKIPPED (filter: ${testNameFilter})`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
console.log(` Test: ${testCase.name}`);
|
|
174
|
+
messageBuffer.length = 0;
|
|
175
|
+
const botUsername = `TestBot_${Math.floor(Math.random() * 1000)}`;
|
|
176
|
+
console.log(`[Bot] Creating bot: ${botUsername}`);
|
|
177
|
+
const bot = mineflayer.createBot({
|
|
178
|
+
host: 'localhost',
|
|
179
|
+
port: 25565,
|
|
180
|
+
username: botUsername,
|
|
181
|
+
version: '1.19.4',
|
|
182
|
+
auth: 'offline'
|
|
183
|
+
});
|
|
184
|
+
currentPlayer = bot;
|
|
185
|
+
await new Promise((resolve, reject) => {
|
|
186
|
+
const timeout = setTimeout(() => {
|
|
187
|
+
reject(new Error('Bot failed to spawn within 10 seconds'));
|
|
188
|
+
}, 10000);
|
|
189
|
+
bot.once('spawn', () => {
|
|
190
|
+
console.log(`[Bot] ${botUsername} spawned successfully`);
|
|
191
|
+
clearTimeout(timeout);
|
|
192
|
+
resolve();
|
|
193
|
+
});
|
|
194
|
+
bot.once('error', (err) => {
|
|
195
|
+
console.log(`[Bot] Connection error: ${err.message}`);
|
|
196
|
+
clearTimeout(timeout);
|
|
197
|
+
reject(err);
|
|
198
|
+
});
|
|
199
|
+
bot.once('kicked', (reason) => {
|
|
200
|
+
console.log(`[Bot] Kicked: ${reason}`);
|
|
201
|
+
clearTimeout(timeout);
|
|
202
|
+
reject(new Error(`Bot was kicked: ${reason}`));
|
|
203
|
+
});
|
|
204
|
+
bot.once('end', (reason) => {
|
|
205
|
+
console.log(`[Bot] Connection ended: ${reason}`);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
bot.on('message', (jsonMsg) => {
|
|
209
|
+
const message = String(jsonMsg);
|
|
210
|
+
console.log(`[Bot] Received message: "${message}"`);
|
|
211
|
+
messageBuffer.push(message);
|
|
212
|
+
});
|
|
213
|
+
bot.on('windowOpen', (window) => {
|
|
214
|
+
const win = window;
|
|
215
|
+
console.log(`[DEBUG] Global windowOpen event - Title: "${win.title}", Type: ${win.type}, SlotCount: ${win.slots?.length}`);
|
|
216
|
+
});
|
|
217
|
+
bot.on('windowClose', (window) => {
|
|
218
|
+
const win = window;
|
|
219
|
+
console.log(`[DEBUG] windowClose event - Window: ${win?.title || 'unknown'}`);
|
|
220
|
+
});
|
|
221
|
+
bot._client.on('open_window', (packet) => {
|
|
222
|
+
console.log(`[DEBUG] Raw open_window packet:`, JSON.stringify(packet));
|
|
223
|
+
});
|
|
224
|
+
try {
|
|
225
|
+
const player = new PlayerWrapper(bot);
|
|
226
|
+
const server = {
|
|
227
|
+
execute: async (cmd) => {
|
|
228
|
+
console.log(`[Server] Executing: ${cmd}`);
|
|
229
|
+
serverProcess.stdin.write(cmd + '\n', (err) => {
|
|
230
|
+
if (err)
|
|
231
|
+
console.error(`[Server] Write error: ${err}`);
|
|
232
|
+
});
|
|
233
|
+
await new Promise(r => setTimeout(r, 500));
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
await testCase.fn({ player, server });
|
|
237
|
+
console.log(` PASSED\n`);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
console.log(` FAILED: ${error.message}\n`);
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
bot.quit();
|
|
245
|
+
currentPlayer = null;
|
|
246
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
console.log('\nAll tests passed!');
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
console.log('\nStopping server...');
|
|
254
|
+
serverProcess.kill();
|
|
255
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@drownek/paper-e2e-runner",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "End-to-end testing framework for Paper/Spigot Minecraft plugins",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/runner.js",
|
|
7
|
+
"types": "dist/runner.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"paper-e2e-runner": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"minecraft",
|
|
20
|
+
"paper",
|
|
21
|
+
"spigot",
|
|
22
|
+
"testing",
|
|
23
|
+
"e2e",
|
|
24
|
+
"mineflayer"
|
|
25
|
+
],
|
|
26
|
+
"author": "drownek",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/drownek/paper-e2e-test.git",
|
|
31
|
+
"directory": "runner-package"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://github.com/drownek/paper-e2e-test#readme",
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/drownek/paper-e2e-test/issues"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"mineflayer": "^4.0.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^22.10.5",
|
|
42
|
+
"typescript": "^5.7.3"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=16.0.0"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
}
|
|
50
|
+
}
|