►
From YouTube: Frontend Pairing on Jestodus - diffs/components/app_spec
Description
Here's the Jestodus epic:
- https://gitlab.com/groups/gitlab-org/-/epics/895
Here's our jestodus-codemod project:
- https://gitlab.com/gitlab-org/frontend/playground/jestodus-codemod
Here's the MR we made :)
- https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27234
A
This
is
yeah,
so
I
think
this
is
the
link
I've
been
using
for
everything?
Oh
now
right,
but
anyways.
This
is
everything
I
guess
everyone
can
do
everything
on
it,
which
I
guess
is
cool
I,
can't
record,
for
example,
Wow,
okay,
well,
I'm,
sorry,
anyways
yeah!
So
does
anyone
want
to
drive
I,
don't
mind
driving?
But
if
someone
any
wants
to
do
something
some
driving
I
can
we
can
all
mob
control
the
person
or,
if
you
know
it's
up
to
everybody,
I.
A
C
A
A
D
E
A
A
C
E
E
A
Spec
file
runs
in
a
playground,
but
not
the
individual
tests,
and
so
we
still
need
to
be
careful
not
to
write
flaky
stuff
even
in
jest,
but
I
know
that
one
was
written
in
karma
and
now
we've
migrated.
It
I've
seen
us
really
try
to
be
as
just
sandbox
in
some
cases,
but
yeah
we
can't
even
Jess
can
be
flaky
it's
good
to
keep
in
mind,
but
you
said
you
already
have
a
fix
for
it.
Yeah.
A
Yeah
yeah
I
know
what
you
mean
so
have
you
guys
all
seen
as
have
you
all
see
this
this
chart
of
how
funny
it
lab
is
so
when
I
look
at
this
I'm
like
man,
we're
so
close.
But
if
you
look
at
the
number
of
karma
files
we
have
here,
you
go
back
to
the
beginning,
the
number
of
karma
files,
it's
like.
Oh,
we
haven't
even
moved
50
percent
of
them,
so
I
don't
need
to
start
off
on,
discouraging
though
but
I
thought.
A
D
A
C
Be
nice
and
I
forget
which
one
was
very
large.
Let's.
E
A
A
Just
status
code,
mine
so
in
a
different
terminal,
I've
opened
up
just
a
tiss
code
mine.
Let
me
see
if
I
can
open
up
the
readme
tips.
You
can
check
that.
Does
this
live
within
the
get
lab
project,
or
is
this
just?
It
is
not
yeah.
This
is
in
the
front
end
playground,
oh
okay,
so
if
you
go
to
wherever
we
have
our
front-end
playground
project
projects
to
see
this
and
the
readme
has
instructions
for
setting
it
up.
We
have
to
install
this
globally.
There's
some
little
quirks
with
this.
A
And
if
you
don't
patch,
parser
Babylon
to
it,
it
has
a
really
hard
time
finding
our
babbled
and
Fagin
and
can't
really
read
the
code.
Really
well
so
those
are
the
reasons
why,
but
this
is
all
you
have
to
do
is
just
see
DP
justice
codemod,
you
run
it
parser,
Babylon
and
then
I
go
out
to
my
get
mad
worlds
and
they
respect
fun
and
just
employments
aspect
right.
A
A
A
Yeah
so,
for
instance,
we're
gonna
need
to
move
some
of
the
helpers,
so
let's
go
ahead
and
move
a
helper
to
resolve
this.
So
it's
probably,
how
should
I
do
this?
It's
over
in
JavaScript,
I
lost
my
place.
Oh
yeah!
Here
we
go
creative
store,
let's
open
this
up
it.
Maybe
it's
used
yeah.
So
what
the
way
anytime
there's
a
helper
like
this.
A
D
A
A
So
something
I've
done
in
the
past
you
to
do
this.
This
whole
process
world
faster,
is
to
move
large
quantities
of
these
run
that
transformer
for,
like
a
whole,
for
specifying
what
directories
I've
done
or
even
just
move
these
new
ones
just
to
an
individual
directory.
So
it's
easy
for
me
to
select
them
and
that
transformer
can
run
across
multiple,
multiple
files
and
sometimes
that's
all
that's
needed.
Unfortunately,
it's
like
60%
of
the
time.
That's
all
it's
needed,
40
percent
of
the
time
it
needs
some
sort
of
manual
intervention.
A
E
A
Them
are
if
it's,
if
it's,
if
I,
had
to
rewrite
a
test,
I'll
put
that
in
its
own
thing,
if
it
was
just
I'm,
these
are
just
trivial.
I
ran
to
my
program.
Three,
maybe
just
updated
a
few
lines.
I'll
do
a
whole
folder
yeah
and
that's
how
the
issues
are
created
and
so
yeah.
That's
not
a
that's,
not
a
significant
deal
either
the
one
thing
so
I'm
gonna
we're
gonna
pause
real
fast.
You
got
me
started
talking
about
my
eyes.
A
You
want
to
watch
out,
for
if
you
sometimes
get
labs,
diff
isn't
really
helpful,
like
communicating
the
real
story
here,
and
it
can
look
like
I've
added,
a
new
test
which
is
using
some
really
old
practices
and
so
make
sure
you
just
review
the
diff
before
you
pass
it
to
the
maintainer,
because
you'd
want
to
make
it
really
obvious
of
like
hey
we're,
not
introducing
any
new
technical
debt.
Just
moving
this
to
jest
there's
another
issue
for
maybe
cleaning
it
up.
A
Yes,
we
have
lots
of
failures,
I
think
they've
all
failed,
so
good
news,
it's
probably
something
unlike
it
before
each
after
each
thing,
if
this,
so,
if
they're,
all
failing
it's
better
than
than
like
just
30
of
them,
failing,
but
let's
just
one
one
of
them
and
see
if
we
can
get
some
better
insight.
These.
C
C
Is
incompatible
Jess?
Is
that
right
or
have
we
oh
geez,
you
know
what
look
for
is
it?
Is
there
a
keyboard
spec
already
written?
Let's
see
if
we're
super
lucky
I've
already
fixed
this
and
the
keyboard
shortcuts
back
people
are
navigators
back
there.
You
go
yes,
so
this
is
using
Mouse
chat.
It
is
so
why?
What's
right?
What's
your
beef
here,
it's
not
imported
in
here!
I,
don't
know
there.
It
is
import,
mastered,
yeah,
oh,
but.
A
Export,
that's
right!
So
here's
here's
a
I,
remember
what
we
talked
about
this
Jess,
so
you
notice
here
it's
imported
like
this
and
I
later
on.
We
ex
guess!
Yes,
we
could
dive
in.
Are
you
guys
curious
and
want
to
unbox
this
mystery?
Oh,
that's!
The
I
think
Justin
I
already
know
the
import
master
out,
but
not
import
mousetraps
from
somewhere,
yep
yep,
because
here's.
Why
and
this
here's
another
huge
difference
to
remember
when
doing
this,
that's
between
karma
and
jest.
A
So
here's
that
dive
didn't
see
the
node
modules
mouth
chat.
We
look
at
it
and
we
see
sometimes
some
type
of
export
at
the
bottom
yeah
and
look
what
it
does.
It
just
exposes
it
to
the
low
objects
and
it
might
do
some
sort
of
a
MZ
thing.
It's
not
even
doing
well
thanks
or
module
that
exports.
If
I
look
for
module,
how
there's
no
module
that
exports
yeah
web
pack
knows
what
you
did.
A
Jess
does
not
use
webpack
for
performance
reasons,
which
is
a
good
thing,
but
it's
a
bad
thing
and
that
sometimes
these
things
come
up.
I
can
only
imagine
the
rabbit-hole
to
find
this.
There
was
yeah,
there
was
a.
It
was
one
of
those.
If
you
ever
hear
me
talking
you're
like
man,
Paul
really
doesn't
trust.
Third-Party
libraries
is
because
most
of
the
time
radicals
lead
to
diving
into
node
modules,
that's
not
a
fun
rabbit
hole,
but
I
think
we
can
just
import
this
and
call
it
a
day.
I
think
that's
cuz.
A
C
A
C
A
A
A
I
recently
received
some
interesting
feedback
when
I
created
this
mock
that
I
shouldn't
have,
but
we
weren't
able
to
get
it
to
work
any
other
way
and
the
reason
I
shouldn't
have
you'll
notice.
We
have
another
mocks,
folder
I,
don't
really
know
what
this
is
doing
other
than
maybe
we
can
mock
ourselves
on
some
things.
A
I
personally
would
not
use
this
for
mocking
those
stuff
and
we
need
to
address
our
documentation
because
it
says
something
weird
about
that,
because
mocking
no
stuff
works
really
nicely
if
we
just
use
just
native
mocking
thing,
which
I
don't
think
was
was
realized
at
the
time
of
creating
some
of
this.
This
custom
mock
helper,
but
I'm
gonna
go
ahead
and
double
down
on
my
civil
disobedience
and
we're
gonna
create
another
mock,
saying
here,
because
it's
just
really
easy
and
I
know
that
it
works.
A
E
A
Made
I
am
a
chronic
optimist,
so
it
might
not
fix
all
of
our
problems,
so
that
was
a
global
marker
that
will
be
for
every
single
test
and
our
production
environment,
which
is
huge
too.
So
it's
a
global
mock
any
time
I
am
importing
it's
gonna
import
through
that
file.
First,
you
saw
how
easy
was
yeah,
really
don't
get
too
happy
with
it,
and
there
were
needs
to
probably
be
a
really
good
reason
for
this.
So
maybe
we
should
add
a
comment
for
why
we
had
to
do
this.
A
A
You,
if
you
look
up
an
RFP
guide,
what
our
guide
is
actually
just
discouraging
is
you
can
drop
this
mocks
folder
anywhere
even
in
production
code,
even
in
our
root
directory
and
people
use
that,
and
rather
than
like
copying,
the
folder
path,
I'll
just
drop
it
to
where
I
want
to
actually
do
it.
I
want
to
mock,
like
I,
could
have
put
this
somewhere
in
an
application
code,
and
that
is
a
little
problematic
because
it's
nice
to
keep
all
our
test
code
in
one
place.
A
So
that's
what
it's
really
mean
towards
discouraging
because
we
had
to
I.
Don't
know
if
this
lets
us
mock
I'm
our
application
directory,
so
I
would
go
ahead
and
use
this
mocks.
Folder
I
would
go
ahead,
use
this
custom
box
folder
for
any
kind
of
CD
mocking
you
might
need
to
do,
but
for
doing
those
stuff
we
should
use
jests
out-of-the-box
thing:
cuz,
that's
just
really
easy
and
it
doesn't
require
any
custom
thing
at
all
AMD
which
web
pack
understands,
but
just
it's
not.
A
A
A
A
E
E
A
Daddy,
have
you
guys
or
have
you
all
sorry
y'all
ever
run
into
webworker
stuff
with
jest
and
karma
cuz?
That's
what
I'm
thinking
of
going
on
here
webpack
has
a
really
fancy
web
worker
loader,
which
we
can
define
a
web
worker
and
it
creates
this
default
export
for
it,
and
web
workers
are
like
asynchronous
processes
that
can
run
on
a
separate
thread
and
your
browser,
and
you
send
and
post
messages
to
it.
Let's
see
if
I
could
even
find
one
of
our
workers
nope.
Okay,
we
have
like
a
different
dress
yeah.
A
E
Yeah,
what
were
you
saying?
Yeah?
You
can't
specify
it
actually
in
Denmark
that
I
assigned
to
you
for
review
that
I'm
doing
that
you
can.
Actually
you
can
actually
use
a.
We
have
a
loader
to
load
those,
and
then
you
can
attach
it
to
the
URL
okay.
But
in.
A
Jest
when
I
able
to
do
anything,
Marie
able
to
do
anything
in
jest
with
this
or
all
right
yeah,
that
was
a
cargo
part
yeah
you're
right.
No,
this
may
be
a
silly
question,
but
before
the
SUBSCRIBE
block,
can
you
not
just
mock
the
tree
list?
I
think
that's
a
good
idea,
but
it's
weird
that
tree
worker
and
that
it's
it's
throwing
and
if
sap
I
feel
like
this
error
message
is
really
weird:
I'm
surprised
it's
tree
list,
but
I,
guess
I,
guess,
you're
right,
I!
A
A
A
A
E
G
A
A
Okay,
it's
add:
eventlistener
terminate
postmessage,
that's
doable,
let's
go
to
I,
think
I
lost
my
place.
I
did.
D
A
Now
we
could
do
something
really
interesting.
We
could
do.
A
A
A
A
D
A
A
E
A
But
we
saw
there
are
tree
worker
problem,
which
is
great
and
I.
Guess
it's
a
test
ever
needed
to
like
detect
how
we're
actually
passing
messages
to
this
that
one
could
individually.
That's
an
interesting
point
that
one
could
individually
create
a
mock
to
return
a
specific
and
then
create
spies
on
that,
so
he
can
detect
something.
A
So
we
probably
would
have
been
fine
having
just
one
global
worker
mock
like
this,
and
this
led
if
an
individual
test
needs
to
do
some
assertion
on
it,
letting
that
individual
one
overwrite
with
something
but
let's
for
the
sake
of
iteration,
will
sign
over
think
that
part-
and
let's
go
back
to
our
interesting
problem
here
with
apps
back.
A
Yeah
we'd
have
to
end
up
redressing
a
lot
of
these
plus
week.
We
would
potentially
end
up
losing
test
coverage
because
we
can't
what,
if
mocks
yes,
yeah
I'm,
hoping
that
we
have
that
we
don't
okay
yeah.
This
is
mark
Axios,
that's
the
thing
here
when
I
say
losing
test
coverage.
I
am
NOT
super
optimistic
about
our
test
coverage
and
get
lab
world.
So
when
ever
doing
the
move
from
karma
suggests,
if
you
changed
something
from
a
full
mount
to
a
shallow
man,
there's
no
guarantee
that
those
individual
units
are
well
test.
A
A
D
A
A
A
C
A
G
F
E
A
A
A
E
A
G
A
A
A
Yeah
another
way,
if
another
thing
is
a
way
of
doing
this,
is
to
take
move.
This
expectation
outside
the
trigger
just
do
all
the
triggers
and
then
do
all
the
expecting
and
one
go,
but
I
think
all
of
this
is
failing
rather
than
clearing
us
all.
I
think
it's
family,
because
that
transformer
doesn't
transform
some
of
our
our
jest
mocks,
really
well
so
I
think
it's
just
not
even
using
the
right
API.
So,
let's
look
at
just
mock.
A
A
That
one
so
that
one
pass
yeah,
it
was
a
noise
yeah,
I'm
gonna,
just
not
touch
it.
I
would
prefer,
rather
than
having
an
expectation
in
a
loop
I
prefer.
Somehow
we
build
like
an
expectation
array
that
we
can
then
do.
One
big
expects
whatever
to
equal.
This
array
of
things
that
have
happened
good
could
be
change
it
to
a
describe
and
didn't
have
a
table.
A
You're
right,
let's
go
for
the
let's
go
for
the
overkill,
so
we're
gonna
pass
in
all
of
our
mapping.
Keys,
yeah.
A
G
If
you
just
specify
a
normal
array,
it
actually
makes
it
into
a
table.
So
it
you
know,
if
you
just
give
a
simple
array
into
just
it
will
think
yeah
there.
It
is
table
I,
do
you
got
it
and
then
you
can
just
use
the
normal
string.
You
can
see
that
if
you
pass
a
1d
array
of
primitives
internally
it'll
be
mapped
to
a
table.
Oh
wow.
A
A
C
C
E
A
A
E
C
A
A
G
A
D
A
F
C
A
A
Yeah,
so
here's
here's
an
opportunity
for
a
transform
or
let
me
let
me
highlight
what
I'm
what
I'm
doing
here
looks
like
our
current
justice
code.
Mod
is
to
leave
any
thought
args
around,
which
it
really
doesn't
need
to.
That
could
be
an
interesting
addition
to
our
adjusted
as
code,
not
under
writing.
Code.
Mods
is
really
easy.
We
could
spend
the
last
five
minutes
ish
of
this
kind
of
dive
into
that.
If
you
want
to
totally
yeah
that's.
G
A
G
G
C
C
A
A
So
I
haven't
commented
out,
but
if
you
ever
using
this
for
some
purpose
that
you
actually
want
to
transform
that
kind
of
module
uncomment
this
line
and
try
it
out,
but
rather
than
manipulating
code,
it
would
be
really
cool
for
me
to
run
when
I
was
running.
You
know,
J
is
coach.
A
If
I
think
you
have
the
option
to
pass
options
here
and
I
could
maybe
pass
an
option
like
with
bits
or
whatever,
and
if
we
can
somehow
figure
out
that
flag
and
enable
that
transformer
or
not
that'd
be
cool,
but
we
don't
have
to
worry
about
that.
But
here's,
if
you
wanted
to
add
a
transformer,
they
all
come
from
yeah.
Here's
where
we're
requiring
all
of
our
custom
ones.
We
have
a
glory
amounted
to
one
which
renamed
set
timeouts
to
set
Amy,
it
I
think
or
maybe
what
is
it
doing
here?
A
A
Helper
functions
and
builders,
these
are
those
options
that
could
be
passed
in
and
this
is
like
our
routes,
abstract,
syntax
tree
element,
so
what's
going
on
here,
is
in
our
route.
We're
finding
all
call
expressions
we're
seeing.
Is
this
an
empty
set
timeout
and
then
we're
replacing
it
with
we're.
Gonna
create
a
set.
This
is
set
interval,
but
that's
wrong.
It's
set
immediate.
So
let's
fix
that
and
we're
replacing
it
with
a
set
immediate
call
and
that's
it
so
there's
also
a
really
cool,
helper
and
I.
We
should
add
this
to
the
readme.
A
You
can
find
it
yes
tree
Explorer,
yes,
I!
Think!
Yes,
have
you
ever
seen
this?
Oh,
it's
so
cool.
It
is
really
cool,
so
I
can
drop
in
whatever
kind
of
code
I
want
to
understand
and
how
to
communicate
in
terms
of
the
abstract,
syntax
trees,
like
I
click
on
this
I
see.
Oh,
here's
an
import
decoration-
and
this
is
the
API
for
that
kind
of
thing.
So
it's
really
helpful.
I
use
this
just
so.
I
know
what
I'm
looking
for,
and
this
should
be
in
our
readme.
C
A
I
I.
Well,
that's
a
good
question.
Let
me
end
my
screen:
I'm,
not
sharing.
Let
me
check
my
I
have
I
have
like
30
minutes
me
Tony.
Let's
do
it
alright
that
works
out.
If
you
don't
mind.
F
A
D
A
D
A
A
A
A
A
And
I
think
these
ones
doesn't
matter
when
we're
doing
them
so
I
think
we
can
do
this
I
think
we
can
do
third
party
transformers
back
to
the
cat
and
then
reduce
this.
Is
that
all
does
that
all
seem?
Oh,
we.
We
can't
do
that
because
it
looks
like
the
API
that
we're
using
to
call
the
actual
transform
is
different.
A
A
C
C
A
F
C
A
Okay,
it
seems
it
ran,
which
is
really
encouraging.
Yes,
you
see
all
the
different
changes
in
things.
It
does
a
lot,
I,
don't
GZ.
So
this
is
the
one
then
that
we
had
supplied
where
we're
transforming
set
timeout
to
set
immediate
because
said,
timeout
is
mocked,
but
be
really
interesting
to
maybe
make
it
do
like
wait
for
promises.
Instead,
that
would
require
us
adding
an
import
and
other
things.
We.
A
C
A
C
A
A
What
is
this
call
expression?
That's
that
whole
call.
What
we
really
want
to
check
is
like,
like
is
it
args
after
after
a
Mach
is
kind
of
what
I'm
really
hoping
to
see
over
here
is
Mach.
A
E
A
A
So
usually
we're
gonna
be
trying
to
find
something
and
I
think
what
might
be
cool
is.
If
we
tried
to
find
this,
maybe
we
do
you
think
doc
dot.
Ours
is
what
we
should
be
looking
for.
Maybe
you
should
look
for
dot
calls
yeah
and
then
go
from
there
or
maybe
you
should
look
for
dot
Mach
and
go
from
there.
Yeah.
A
A
Right
right,
that's
what
I
wanted
to
see
is
like,
let's
look
for
mark
and
then
let's
see
doesn't
have
calls
and
let's
see,
does
it
have
done
args
and
then
we'll
pull
that
out
and
remove
it.
It
will
just
remove
we're
gonna
try
to
remove
this
whole
temper
expression
thing
so
yeah,
let's,
let's
try
that
out.
I
don't
have
oh,
no
someone's
been
chatting.
A
And
so
we
get
this
whole
object
from
it.
We're
gonna,
say:
hey
is
name
equal
to
rock,
let's
just
make
sure
we're
I'm
gonna
want
to
test
this
a
little
bit.
So,
let's
see,
if
we're
doing
the
right
thing,
and
maybe
we
can
call
just
for
fun,
we
can
call
replace
with
and
let's
just
see
what
happens
if
we
replace
it
with
a
new
identifier.
F
G
A
C
A
A
A
A
C
A
A
A
So
here
we
are
with
this
args
and
yeah.
We
have
this
members.
We
have
this
member
expression
here
here
we
are.
This
does
not
have
arms,
we're
just
gonna
pass
that
we
are.
It
looks
like
what
we're
gonna
do
is
promote
this
objects.
Member
expression,
it's
gonna,
be
our
callers,
whatever
our
parent
is.
We
need
to
replace
this
thing
with
the
object.
That's
the
cool
thing,
so
I
think
we
can
actually
kind
of
do
that
right
away.
A
A
That's
gonna,
give
us
the
right
number
expression,
but
then
what
we
want
to
replace
with
we
want
to
replace
with
X
dot,
node
dot
object.
We
want
to
get
rid
of
that
bit.
I
think
it's
all!
We
got
to
do
really
and
we
could
really
like
be
a
little
bit
more
explicit
here
with
which
one
were
actually
to
make
sure
we're
not
catching
something
that
we
should
be
catching,
but
I
think
this
is
the
heart
of
what
we
want
to
do.
So,
let's
see
what
happens
there?
Oh
it
doesn't
like
optional
chain
ooh.
C
C
A
So
I
want
to
make
sure
that
if
I
look
into
my,
if
I
look
into
my
member
expression,
I
want
to
make
sure
that
the
object
has
identifier
MOC
and
has
identifier
calls,
and
that
would
be
great,
all
right,
pretty
sure.
There's
a
way
to
like,
oh
and
I
think
we
can
do
this.
Let's
listen
all
right
check
the
ancestry
of
it
somehow
well,
I
think
we
can
use
find
I
think
what
I
can
use
find
on
on
this.
So
let's,
let's
try
that
out.
A
That's
what
I
was
when
I
first
did
this
some
months
ago,
I
really
liked
J's
code
chips
API
way
over
just
using
raw
Babel.
You
can't
use
raw
babbles
for
this,
but
if
there's
a
lot
more
easier
to
understand,
let's
do
something
like
this:
let's
say:
does
it
it
has
a
mock
and
I
think
we
could
say
X
dot
find-
and
this
isn't
gonna
be
perfect
because
it
could
be
looking
like
inside
of
a
call
expression
inside
of
that
or
whatever,
but
it's
some
sort
of
carry
some
sort.
It's.
A
A
E
A
Bet
it's
not!
No,
it
has
to
be
cuz
we're.
No,
it's
not
a
node.
It's
like
a
like
a
wrapper
thing
closest
is
cool.
Let's
try
this
out,
I
wonder
if
I
wrap
this
in
using
J
a
wonderfully
lets
me
do
that
Jake
waste,
oh
yeah,
yeah
yep,
and
that's
it's
jQuery
styles,
that's
so
I
guess
this
creates
the
help
helper
wrapper
that,
oh
that's
what
must
mean
when
it
says
like
extensions
here.
This
gives
me
some
of
those
extension
stuffs.
We
do
yeah,
which
is
really
nice.
I
could
look
up.
A
A
E
A
A
A
A
A
C
F
C
D
C
A
I
wish
there's
there's
a
whole
untapped.
What's
slightly
tapped,
but
I
think
there's
a
lot
of
improvements
we
can
do
in
the
industry
to
like
help
with
ast,
parsing
and
stuff.
How
cool
would
it
be
to
something
I've
been
dreaming
up
would
be
if
I
can
hit
record,
make
a
change
I'm
like
a
specific
thing,
and
then
it
can
bike
and
out
and
do
what
was
the
actual
ast.